From 61532e8aad0608918cce8375e9409d848215305e Mon Sep 17 00:00:00 2001 From: Konrad Listwan-Ciesielski Date: Mon, 7 Aug 2023 08:21:14 +0700 Subject: [PATCH 001/155] Add `DTZ003` and `DTZ004` docs (#6223) Changes: - Fixes typo and repeated phrase in `DTZ002` - Adds docs for `DTZ003` - Adds docs for `DTZ004` - Adds example for <=Python3.10 in `DTZ001` Related to: https://github.com/astral-sh/ruff/issues/2646 --- .../rules/call_datetime_today.rs | 5 +- .../rules/call_datetime_utcfromtimestamp.rs | 46 +++++++++++++++---- .../rules/call_datetime_utcnow.rs | 44 ++++++++++++++---- .../rules/call_datetime_without_tzinfo.rs | 7 +++ 4 files changed, 82 insertions(+), 20 deletions(-) diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_today.rs b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_today.rs index 97db9e874c..d1b89c794d 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_today.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_today.rs @@ -18,9 +18,8 @@ use super::helpers; /// `datetime` objects are preferred, as they represent a specific moment in /// time, unlike "naive" objects. /// -/// `datetime.datetime.today()` crates a "naive" object; instead, use -/// instead, use `datetime.datetime.now(tz=)` to create a timezone-aware -/// object. +/// `datetime.datetime.today()` creates a "naive" object; instead, use +/// `datetime.datetime.now(tz=)` to create a timezone-aware object. /// /// ## Example /// ```python diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs index 6c060dd1bd..26536d3c5c 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs @@ -8,6 +8,43 @@ use crate::checkers::ast::Checker; use super::helpers; +/// ## What it does +/// Checks for usage of `datetime.datetime.utcfromtimestamp()`. +/// +/// ## Why is this bad? +/// Python datetime objects can be naive or timezone-aware. While an aware +/// object represents a specific moment in time, a naive object does not +/// contain enough information to unambiguously locate itself relative to other +/// datetime objects. Since this can lead to errors, it is recommended to +/// always use timezone-aware objects. +/// +/// `datetime.datetime.utcfromtimestamp()` returns a naive datetime object; +/// instead, use `datetime.datetime.fromtimestamp(ts, tz=)` to return a +/// timezone-aware object. +/// +/// ## Example +/// ```python +/// import datetime +/// +/// datetime.datetime.utcfromtimestamp() +/// ``` +/// +/// Use instead: +/// ```python +/// import datetime +/// +/// datetime.datetime.fromtimestamp(946684800, tz=datetime.timezone.utc) +/// ``` +/// +/// Or, for Python 3.11 and later: +/// ```python +/// import datetime +/// +/// datetime.datetime.fromtimestamp(946684800, tz=datetime.UTC) +/// ``` +/// +/// ## References +/// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[violation] pub struct CallDatetimeUtcfromtimestamp; @@ -21,15 +58,6 @@ impl Violation for CallDatetimeUtcfromtimestamp { } } -/// Checks for `datetime.datetime.utcfromtimestamp()`. (DTZ004) -/// -/// ## Why is this bad? -/// -/// Because naive `datetime` objects are treated by many `datetime` methods as -/// local times, it is preferred to use aware datetimes to represent times in -/// UTC. As such, the recommended way to create an object representing a -/// specific timestamp in UTC is by calling `datetime.fromtimestamp(timestamp, -/// tz=timezone.utc)`. pub(crate) fn call_datetime_utcfromtimestamp( checker: &mut Checker, func: &Expr, diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs index 0ea5136b7f..e9ff0dd363 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs @@ -8,6 +8,42 @@ use crate::checkers::ast::Checker; use super::helpers; +/// ## What it does +/// Checks for usage of `datetime.datetime.utcnow()`. +/// +/// ## Why is this bad? +/// Python datetime objects can be naive or timezone-aware. While an aware +/// object represents a specific moment in time, a naive object does not +/// contain enough information to unambiguously locate itself relative to other +/// datetime objects. Since this can lead to errors, it is recommended to +/// always use timezone-aware objects. +/// +/// `datetime.datetime.utcnow()` returns a naive datetime object; instead, use +/// `datetime.datetime.now(tz=)` to return a timezone-aware object. +/// +/// ## Example +/// ```python +/// import datetime +/// +/// datetime.datetime.utcnow() +/// ``` +/// +/// Use instead: +/// ```python +/// import datetime +/// +/// datetime.datetime.now(tz=datetime.timezone.utc) +/// ``` +/// +/// Or, for Python 3.11 and later: +/// ```python +/// import datetime +/// +/// datetime.datetime.now(tz=datetime.UTC) +/// ``` +/// +/// ## References +/// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[violation] pub struct CallDatetimeUtcnow; @@ -21,14 +57,6 @@ impl Violation for CallDatetimeUtcnow { } } -/// Checks for `datetime.datetime.today()`. (DTZ003) -/// -/// ## Why is this bad? -/// -/// Because naive `datetime` objects are treated by many `datetime` methods as -/// local times, it is preferred to use aware datetimes to represent times in -/// UTC. As such, the recommended way to create an object representing the -/// current time in UTC is by calling `datetime.now(timezone.utc)`. pub(crate) fn call_datetime_utcnow(checker: &mut Checker, func: &Expr, location: TextRange) { if !checker .semantic() diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs index 0c0f6b36f4..cc0cb486a2 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs @@ -31,6 +31,13 @@ use super::helpers; /// ```python /// import datetime /// +/// datetime.datetime(2000, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc) +/// ``` +/// +/// Or, for Python 3.11 and later: +/// ```python +/// import datetime +/// /// datetime.datetime(2000, 1, 1, 0, 0, 0, tzinfo=datetime.UTC) /// ``` #[violation] From 9c3fbcdf4a0b0c656e0a95573c778eb94cf0f0d2 Mon Sep 17 00:00:00 2001 From: Harutaka Kawamura Date: Mon, 7 Aug 2023 10:28:24 +0900 Subject: [PATCH 002/155] Add `PT011` and `PT012` docs (#6362) --- .../rules/flake8_pytest_style/rules/raises.rs | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs index dae4157ab7..c8c824648b 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs @@ -11,6 +11,35 @@ use crate::registry::Rule; use super::helpers::is_empty_or_null_string; +/// ## What it does +/// Checks for `pytest.raises` context managers with multiple statements. +/// +/// ## Why is this bad? +/// When a `pytest.raises` is used as a context manager and contains multiple +/// statements, it can lead to the test passing when it actually should fail. +/// To avoid this, a `pytest.raises` context manager should only contain +/// a single simple statement that raises the expected exception. +/// +/// ## Example +/// ```python +/// def test_foo(): +/// with pytest.raises(MyError): +/// setup() # may raise `MyError` +/// func_to_test() +/// assert foo() # not executed +/// ``` +/// +/// Use instead: +/// ```python +/// def test_foo(): +/// setup() +/// with pytest.raises(MyException): +/// func_to_test() +/// assert foo() +/// ``` +/// +/// ## References +/// - [`pytest` documentation: `pytest.raises`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-raises) #[violation] pub struct PytestRaisesWithMultipleStatements; @@ -21,6 +50,41 @@ impl Violation for PytestRaisesWithMultipleStatements { } } +/// ## What it does +/// Checks for `pytest.raises` calls without a `match` parameter. +/// +/// ## Why is this bad? +/// `pytest.raises(Error)` will catch any `Error` and may catch errors that are +/// unrelated to the code under test. To avoid this, `pytest.raises` should be +/// called with a `match` parameter. The exception names that require a `match` +/// parameter can be configured via the +/// `flake8-pytest-style.raises-require-match-for` and +/// `flake8-pytest-style.raises-extend-require-match-for` settings. +/// +/// ## Example +/// ```python +/// def test_foo(): +/// with pytest.raises(ValueError): +/// ... +/// +/// # empty string is also an error +/// with pytest.raises(ValueError, match=""): +/// ... +/// ``` +/// +/// Use instead: +/// ```python +/// def test_foo(): +/// with pytest.raises(ValueError, match="expected message"): +/// ... +/// ``` +/// +/// ## Options +/// - `flake8-pytest-style.raises-require-match-for` +/// - `flake8-pytest-style.raises-extend-require-match-for` +/// +/// ## References +/// - [`pytest` documentation: `pytest.raises`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-raises) #[violation] pub struct PytestRaisesTooBroad { exception: String, From 5d2a4ebc99ba2459da5f7b208abb11ba8e533ae5 Mon Sep 17 00:00:00 2001 From: Tom Kuson Date: Mon, 7 Aug 2023 04:48:36 +0100 Subject: [PATCH 003/155] Add documentation to `subprocess-with[out]-shell-equals-true` rules (#6373) --- .../flake8_bandit/rules/shell_injection.rs | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/crates/ruff/src/rules/flake8_bandit/rules/shell_injection.rs b/crates/ruff/src/rules/flake8_bandit/rules/shell_injection.rs index 2b5715d18d..93e6c0c27e 100644 --- a/crates/ruff/src/rules/flake8_bandit/rules/shell_injection.rs +++ b/crates/ruff/src/rules/flake8_bandit/rules/shell_injection.rs @@ -10,6 +10,31 @@ use crate::{ checkers::ast::Checker, registry::Rule, rules::flake8_bandit::helpers::string_literal, }; +/// ## What it does +/// Check for method calls that initiate a subprocess with a shell. +/// +/// ## Why is this bad? +/// Starting a subprocess with a shell can allow attackers to execute arbitrary +/// shell commands. Consider starting the process without a shell call and +/// sanitize the input to mitigate the risk of shell injection. +/// +/// ## Example +/// ```python +/// import subprocess +/// +/// subprocess.run("ls -l", shell=True) +/// ``` +/// +/// Use instead: +/// ```python +/// import subprocess +/// +/// subprocess.run(["ls", "-l"]) +/// ``` +/// +/// ## References +/// - [Python documentation: `subprocess` — Subprocess management](https://docs.python.org/3/library/subprocess.html) +/// - [Common Weakness Enumeration: CWE-78](https://cwe.mitre.org/data/definitions/78.html) #[violation] pub struct SubprocessPopenWithShellEqualsTrue { seems_safe: bool, @@ -28,6 +53,30 @@ impl Violation for SubprocessPopenWithShellEqualsTrue { } } +/// ## What it does +/// Check for method calls that initiate a subprocess without a shell. +/// +/// ## Why is this bad? +/// Starting a subprocess without a shell can prevent attackers from executing +/// arbitrary shell commands; however, it is still error-prone. Consider +/// validating the input. +/// +/// ## Known problems +/// Prone to false positives as it is difficult to determine whether the +/// passed arguments have been validated ([#4045]). +/// +/// ## Example +/// ```python +/// import subprocess +/// +/// cmd = input("Enter a command: ").split() +/// subprocess.run(cmd) +/// ``` +/// +/// ## References +/// - [Python documentation: `subprocess` — Subprocess management](https://docs.python.org/3/library/subprocess.html) +/// +/// [#4045]: https://github.com/astral-sh/ruff/issues/4045 #[violation] pub struct SubprocessWithoutShellEqualsTrue; From 89e4e038b02df1582f07485f62f5bd0cb0ae6cc8 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 09:42:04 -0400 Subject: [PATCH 004/155] Store expression hierarchy in semantic model snapshots (#6345) ## Summary When we iterate over the AST for analysis, we often process nodes in a "deferred" manner. For example, if we're analyzing a function, we push the function body onto a deferred stack, along with a snapshot of the current semantic model state. Later, when we analyze the body, we restore the semantic model state from the snapshot. This ensures that we know the correct scope, hierarchy of statement parents, etc., when we go to analyze the function body. Historically, we _haven't_ included the _expression_ hierarchy in the model snapshot -- so we track the current expression parents in the visitor, but we never save and restore them when processing deferred nodes. This can lead to subtle bugs, in that methods like `expr_parent()` aren't guaranteed to be correct, if you're in a deferred visitor. This PR migrates expression tracking to mirror statement tracking exactly. So we push all expressions onto an `IndexVec`, and include the current expression on the snapshot. This ensures that `expr_parent()` and related methods are "always correct" rather than "sometimes correct". There's a performance cost here, both at runtime and in terms of memory consumption (we now store an additional pointer for every expression). In my hyperfine testing, it's about a 1% performance decrease for all-rules on CPython (up to 533.8ms, from 528.3ms) and a 4% performance decrease for default-rules on CPython (up to 212ms, from 204ms). However... I think this is worth it given the incorrectness of our current approach. In the future, we may want to reconsider how we do these upward traversals (e.g., with something like a red-green tree). (**Note**: in https://github.com/astral-sh/ruff/pull/6351, the slowdown seems to be entirely removed.) --- crates/ruff/src/checkers/ast/mod.rs | 6 +-- .../flake8_pytest_style/rules/assertion.rs | 1 - .../pandas_vet/rules/inplace_argument.rs | 5 -- .../pylint/rules/compare_to_empty_string.rs | 2 +- crates/ruff_python_semantic/src/model.rs | 47 +++++++++++++------ 5 files changed, 34 insertions(+), 27 deletions(-) diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs index 6f02558e14..778d8fe81f 100644 --- a/crates/ruff/src/checkers/ast/mod.rs +++ b/crates/ruff/src/checkers/ast/mod.rs @@ -1696,11 +1696,7 @@ impl<'a> Checker<'a> { return; } - if self - .semantic - .expr_ancestors() - .any(|expr| expr.is_named_expr_expr()) - { + if self.semantic.expr_ancestors().any(Expr::is_named_expr_expr) { self.add_binding( id, expr.range(), diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs index dd60425922..d12e1e6d28 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs @@ -248,7 +248,6 @@ pub(crate) fn unittest_assertion( // the assertion is part of a larger expression. if checker.semantic().stmt().is_expr_stmt() && checker.semantic().expr_parent().is_none() - && !checker.semantic().scope().kind.is_lambda() && !checker.indexer().comment_ranges().intersects(expr.range()) { if let Ok(stmt) = unittest_assert.generate_assert(args, keywords) { diff --git a/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs b/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs index 67f27c51f7..2282ede228 100644 --- a/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs +++ b/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs @@ -84,14 +84,9 @@ pub(crate) fn inplace_argument(checker: &mut Checker, call: &ast::ExprCall) { // the star argument _doesn't_ contain an override). // 2. The call is part of a larger expression (we're converting an expression to a // statement, and expressions can't contain statements). - // 3. The call is in a lambda (we can't assign to a variable in a lambda). This - // should be unnecessary, as lambdas are expressions, and so (2) should apply, - // but we don't currently restore expression stacks when parsing deferred nodes, - // and so the parent is lost. if !seen_star && checker.semantic().stmt().is_expr_stmt() && checker.semantic().expr_parent().is_none() - && !checker.semantic().scope().kind.is_lambda() { if let Some(fix) = convert_inplace_argument_to_assignment( call, diff --git a/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs b/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs index f784489f60..bb2c4d9049 100644 --- a/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs +++ b/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs @@ -68,7 +68,7 @@ pub(crate) fn compare_to_empty_string( if checker .semantic() .expr_ancestors() - .any(|parent| parent.is_subscript_expr()) + .any(Expr::is_subscript_expr) { return; } diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index bede85c5fd..e66e1c211e 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -36,8 +36,11 @@ pub struct SemanticModel<'a> { /// The identifier of the current statement. stmt_id: Option, - /// Stack of current expressions. - exprs: Vec<&'a Expr>, + /// Stack of all visited expressions. + exprs: Nodes<'a, Expr>, + + /// The identifier of the current expression. + expr_id: Option, /// Stack of all scopes, along with the identifier of the current scope. pub scopes: Scopes<'a>, @@ -131,7 +134,8 @@ impl<'a> SemanticModel<'a> { module_path: module.path(), stmts: Nodes::::default(), stmt_id: None, - exprs: Vec::default(), + exprs: Nodes::::default(), + expr_id: None, scopes: Scopes::default(), scope_id: ScopeId::global(), definitions: Definitions::for_module(module), @@ -769,16 +773,15 @@ impl<'a> SemanticModel<'a> { self.stmt_id = self.stmts.parent_id(node_id); } - /// Push an [`Expr`] onto the stack. + /// Push a [`Expr`] onto the stack. pub fn push_expr(&mut self, expr: &'a Expr) { - self.exprs.push(expr); + self.expr_id = Some(self.exprs.insert(expr, self.expr_id)); } /// Pop the current [`Expr`] off the stack. pub fn pop_expr(&mut self) { - self.exprs - .pop() - .expect("Attempted to pop without expression"); + let node_id = self.expr_id.expect("Attempted to pop without expression"); + self.expr_id = self.exprs.parent_id(node_id); } /// Push a [`Scope`] with the given [`ScopeKind`] onto the stack. @@ -822,22 +825,32 @@ impl<'a> SemanticModel<'a> { /// Return the current `Expr`. pub fn expr(&self) -> Option<&'a Expr> { - self.exprs.iter().last().copied() + let node_id = self.expr_id?; + Some(self.exprs[node_id]) } - /// Return the parent `Expr` of the current `Expr`. + /// Return the parent `Expr` of the current `Expr`, if any. pub fn expr_parent(&self) -> Option<&'a Expr> { - self.exprs.iter().rev().nth(1).copied() + self.expr_ancestors().next() } - /// Return the grandparent `Expr` of the current `Expr`. + /// Return the grandparent `Expr` of the current `Expr`, if any. pub fn expr_grandparent(&self) -> Option<&'a Expr> { - self.exprs.iter().rev().nth(2).copied() + self.expr_ancestors().nth(1) } /// Return an [`Iterator`] over the current `Expr` parents. - pub fn expr_ancestors(&self) -> impl Iterator { - self.exprs.iter().rev().skip(1) + pub fn expr_ancestors(&self) -> impl Iterator + '_ { + self.expr_id + .iter() + .copied() + .flat_map(|id| { + self.exprs + .ancestor_ids(id) + .skip(1) + .map(|id| &self.exprs[id]) + }) + .copied() } /// Returns a reference to the global scope @@ -1036,6 +1049,7 @@ impl<'a> SemanticModel<'a> { Snapshot { scope_id: self.scope_id, stmt_id: self.stmt_id, + expr_id: self.expr_id, definition_id: self.definition_id, flags: self.flags, } @@ -1046,11 +1060,13 @@ impl<'a> SemanticModel<'a> { let Snapshot { scope_id, stmt_id, + expr_id, definition_id, flags, } = snapshot; self.scope_id = scope_id; self.stmt_id = stmt_id; + self.expr_id = expr_id; self.definition_id = definition_id; self.flags = flags; } @@ -1464,6 +1480,7 @@ impl SemanticModelFlags { pub struct Snapshot { scope_id: ScopeId, stmt_id: Option, + expr_id: Option, definition_id: DefinitionId, flags: SemanticModelFlags, } From 63692b379828e194a9cab01f36095c902bd93872 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 09:43:57 -0400 Subject: [PATCH 005/155] Use `parenthesized_with_dangling_comments` in arguments formatter (#6376) ## Summary Fixes an instability whereby this: ```python def get_recent_deployments(threshold_days: int) -> Set[str]: # Returns a list of deployments not older than threshold days # including `/root/zulip` directory if it exists. recent = set() threshold_date = datetime.datetime.now() - datetime.timedelta( # noqa: DTZ005 days=threshold_days ) ``` Was being formatted as: ```python def get_recent_deployments(threshold_days: int) -> Set[str]: # Returns a list of deployments not older than threshold days # including `/root/zulip` directory if it exists. recent = set() threshold_date = ( datetime.datetime.now() - datetime.timedelta(days=threshold_days) # noqa: DTZ005 ) ``` Which was in turn being formatted as: ```python def get_recent_deployments(threshold_days: int) -> Set[str]: # Returns a list of deployments not older than threshold days # including `/root/zulip` directory if it exists. recent = set() threshold_date = ( datetime.datetime.now() - datetime.timedelta(days=threshold_days) # noqa: DTZ005 ) ``` The second-to-third formattings still differs from Black because we aren't taking the line suffix into account when splitting (https://github.com/astral-sh/ruff/issues/6377), but the first formatting is correct and should be unchanged (i.e., the first-to-second formattings is incorrect, and fixed here). ## Test Plan `cargo run --bin ruff_dev -- format-dev --stability-check ../zulip` --- .../test/fixtures/ruff/expression/call.py | 4 +++ .../src/other/arguments.rs | 33 ++++++++++--------- .../snapshots/format@expression__call.py.snap | 8 +++++ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py index a158a2ec4d..82166ba564 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py @@ -111,3 +111,7 @@ f ( 1 # abc ) + +threshold_date = datetime.datetime.now() - datetime.timedelta( # comment + days=threshold_days_threshold_days +) diff --git a/crates/ruff_python_formatter/src/other/arguments.rs b/crates/ruff_python_formatter/src/other/arguments.rs index e99c31807c..05dfa5e347 100644 --- a/crates/ruff_python_formatter/src/other/arguments.rs +++ b/crates/ruff_python_formatter/src/other/arguments.rs @@ -5,9 +5,8 @@ use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer}; use ruff_text_size::{TextRange, TextSize}; use crate::builders::empty_parenthesized_with_dangling_comments; -use crate::comments::trailing_comments; use crate::expression::expr_generator_exp::GeneratorExpParentheses; -use crate::expression::parentheses::{parenthesized, Parentheses}; +use crate::expression::parentheses::{parenthesized_with_dangling_comments, Parentheses}; use crate::prelude::*; use crate::FormatNodeRule; @@ -35,18 +34,6 @@ impl FormatNodeRule for FormatArguments { ); } - // If the arguments are non-empty, then a dangling comment indicates a comment on the - // same line as the opening parenthesis, e.g.: - // ```python - // f( # This call has a dangling comment. - // a, - // b, - // c, - // ) - let comments = f.context().comments().clone(); - let dangling_comments = comments.dangling_comments(item.as_any_node_ref()); - write!(f, [trailing_comments(dangling_comments)])?; - let all_arguments = format_with(|f: &mut PyFormatter| { let source = f.context().source(); let mut joiner = f.join_comma_separated(item.end()); @@ -84,6 +71,17 @@ impl FormatNodeRule for FormatArguments { joiner.finish() }); + // If the arguments are non-empty, then a dangling comment indicates a comment on the + // same line as the opening parenthesis, e.g.: + // ```python + // f( # This call has a dangling comment. + // a, + // b, + // c, + // ) + let comments = f.context().comments().clone(); + let dangling_comments = comments.dangling_comments(item.as_any_node_ref()); + write!( f, [ @@ -103,7 +101,12 @@ impl FormatNodeRule for FormatArguments { // ) // ``` // TODO(konstin): Doesn't work see wrongly formatted test - parenthesized("(", &group(&all_arguments), ")") + parenthesized_with_dangling_comments( + "(", + dangling_comments, + &group(&all_arguments), + ")" + ) ] ) } diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap index 8120fdd4d8..45bcc8a76a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap @@ -117,6 +117,10 @@ f ( 1 # abc ) + +threshold_date = datetime.datetime.now() - datetime.timedelta( # comment + days=threshold_days_threshold_days +) ``` ## Output @@ -230,6 +234,10 @@ f( 1 # abc ) + +threshold_date = datetime.datetime.now() - datetime.timedelta( # comment + days=threshold_days_threshold_days +) ``` From b7639733573d824cab41eeaaa568e02a93579173 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 10:15:32 -0400 Subject: [PATCH 006/155] Avoid hard line break after dangling open-parenthesis comments (#6380) ## Summary Given: ```python [ # comment first, second, third ] # another comment ``` We were adding a hard line break as part of the formatting of `# comment`, which led to the following formatting: ```python [first, second, third] # comment # another comment ``` Closes https://github.com/astral-sh/ruff/issues/6367. --- .../test/fixtures/ruff/expression/list.py | 6 +++ .../src/comments/format.rs | 51 +++++++++++++++++++ .../ruff_python_formatter/src/comments/mod.rs | 5 +- .../src/expression/parentheses.rs | 11 ++-- ...onsecutive_open_parentheses_ignore.py.snap | 19 +++---- .../snapshots/format@expression__list.py.snap | 8 +++ 6 files changed, 82 insertions(+), 18 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/list.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/list.py index 4478fc6e22..432885abd2 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/list.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/list.py @@ -44,3 +44,9 @@ c1 = [ # trailing open bracket [ # end-of-line comment 1 ] + +[ # inner comment + first, + second, + third +] # outer comment diff --git a/crates/ruff_python_formatter/src/comments/format.rs b/crates/ruff_python_formatter/src/comments/format.rs index 3ac6cb68c8..29781c38a6 100644 --- a/crates/ruff_python_formatter/src/comments/format.rs +++ b/crates/ruff_python_formatter/src/comments/format.rs @@ -227,6 +227,57 @@ impl Format> for FormatDanglingComments<'_> { } } +/// Formats the dangling comments within a parenthesized expression, for example: +/// ```python +/// [ # comment +/// 1, +/// 2, +/// 3, +/// ] +/// ``` +pub(crate) fn dangling_open_parenthesis_comments( + comments: &[SourceComment], +) -> FormatDanglingOpenParenthesisComments { + FormatDanglingOpenParenthesisComments { comments } +} + +pub(crate) struct FormatDanglingOpenParenthesisComments<'a> { + comments: &'a [SourceComment], +} + +impl Format> for FormatDanglingOpenParenthesisComments<'_> { + fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { + let mut comments = self + .comments + .iter() + .filter(|comment| comment.is_unformatted()); + + if let Some(comment) = comments.next() { + debug_assert!( + comment.line_position().is_end_of_line(), + "Expected dangling comment to be at the end of the line" + ); + + write!( + f, + [line_suffix(&format_args![ + space(), + space(), + format_comment(comment) + ])] + )?; + comment.mark_formatted(); + + debug_assert!( + comments.next().is_none(), + "Expected at most one dangling comment" + ); + } + + Ok(()) + } +} + /// Formats the content of the passed comment. /// /// * Adds a whitespace between `#` and the comment text except if the first character is a `#`, `:`, `'`, or `!` diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs index 9cfb280e3d..141a7e2c3e 100644 --- a/crates/ruff_python_formatter/src/comments/mod.rs +++ b/crates/ruff_python_formatter/src/comments/mod.rs @@ -95,8 +95,9 @@ use std::rc::Rc; use ruff_python_ast::{Mod, Ranged}; pub(crate) use format::{ - dangling_comments, dangling_node_comments, leading_alternate_branch_comments, leading_comments, - leading_node_comments, trailing_comments, trailing_node_comments, + dangling_comments, dangling_node_comments, dangling_open_parenthesis_comments, + leading_alternate_branch_comments, leading_comments, leading_node_comments, trailing_comments, + trailing_node_comments, }; use ruff_formatter::{SourceCode, SourceCodeSlice}; use ruff_python_ast::node::AnyNodeRef; diff --git a/crates/ruff_python_formatter/src/expression/parentheses.rs b/crates/ruff_python_formatter/src/expression/parentheses.rs index 0a0a04a411..cc61902ce9 100644 --- a/crates/ruff_python_formatter/src/expression/parentheses.rs +++ b/crates/ruff_python_formatter/src/expression/parentheses.rs @@ -4,7 +4,7 @@ use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::Ranged; use ruff_python_trivia::{first_non_trivia_token, SimpleToken, SimpleTokenKind, SimpleTokenizer}; -use crate::comments::{dangling_comments, SourceComment}; +use crate::comments::{dangling_open_parenthesis_comments, SourceComment}; use crate::context::{NodeLevel, WithNodeLevel}; use crate::prelude::*; @@ -117,7 +117,7 @@ where } /// Formats `content` enclosed by the `left` and `right` parentheses, along with any dangling -/// comments that on the parentheses themselves. +/// comments on the opening parenthesis itself. pub(crate) fn parenthesized_with_dangling_comments<'content, 'ast, Content>( left: &'static str, comments: &'content [SourceComment], @@ -155,8 +155,8 @@ impl<'ast> Format> for FormatParenthesized<'_, 'ast> { } else { group(&format_args![ text(self.left), - &line_suffix(&dangling_comments(self.comments)), - &group(&soft_block_indent(&Arguments::from(&self.content))), + &dangling_open_parenthesis_comments(self.comments), + &soft_block_indent(&Arguments::from(&self.content)), text(self.right) ]) .fmt(f) @@ -319,10 +319,11 @@ impl<'ast> Format> for FormatInParenthesesOnlyGroup<'_, 'a #[cfg(test)] mod tests { - use crate::expression::parentheses::is_expression_parenthesized; use ruff_python_ast::node::AnyNodeRef; use ruff_python_parser::parse_expression; + use crate::expression::parentheses::is_expression_parenthesized; + #[test] fn test_has_parentheses() { let expression = r#"(b().c("")).d()"#; diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap index 8e1c160ff4..1c0ac7dd11 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap @@ -33,18 +33,19 @@ print( "111" ) # type: ignore ```diff --- Black +++ Ruff -@@ -1,10 +1,8 @@ +@@ -1,12 +1,6 @@ # This is a regression test. Issue #3737 -a = ( # type: ignore -+a = int( # type: ignore # type: ignore - int( # type: ignore +- int( # type: ignore - int( # type: ignore - int(6) # type: ignore - ) -+ int(6) # type: ignore - ) - ) +- ) +-) ++a = int(int(int(6))) # type: ignore # type: ignore # type: ignore # type: ignore + + b = int(6) ``` @@ -53,11 +54,7 @@ print( "111" ) # type: ignore ```py # This is a regression test. Issue #3737 -a = int( # type: ignore # type: ignore - int( # type: ignore - int(6) # type: ignore - ) -) +a = int(int(int(6))) # type: ignore # type: ignore # type: ignore # type: ignore b = int(6) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap index e94d3cf33f..04f9c816e3 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap @@ -50,6 +50,12 @@ c1 = [ # trailing open bracket [ # end-of-line comment 1 ] + +[ # inner comment + first, + second, + third +] # outer comment ``` ## Output @@ -94,6 +100,8 @@ c1 = [ # trailing open bracket ] [1] # end-of-line comment + +[first, second, third] # inner comment # outer comment ``` From bae87fa01633022f3313a88e8cce091afda32307 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 10:44:49 -0400 Subject: [PATCH 007/155] Rename semantic model methods to use `current_*` prefix (#6347) ## Summary This PR attempts to draw a clearer divide between "methods that take (e.g.) an expression or statement as input" and "methods that rely on the _current_ expression or statement" in the semantic model, by renaming methods like `stmt()` to `current_statement()`. This had led to confusion in the past. For example, prior to this PR, we had `scope()` (which returns the current scope), and `parent_scope`, which returns the parent _of a scope that's passed in_. Now, the API is clearer: `current_scope` returns the current scope, and `parent_scope` takes a scope as argument and returns its parent. Per above, I also changed `stmt` to `statement` and `expr` to `expression`. --- .../ast/analyze/deferred_for_loops.rs | 2 +- .../checkers/ast/analyze/deferred_scopes.rs | 14 +- .../src/checkers/ast/analyze/expression.rs | 25 +- .../src/checkers/ast/analyze/statement.rs | 24 +- crates/ruff/src/checkers/ast/mod.rs | 42 +-- .../rules/hardcoded_sql_expression.rs | 2 +- .../rules/cached_instance_method.rs | 2 +- .../rules/setattr_with_constant.rs | 2 +- .../rules/unused_loop_control_variable.rs | 2 +- .../call_datetime_strptime_without_zone.rs | 4 +- .../rules/flake8_datetimez/rules/helpers.rs | 2 +- .../flake8_pyi/rules/any_eq_ne_annotation.rs | 2 +- .../rules/custom_type_var_return_type.rs | 2 +- .../flake8_pyi/rules/non_self_return_type.rs | 2 +- .../rules/flake8_pyi/rules/simple_defaults.rs | 8 +- .../rules/str_or_repr_defined_in_stub.rs | 9 +- .../rules/string_or_bytes_too_long.rs | 2 +- .../rules/unused_private_type_definition.rs | 9 +- .../flake8_pytest_style/rules/assertion.rs | 4 +- .../rules/private_member_access.rs | 2 +- .../flake8_simplify/rules/ast_unary_op.rs | 8 +- .../rules/open_file_with_context_handler.rs | 10 +- .../rules/reimplemented_builtin.rs | 4 +- .../src/rules/flake8_type_checking/helpers.rs | 4 +- .../rules/empty_type_checking_block.rs | 4 +- .../runtime_import_in_type_checking_block.rs | 23 +- .../rules/typing_only_runtime_import.rs | 20 +- .../ruff/src/rules/pandas_vet/rules/attr.rs | 2 +- .../pandas_vet/rules/inplace_argument.rs | 4 +- .../mixed_case_variable_in_class_scope.rs | 2 +- .../mixed_case_variable_in_global_scope.rs | 2 +- .../non_lowercase_variable_in_function.rs | 2 +- .../perflint/rules/incorrect_dict_iterator.rs | 2 +- .../perflint/rules/unnecessary_list_cast.rs | 4 +- .../pycodestyle/rules/lambda_assignment.rs | 4 +- .../pyflakes/rules/return_outside_function.rs | 2 +- .../src/rules/pyflakes/rules/unused_import.rs | 18 +- .../rules/pyflakes/rules/unused_variable.rs | 4 +- .../pyflakes/rules/yield_outside_function.rs | 2 +- crates/ruff/src/rules/pylint/helpers.rs | 2 +- .../pylint/rules/compare_to_empty_string.rs | 2 +- .../rules/pylint/rules/invalid_str_return.rs | 2 +- .../pylint/rules/self_assigning_variable.rs | 2 +- .../unexpected_special_method_signature.rs | 2 +- .../rules/yield_from_in_async_function.rs | 2 +- .../rules/pyupgrade/rules/native_literals.rs | 2 +- .../pyupgrade/rules/outdated_version_block.rs | 4 +- .../rules/super_call_with_parameters.rs | 4 +- .../rules/unnecessary_builtin_import.rs | 6 +- .../rules/unnecessary_future_import.rs | 6 +- .../pyupgrade/rules/useless_metaclass_type.rs | 4 +- .../rules/collection_literal_concatenation.rs | 2 +- crates/ruff_python_semantic/src/binding.rs | 2 +- crates/ruff_python_semantic/src/model.rs | 297 +++++++++--------- 54 files changed, 331 insertions(+), 290 deletions(-) diff --git a/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs b/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs index ebacfc4778..c9ed5be35d 100644 --- a/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs +++ b/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs @@ -16,7 +16,7 @@ pub(crate) fn deferred_for_loops(checker: &mut Checker) { }) | Stmt::AsyncFor(ast::StmtAsyncFor { target, iter, body, .. - }) = &checker.semantic.stmt() + }) = &checker.semantic.current_statement() { if checker.enabled(Rule::UnusedLoopControlVariable) { flake8_bugbear::rules::unused_loop_control_variable(checker, target, body); diff --git a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs index ac7e675492..b9c6e56601 100644 --- a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs +++ b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs @@ -112,7 +112,11 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { // If the bindings are in different forks, abort. if shadowed.source.map_or(true, |left| { binding.source.map_or(true, |right| { - branch_detection::different_forks(left, right, &checker.semantic.stmts) + branch_detection::different_forks( + left, + right, + &checker.semantic.statements, + ) }) }) { continue; @@ -172,7 +176,7 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { if shadowed.kind.is_function_definition() && visibility::is_overload( cast::decorator_list( - checker.semantic.stmts[shadowed.source.unwrap()], + checker.semantic.statements[shadowed.source.unwrap()], ), &checker.semantic, ) @@ -195,7 +199,11 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { // If the bindings are in different forks, abort. if shadowed.source.map_or(true, |left| { binding.source.map_or(true, |right| { - branch_detection::different_forks(left, right, &checker.semantic.stmts) + branch_detection::different_forks( + left, + right, + &checker.semantic.statements, + ) }) }) { continue; diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index 2b462698ef..6398e14e87 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -84,7 +84,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { // traverse nested unions. let is_unchecked_union = checker .semantic - .expr_grandparent() + .current_expression_grandparent() .and_then(Expr::as_subscript_expr) .map_or(true, |parent| { !checker.semantic.match_typing_expr(&parent.value, "Union") @@ -206,11 +206,16 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { } ExprContext::Store => { if checker.enabled(Rule::NonLowercaseVariableInFunction) { - if checker.semantic.scope().kind.is_any_function() { + if checker.semantic.current_scope().kind.is_any_function() { // Ignore globals. - if !checker.semantic.scope().get(id).is_some_and(|binding_id| { - checker.semantic.binding(binding_id).is_global() - }) { + if !checker + .semantic + .current_scope() + .get(id) + .is_some_and(|binding_id| { + checker.semantic.binding(binding_id).is_global() + }) + { pep8_naming::rules::non_lowercase_variable_in_function( checker, expr, id, ); @@ -219,7 +224,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { } if checker.enabled(Rule::MixedCaseVariableInClassScope) { if let ScopeKind::Class(ast::StmtClassDef { arguments, .. }) = - &checker.semantic.scope().kind + &checker.semantic.current_scope().kind { pep8_naming::rules::mixed_case_variable_in_class_scope( checker, @@ -230,7 +235,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { } } if checker.enabled(Rule::MixedCaseVariableInGlobalScope) { - if matches!(checker.semantic.scope().kind, ScopeKind::Module) { + if matches!(checker.semantic.current_scope().kind, ScopeKind::Module) { pep8_naming::rules::mixed_case_variable_in_global_scope( checker, expr, id, ); @@ -243,7 +248,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { checker.diagnostics.push(diagnostic); } } - if let ScopeKind::Class(class_def) = checker.semantic.scope().kind { + if let ScopeKind::Class(class_def) = checker.semantic.current_scope().kind { if checker.enabled(Rule::BuiltinAttributeShadowing) { flake8_builtins::rules::builtin_attribute_shadowing( checker, class_def, id, *range, @@ -668,7 +673,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { flake8_comprehensions::rules::unnecessary_map( checker, expr, - checker.semantic.expr_parent(), + checker.semantic.current_expression_parent(), func, args, ); @@ -1082,7 +1087,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { // Avoid duplicate checks if the parent is an `|` since these rules // traverse nested unions. let is_unchecked_union = !matches!( - checker.semantic.expr_parent(), + checker.semantic.current_expression_parent(), Some(Expr::BinOp(ast::ExprBinOp { op: Operator::BitOr, .. diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index cbdbff9f5a..eee23db997 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -53,7 +53,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.enabled(Rule::BreakOutsideLoop) { if let Some(diagnostic) = pyflakes::rules::break_outside_loop( stmt, - &mut checker.semantic.parents().skip(1), + &mut checker.semantic.current_statements().skip(1), ) { checker.diagnostics.push(diagnostic); } @@ -63,7 +63,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.enabled(Rule::ContinueOutsideLoop) { if let Some(diagnostic) = pyflakes::rules::continue_outside_loop( stmt, - &mut checker.semantic.parents().skip(1), + &mut checker.semantic.current_statements().skip(1), ) { checker.diagnostics.push(diagnostic); } @@ -113,7 +113,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if let Some(diagnostic) = pep8_naming::rules::invalid_first_argument_name_for_class_method( checker, - checker.semantic.scope(), + checker.semantic.current_scope(), name, decorator_list, parameters, @@ -125,7 +125,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.enabled(Rule::InvalidFirstArgumentNameForMethod) { if let Some(diagnostic) = pep8_naming::rules::invalid_first_argument_name_for_method( checker, - checker.semantic.scope(), + checker.semantic.current_scope(), name, decorator_list, parameters, @@ -193,7 +193,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } if checker.enabled(Rule::DunderFunctionName) { if let Some(diagnostic) = pep8_naming::rules::dunder_function_name( - checker.semantic.scope(), + checker.semantic.current_scope(), stmt, name, &checker.settings.pep8_naming.ignore_names, @@ -348,7 +348,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.enabled(Rule::YieldInForLoop) { pyupgrade::rules::yield_in_for_loop(checker, stmt); } - if let ScopeKind::Class(class_def) = checker.semantic.scope().kind { + if let ScopeKind::Class(class_def) = checker.semantic.current_scope().kind { if checker.enabled(Rule::BuiltinAttributeShadowing) { flake8_builtins::rules::builtin_method_shadowing( checker, @@ -766,7 +766,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } } else if &alias.name == "*" { if checker.enabled(Rule::UndefinedLocalWithNestedImportStarUsage) { - if !matches!(checker.semantic.scope().kind, ScopeKind::Module) { + if !matches!(checker.semantic.current_scope().kind, ScopeKind::Module) { checker.diagnostics.push(Diagnostic::new( pyflakes::rules::UndefinedLocalWithNestedImportStarUsage { name: helpers::format_import_from(level, module), @@ -982,7 +982,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { flake8_simplify::rules::nested_if_statements( checker, if_, - checker.semantic.stmt_parent(), + checker.semantic.current_statement_parent(), ); } if checker.enabled(Rule::IfWithSameArms) { @@ -1004,7 +1004,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { tryceratops::rules::type_check_without_type_error( checker, if_, - checker.semantic.stmt_parent(), + checker.semantic.current_statement_parent(), ); } if checker.enabled(Rule::OutdatedVersionBlock) { @@ -1110,7 +1110,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { checker, stmt, body, - checker.semantic.stmt_parent(), + checker.semantic.current_statement_parent(), ); } if checker.enabled(Rule::RedefinedLoopName) { @@ -1338,7 +1338,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { // Ignore assignments in function bodies; those are covered by other rules. if !checker .semantic - .scopes() + .current_scopes() .any(|scope| scope.kind.is_any_function()) { if checker.enabled(Rule::UnprefixedTypeParam) { @@ -1403,7 +1403,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { // Ignore assignments in function bodies; those are covered by other rules. if !checker .semantic - .scopes() + .current_scopes() .any(|scope| scope.kind.is_any_function()) { flake8_pyi::rules::annotated_assignment_default_in_stub( diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs index 778d8fe81f..e604047ccf 100644 --- a/crates/ruff/src/checkers/ast/mod.rs +++ b/crates/ruff/src/checkers/ast/mod.rs @@ -182,7 +182,7 @@ impl<'a> Checker<'a> { } // Find the quote character used to start the containing f-string. - let expr = model.expr()?; + let expr = model.current_expression()?; let string_range = self.indexer.f_string_range(expr.start())?; let trailing_quote = trailing_quote(self.locator.slice(string_range))?; @@ -202,7 +202,7 @@ impl<'a> Checker<'a> { /// thus be applied whenever we delete a statement, but can otherwise be omitted. pub(crate) fn isolation(&self, parent: Option<&Stmt>) -> IsolationLevel { parent - .and_then(|stmt| self.semantic.stmts.node_id(stmt)) + .and_then(|stmt| self.semantic.statements.node_id(stmt)) .map_or(IsolationLevel::default(), |node_id| { IsolationLevel::Group(node_id.into()) }) @@ -264,7 +264,7 @@ where { fn visit_stmt(&mut self, stmt: &'b Stmt) { // Step 0: Pre-processing - self.semantic.push_stmt(stmt); + self.semantic.push_statement(stmt); // Track whether we've seen docstrings, non-imports, etc. match stmt { @@ -288,7 +288,7 @@ where self.semantic.flags |= SemanticModelFlags::FUTURES_BOUNDARY; if !self.semantic.seen_import_boundary() && !helpers::is_assignment_to_a_dunder(stmt) - && !helpers::in_nested_block(self.semantic.parents()) + && !helpers::in_nested_block(self.semantic.current_statements()) { self.semantic.flags |= SemanticModelFlags::IMPORT_BOUNDARY; } @@ -372,7 +372,7 @@ where ); } else if &alias.name == "*" { self.semantic - .scope_mut() + .current_scope_mut() .add_star_import(StarImport { level, module }); } else { let mut flags = BindingFlags::EXTERNAL; @@ -421,7 +421,7 @@ where BindingKind::Global, BindingFlags::GLOBAL, ); - let scope = self.semantic.scope_mut(); + let scope = self.semantic.current_scope_mut(); scope.add(name, binding_id); } } @@ -444,7 +444,7 @@ where BindingKind::Nonlocal(scope_id), BindingFlags::NONLOCAL, ); - let scope = self.semantic.scope_mut(); + let scope = self.semantic.current_scope_mut(); scope.add(name, binding_id); } } @@ -657,7 +657,7 @@ where // available at runtime. // See: https://docs.python.org/3/reference/simple_stmts.html#annotated-assignment-statements let runtime_annotation = if self.semantic.future_annotations() { - if self.semantic.scope().kind.is_class() { + if self.semantic.current_scope().kind.is_class() { let baseclasses = &self .settings .flake8_type_checking @@ -676,7 +676,7 @@ where } } else { matches!( - self.semantic.scope().kind, + self.semantic.current_scope().kind, ScopeKind::Class(_) | ScopeKind::Module ) }; @@ -777,7 +777,7 @@ where analyze::statement(stmt, self); self.semantic.flags = flags_snapshot; - self.semantic.pop_stmt(); + self.semantic.pop_statement(); } fn visit_annotation(&mut self, expr: &'b Expr) { @@ -813,7 +813,7 @@ where return; } - self.semantic.push_expr(expr); + self.semantic.push_expression(expr); // Store the flags prior to any further descent, so that we can restore them after visiting // the node. @@ -841,7 +841,7 @@ where }) => { if let Expr::Name(ast::ExprName { id, ctx, range: _ }) = func.as_ref() { if id == "locals" && ctx.is_load() { - let scope = self.semantic.scope_mut(); + let scope = self.semantic.current_scope_mut(); scope.set_uses_locals(); } } @@ -1231,7 +1231,7 @@ where analyze::expression(expr, self); self.semantic.flags = flags_snapshot; - self.semantic.pop_expr(); + self.semantic.pop_expression(); } fn visit_except_handler(&mut self, except_handler: &'b ExceptHandler) { @@ -1611,7 +1611,7 @@ impl<'a> Checker<'a> { } fn handle_node_store(&mut self, id: &'a str, expr: &Expr) { - let parent = self.semantic.stmt(); + let parent = self.semantic.current_statement(); if matches!( parent, @@ -1646,7 +1646,7 @@ impl<'a> Checker<'a> { return; } - let scope = self.semantic.scope(); + let scope = self.semantic.current_scope(); if scope.kind.is_module() && match parent { @@ -1696,7 +1696,11 @@ impl<'a> Checker<'a> { return; } - if self.semantic.expr_ancestors().any(Expr::is_named_expr_expr) { + if self + .semantic + .current_expressions() + .any(Expr::is_named_expr_expr) + { self.add_binding( id, expr.range(), @@ -1721,7 +1725,7 @@ impl<'a> Checker<'a> { self.semantic.resolve_del(id, expr.range()); - if helpers::on_conditional_branch(&mut self.semantic.parents()) { + if helpers::on_conditional_branch(&mut self.semantic.current_statements()) { return; } @@ -1729,7 +1733,7 @@ impl<'a> Checker<'a> { let binding_id = self.semantic .push_binding(expr.range(), BindingKind::Deletion, BindingFlags::empty()); - let scope = self.semantic.scope_mut(); + let scope = self.semantic.current_scope_mut(); scope.add(id, binding_id); } @@ -1821,7 +1825,7 @@ impl<'a> Checker<'a> { for snapshot in deferred_functions { self.semantic.restore(snapshot); - match &self.semantic.stmt() { + match &self.semantic.current_statement() { Stmt::FunctionDef(ast::StmtFunctionDef { body, parameters, .. }) diff --git a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs index 5b63205d5f..2c7da19db0 100644 --- a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs +++ b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs @@ -63,7 +63,7 @@ fn matches_string_format_expression(expr: &Expr, model: &SemanticModel) -> bool }) => { // Only evaluate the full BinOp, not the nested components. if model - .expr_parent() + .current_expression_parent() .map_or(true, |parent| !parent.is_bin_op_expr()) { if any_over_expr(expr, &has_string_literal) { diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/cached_instance_method.rs b/crates/ruff/src/rules/flake8_bugbear/rules/cached_instance_method.rs index 8b5d81ba25..61e99ed491 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/cached_instance_method.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/cached_instance_method.rs @@ -77,7 +77,7 @@ fn is_cache_func(expr: &Expr, semantic: &SemanticModel) -> bool { /// B019 pub(crate) fn cached_instance_method(checker: &mut Checker, decorator_list: &[Decorator]) { - if !checker.semantic().scope().kind.is_class() { + if !checker.semantic().current_scope().kind.is_class() { return; } for decorator in decorator_list { diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs b/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs index 369391d5ab..ab5bc1462e 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs @@ -97,7 +97,7 @@ pub(crate) fn setattr_with_constant( if let Stmt::Expr(ast::StmtExpr { value: child, range: _, - }) = checker.semantic().stmt() + }) = checker.semantic().current_statement() { if expr == child.as_ref() { let mut diagnostic = Diagnostic::new(SetAttrWithConstant, expr.range()); diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs b/crates/ruff/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs index dc2553d200..8ab410ecd4 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs @@ -159,7 +159,7 @@ pub(crate) fn unused_loop_control_variable(checker: &mut Checker, target: &Expr, if certainty.into() { // Avoid fixing if the variable, or any future bindings to the variable, are // used _after_ the loop. - let scope = checker.semantic().scope(); + let scope = checker.semantic().current_scope(); if scope .get_all(name) .map(|binding_id| checker.semantic().binding(binding_id)) diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs index 0cde6b272e..ede442bb41 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs @@ -43,8 +43,8 @@ pub(crate) fn call_datetime_strptime_without_zone(checker: &mut Checker, call: & }; let (Some(grandparent), Some(parent)) = ( - checker.semantic().expr_grandparent(), - checker.semantic().expr_parent(), + checker.semantic().current_expression_grandparent(), + checker.semantic().current_expression_parent(), ) else { checker.diagnostics.push(Diagnostic::new( CallDatetimeStrptimeWithoutZone, diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/helpers.rs b/crates/ruff/src/rules/flake8_datetimez/rules/helpers.rs index 48ccb8af23..21ab64dc75 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/helpers.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/helpers.rs @@ -6,7 +6,7 @@ use crate::checkers::ast::Checker; /// Check if the parent expression is a call to `astimezone`. This assumes that /// the current expression is a `datetime.datetime` object. pub(super) fn parent_expr_is_astimezone(checker: &Checker) -> bool { - checker.semantic().expr_parent().is_some_and( |parent| { + checker.semantic().current_expression_parent().is_some_and( |parent| { matches!(parent, Expr::Attribute(ExprAttribute { attr, .. }) if attr.as_str() == "astimezone") }) } diff --git a/crates/ruff/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs b/crates/ruff/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs index a33106badd..ef1edc8064 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs @@ -66,7 +66,7 @@ pub(crate) fn any_eq_ne_annotation(checker: &mut Checker, name: &str, parameters return; }; - if !checker.semantic().scope().kind.is_class() { + if !checker.semantic().current_scope().kind.is_class() { return; } diff --git a/crates/ruff/src/rules/flake8_pyi/rules/custom_type_var_return_type.rs b/crates/ruff/src/rules/flake8_pyi/rules/custom_type_var_return_type.rs index 6dd0728e77..3528a58090 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/custom_type_var_return_type.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/custom_type_var_return_type.rs @@ -91,7 +91,7 @@ pub(crate) fn custom_type_var_return_type( return; }; - if !checker.semantic().scope().kind.is_class() { + if !checker.semantic().current_scope().kind.is_class() { return; }; diff --git a/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs b/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs index e88e6d3f37..f4b9e32ea2 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs @@ -119,7 +119,7 @@ pub(crate) fn non_self_return_type( parameters: &Parameters, async_: bool, ) { - let ScopeKind::Class(class_def) = checker.semantic().scope().kind else { + let ScopeKind::Class(class_def) = checker.semantic().current_scope().kind else { return; }; diff --git a/crates/ruff/src/rules/flake8_pyi/rules/simple_defaults.rs b/crates/ruff/src/rules/flake8_pyi/rules/simple_defaults.rs index ef3ef722af..4426760cd1 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/simple_defaults.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/simple_defaults.rs @@ -349,8 +349,8 @@ fn is_type_var_like_call(expr: &Expr, semantic: &SemanticModel) -> bool { fn is_special_assignment(target: &Expr, semantic: &SemanticModel) -> bool { if let Expr::Name(ast::ExprName { id, .. }) = target { match id.as_str() { - "__all__" => semantic.scope().kind.is_module(), - "__match_args__" | "__slots__" => semantic.scope().kind.is_class(), + "__all__" => semantic.current_scope().kind.is_module(), + "__match_args__" | "__slots__" => semantic.current_scope().kind.is_class(), _ => false, } } else { @@ -569,7 +569,9 @@ pub(crate) fn unannotated_assignment_in_stub( return; } - if let ScopeKind::Class(ast::StmtClassDef { arguments, .. }) = checker.semantic().scope().kind { + if let ScopeKind::Class(ast::StmtClassDef { arguments, .. }) = + checker.semantic().current_scope().kind + { if is_enum(arguments.as_deref(), checker.semantic()) { return; } diff --git a/crates/ruff/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs b/crates/ruff/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs index e220359c91..ad3b7cf470 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs @@ -63,7 +63,7 @@ pub(crate) fn str_or_repr_defined_in_stub(checker: &mut Checker, stmt: &Stmt) { return; } - if !checker.semantic().scope().kind.is_class() { + if !checker.semantic().current_scope().kind.is_class() { return; } @@ -96,11 +96,12 @@ pub(crate) fn str_or_repr_defined_in_stub(checker: &mut Checker, stmt: &Stmt) { stmt.identifier(), ); if checker.patch(diagnostic.kind.rule()) { - let stmt = checker.semantic().stmt(); - let parent = checker.semantic().stmt_parent(); + let stmt = checker.semantic().current_statement(); + let parent = checker.semantic().current_statement_parent(); let edit = delete_stmt(stmt, parent, checker.locator(), checker.indexer()); diagnostic.set_fix( - Fix::automatic(edit).isolate(checker.isolation(checker.semantic().stmt_parent())), + Fix::automatic(edit) + .isolate(checker.isolation(checker.semantic().current_statement_parent())), ); } checker.diagnostics.push(diagnostic); diff --git a/crates/ruff/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs b/crates/ruff/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs index 4fd45acd7f..c66ecf894f 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs @@ -43,7 +43,7 @@ impl AlwaysAutofixableViolation for StringOrBytesTooLong { /// PYI053 pub(crate) fn string_or_bytes_too_long(checker: &mut Checker, expr: &Expr) { // Ignore docstrings. - if is_docstring_stmt(checker.semantic().stmt()) { + if is_docstring_stmt(checker.semantic().current_statement()) { return; } diff --git a/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs b/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs index 01d93b90e7..4d90d77371 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs @@ -173,7 +173,8 @@ pub(crate) fn unused_private_type_var( let Some(source) = binding.source else { continue; }; - let Stmt::Assign(ast::StmtAssign { targets, value, .. }) = checker.semantic().stmts[source] + let Stmt::Assign(ast::StmtAssign { targets, value, .. }) = + checker.semantic().statements[source] else { continue; }; @@ -217,7 +218,7 @@ pub(crate) fn unused_private_protocol( continue; }; - let Stmt::ClassDef(class_def) = checker.semantic().stmts[source] else { + let Stmt::ClassDef(class_def) = checker.semantic().statements[source] else { continue; }; @@ -260,7 +261,7 @@ pub(crate) fn unused_private_type_alias( }; let Stmt::AnnAssign(ast::StmtAnnAssign { target, annotation, .. - }) = checker.semantic().stmts[source] + }) = checker.semantic().statements[source] else { continue; }; @@ -304,7 +305,7 @@ pub(crate) fn unused_private_typed_dict( let Some(source) = binding.source else { continue; }; - let Stmt::ClassDef(class_def) = checker.semantic().stmts[source] else { + let Stmt::ClassDef(class_def) = checker.semantic().statements[source] else { continue; }; diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs index d12e1e6d28..c70982d93c 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs @@ -246,8 +246,8 @@ pub(crate) fn unittest_assertion( if checker.patch(diagnostic.kind.rule()) { // We're converting an expression to a statement, so avoid applying the fix if // the assertion is part of a larger expression. - if checker.semantic().stmt().is_expr_stmt() - && checker.semantic().expr_parent().is_none() + if checker.semantic().current_statement().is_expr_stmt() + && checker.semantic().current_expression_parent().is_none() && !checker.indexer().comment_ranges().intersects(expr.range()) { if let Ok(stmt) = unittest_assert.generate_assert(args, keywords) { diff --git a/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs b/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs index b33929d0ba..1f259e51c6 100644 --- a/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs +++ b/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs @@ -77,7 +77,7 @@ pub(crate) fn private_member_access(checker: &mut Checker, expr: &Expr) { // Ignore accesses on instances within special methods (e.g., `__eq__`). if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) = - checker.semantic().scope().kind + checker.semantic().current_scope().kind { if matches!( name.as_str(), diff --git a/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs b/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs index 5dc0eb575d..c2aa396b17 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs @@ -155,14 +155,14 @@ pub(crate) fn negation_with_equal_op( if !matches!(&ops[..], [CmpOp::Eq]) { return; } - if is_exception_check(checker.semantic().stmt()) { + if is_exception_check(checker.semantic().current_statement()) { return; } // Avoid flagging issues in dunder implementations. if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) | ScopeKind::AsyncFunction(ast::StmtAsyncFunctionDef { name, .. }) = - &checker.semantic().scope().kind + &checker.semantic().current_scope().kind { if is_dunder_method(name) { return; @@ -213,14 +213,14 @@ pub(crate) fn negation_with_not_equal_op( if !matches!(&ops[..], [CmpOp::NotEq]) { return; } - if is_exception_check(checker.semantic().stmt()) { + if is_exception_check(checker.semantic().current_statement()) { return; } // Avoid flagging issues in dunder implementations. if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) | ScopeKind::AsyncFunction(ast::StmtAsyncFunctionDef { name, .. }) = - &checker.semantic().scope().kind + &checker.semantic().current_scope().kind { if is_dunder_method(name) { return; diff --git a/crates/ruff/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs b/crates/ruff/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs index 9ee1a5fc14..5fd3a79c6d 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs @@ -43,7 +43,7 @@ impl Violation for OpenFileWithContextHandler { /// Return `true` if the current expression is nested in an `await /// exit_stack.enter_async_context` call. fn match_async_exit_stack(semantic: &SemanticModel) -> bool { - let Some(expr) = semantic.expr_grandparent() else { + let Some(expr) = semantic.current_expression_grandparent() else { return false; }; let Expr::Await(ast::ExprAwait { value, range: _ }) = expr else { @@ -58,7 +58,7 @@ fn match_async_exit_stack(semantic: &SemanticModel) -> bool { if attr != "enter_async_context" { return false; } - for parent in semantic.parents() { + for parent in semantic.current_statements() { if let Stmt::With(ast::StmtWith { items, .. }) = parent { for item in items { if let Expr::Call(ast::ExprCall { func, .. }) = &item.context_expr { @@ -77,7 +77,7 @@ fn match_async_exit_stack(semantic: &SemanticModel) -> bool { /// Return `true` if the current expression is nested in an /// `exit_stack.enter_context` call. fn match_exit_stack(semantic: &SemanticModel) -> bool { - let Some(expr) = semantic.expr_parent() else { + let Some(expr) = semantic.current_expression_parent() else { return false; }; let Expr::Call(ast::ExprCall { func, .. }) = expr else { @@ -89,7 +89,7 @@ fn match_exit_stack(semantic: &SemanticModel) -> bool { if attr != "enter_context" { return false; } - for parent in semantic.parents() { + for parent in semantic.current_statements() { if let Stmt::With(ast::StmtWith { items, .. }) = parent { for item in items { if let Expr::Call(ast::ExprCall { func, .. }) = &item.context_expr { @@ -133,7 +133,7 @@ pub(crate) fn open_file_with_context_handler(checker: &mut Checker, func: &Expr) } // Ex) `with open("foo.txt") as f: ...` - if checker.semantic().stmt().is_with_stmt() { + if checker.semantic().current_statement().is_with_stmt() { return; } diff --git a/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs b/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs index 04008a8811..989036b0e4 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs @@ -60,7 +60,7 @@ impl Violation for ReimplementedBuiltin { /// SIM110, SIM111 pub(crate) fn convert_for_loop_to_any_all(checker: &mut Checker, stmt: &Stmt) { - if !checker.semantic().scope().kind.is_any_function() { + if !checker.semantic().current_scope().kind.is_any_function() { return; } @@ -73,7 +73,7 @@ pub(crate) fn convert_for_loop_to_any_all(checker: &mut Checker, stmt: &Stmt) { // - `for` loop with an `else: return True` or `else: return False`. // - `for` loop followed by `return True` or `return False`. let Some(terminal) = match_else_return(stmt).or_else(|| { - let parent = checker.semantic().stmt_parent()?; + let parent = checker.semantic().current_statement_parent()?; let suite = traversal::suite(stmt, parent)?; let sibling = traversal::next_sibling(stmt, suite)?; match_sibling_return(stmt, sibling) diff --git a/crates/ruff/src/rules/flake8_type_checking/helpers.rs b/crates/ruff/src/rules/flake8_type_checking/helpers.rs index 001b7f2582..31b5c6d2c3 100644 --- a/crates/ruff/src/rules/flake8_type_checking/helpers.rs +++ b/crates/ruff/src/rules/flake8_type_checking/helpers.rs @@ -35,7 +35,7 @@ pub(crate) fn runtime_evaluated( } fn runtime_evaluated_base_class(base_classes: &[String], semantic: &SemanticModel) -> bool { - let ScopeKind::Class(class_def) = &semantic.scope().kind else { + let ScopeKind::Class(class_def) = &semantic.current_scope().kind else { return false; }; @@ -49,7 +49,7 @@ fn runtime_evaluated_base_class(base_classes: &[String], semantic: &SemanticMode } fn runtime_evaluated_decorators(decorators: &[String], semantic: &SemanticModel) -> bool { - let ScopeKind::Class(class_def) = &semantic.scope().kind else { + let ScopeKind::Class(class_def) = &semantic.current_scope().kind else { return false; }; diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs b/crates/ruff/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs index 5bb8533778..05b3f2cb1c 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs @@ -58,8 +58,8 @@ pub(crate) fn empty_type_checking_block(checker: &mut Checker, stmt: &ast::StmtI let mut diagnostic = Diagnostic::new(EmptyTypeCheckingBlock, stmt.range()); if checker.patch(diagnostic.kind.rule()) { // Delete the entire type-checking block. - let stmt = checker.semantic().stmt(); - let parent = checker.semantic().stmt_parent(); + let stmt = checker.semantic().current_statement(); + let parent = checker.semantic().current_statement_parent(); let edit = autofix::edits::delete_stmt(stmt, parent, checker.locator(), checker.indexer()); diagnostic.set_fix(Fix::automatic(edit).isolate(checker.isolation(parent))); } diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs index 66c187fc55..5fc6722cf0 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs @@ -93,7 +93,7 @@ pub(crate) fn runtime_import_in_type_checking_block( .is_runtime() }) { - let Some(stmt_id) = binding.source else { + let Some(statement_id) = binding.source else { continue; }; @@ -113,20 +113,23 @@ pub(crate) fn runtime_import_in_type_checking_block( }) { ignores_by_statement - .entry(stmt_id) + .entry(statement_id) .or_default() .push(import); } else { - errors_by_statement.entry(stmt_id).or_default().push(import); + errors_by_statement + .entry(statement_id) + .or_default() + .push(import); } } } // Generate a diagnostic for every import, but share a fix across all imports within the same // statement (excluding those that are ignored). - for (stmt_id, imports) in errors_by_statement { + for (statement_id, imports) in errors_by_statement { let fix = if checker.patch(Rule::RuntimeImportInTypeCheckingBlock) { - fix_imports(checker, stmt_id, &imports).ok() + fix_imports(checker, statement_id, &imports).ok() } else { None }; @@ -189,9 +192,9 @@ struct ImportBinding<'a> { } /// Generate a [`Fix`] to remove runtime imports from a type-checking block. -fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> Result { - let stmt = checker.semantic().stmts[stmt_id]; - let parent = checker.semantic().stmts.parent(stmt); +fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { + let statement = checker.semantic().statements[statement_id]; + let parent = checker.semantic().statements.parent(statement); let member_names: Vec> = imports .iter() .map(|ImportBinding { import, .. }| import.member_name()) @@ -209,7 +212,7 @@ fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> // Step 1) Remove the import. let remove_import_edit = autofix::edits::remove_unused_imports( member_names.iter().map(AsRef::as_ref), - stmt, + statement, parent, checker.locator(), checker.stylist(), @@ -219,7 +222,7 @@ fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> // Step 2) Add the import to the top-level. let add_import_edit = checker.importer().runtime_import_edit( &ImportedMembers { - statement: stmt, + statement, names: member_names.iter().map(AsRef::as_ref).collect(), }, at, diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs index 5d40de8cc5..15a7f658c2 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs @@ -265,7 +265,7 @@ pub(crate) fn typing_only_runtime_import( continue; } - let Some(stmt_id) = binding.source else { + let Some(statement_id) = binding.source else { continue; }; @@ -282,12 +282,12 @@ pub(crate) fn typing_only_runtime_import( }) { ignores_by_statement - .entry((stmt_id, import_type)) + .entry((statement_id, import_type)) .or_default() .push(import); } else { errors_by_statement - .entry((stmt_id, import_type)) + .entry((statement_id, import_type)) .or_default() .push(import); } @@ -296,9 +296,9 @@ pub(crate) fn typing_only_runtime_import( // Generate a diagnostic for every import, but share a fix across all imports within the same // statement (excluding those that are ignored). - for ((stmt_id, import_type), imports) in errors_by_statement { + for ((statement_id, import_type), imports) in errors_by_statement { let fix = if checker.patch(rule_for(import_type)) { - fix_imports(checker, stmt_id, &imports).ok() + fix_imports(checker, statement_id, &imports).ok() } else { None }; @@ -402,9 +402,9 @@ fn is_exempt(name: &str, exempt_modules: &[&str]) -> bool { } /// Generate a [`Fix`] to remove typing-only imports from a runtime context. -fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> Result { - let stmt = checker.semantic().stmts[stmt_id]; - let parent = checker.semantic().stmts.parent(stmt); +fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { + let statement = checker.semantic().statements[statement_id]; + let parent = checker.semantic().statements.parent(statement); let member_names: Vec> = imports .iter() .map(|ImportBinding { import, .. }| import.member_name()) @@ -422,7 +422,7 @@ fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> // Step 1) Remove the import. let remove_import_edit = autofix::edits::remove_unused_imports( member_names.iter().map(AsRef::as_ref), - stmt, + statement, parent, checker.locator(), checker.stylist(), @@ -432,7 +432,7 @@ fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> // Step 2) Add the import to a `TYPE_CHECKING` block. let add_import_edit = checker.importer().typing_import_edit( &ImportedMembers { - statement: stmt, + statement, names: member_names.iter().map(AsRef::as_ref).collect(), }, at, diff --git a/crates/ruff/src/rules/pandas_vet/rules/attr.rs b/crates/ruff/src/rules/pandas_vet/rules/attr.rs index de8981c63d..de4de9de9e 100644 --- a/crates/ruff/src/rules/pandas_vet/rules/attr.rs +++ b/crates/ruff/src/rules/pandas_vet/rules/attr.rs @@ -53,7 +53,7 @@ pub(crate) fn attr(checker: &mut Checker, attr: &str, value: &Expr, attr_expr: & }; // Avoid flagging on function calls (e.g., `df.values()`). - if let Some(parent) = checker.semantic().expr_parent() { + if let Some(parent) = checker.semantic().current_expression_parent() { if matches!(parent, Expr::Call(_)) { return; } diff --git a/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs b/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs index 2282ede228..7ac4a06a89 100644 --- a/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs +++ b/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs @@ -85,8 +85,8 @@ pub(crate) fn inplace_argument(checker: &mut Checker, call: &ast::ExprCall) { // 2. The call is part of a larger expression (we're converting an expression to a // statement, and expressions can't contain statements). if !seen_star - && checker.semantic().stmt().is_expr_stmt() - && checker.semantic().expr_parent().is_none() + && checker.semantic().current_statement().is_expr_stmt() + && checker.semantic().current_expression_parent().is_none() { if let Some(fix) = convert_inplace_argument_to_assignment( call, diff --git a/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs b/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs index 15770fb614..ac796dfe79 100644 --- a/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs +++ b/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs @@ -69,7 +69,7 @@ pub(crate) fn mixed_case_variable_in_class_scope( return; } - let parent = checker.semantic().stmt(); + let parent = checker.semantic().current_statement(); if helpers::is_named_tuple_assignment(parent, checker.semantic()) || helpers::is_typed_dict_class(arguments, checker.semantic()) diff --git a/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs b/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs index a280e85286..4eb648fe8f 100644 --- a/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs +++ b/crates/ruff/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs @@ -75,7 +75,7 @@ pub(crate) fn mixed_case_variable_in_global_scope(checker: &mut Checker, expr: & return; } - let parent = checker.semantic().stmt(); + let parent = checker.semantic().current_statement(); if helpers::is_named_tuple_assignment(parent, checker.semantic()) { return; } diff --git a/crates/ruff/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs b/crates/ruff/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs index 87383353aa..41a7fea0ca 100644 --- a/crates/ruff/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs +++ b/crates/ruff/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs @@ -65,7 +65,7 @@ pub(crate) fn non_lowercase_variable_in_function(checker: &mut Checker, expr: &E return; } - let parent = checker.semantic().stmt(); + let parent = checker.semantic().current_statement(); if helpers::is_named_tuple_assignment(parent, checker.semantic()) || helpers::is_typed_dict_assignment(parent, checker.semantic()) || helpers::is_type_var_assignment(parent, checker.semantic()) diff --git a/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs b/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs index 677d655525..58e1ed7e07 100644 --- a/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs +++ b/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs @@ -167,7 +167,7 @@ fn is_unused(expr: &Expr, model: &SemanticModel) -> bool { // // print(bar) // ``` - let scope = model.scope(); + let scope = model.current_scope(); scope .get_all(id) .map(|binding_id| model.binding(binding_id)) diff --git a/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs b/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs index 6ea2569024..67551e0988 100644 --- a/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs +++ b/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs @@ -102,12 +102,12 @@ pub(crate) fn unnecessary_list_cast(checker: &mut Checker, iter: &Expr) { range: iterable_range, .. }) => { - let scope = checker.semantic().scope(); + let scope = checker.semantic().current_scope(); if let Some(binding_id) = scope.get(id) { let binding = checker.semantic().binding(binding_id); if binding.kind.is_assignment() || binding.kind.is_named_expr_assignment() { if let Some(parent_id) = binding.source { - let parent = checker.semantic().stmts[parent_id]; + let parent = checker.semantic().statements[parent_id]; if let Stmt::Assign(ast::StmtAssign { value, .. }) | Stmt::AnnAssign(ast::StmtAnnAssign { value: Some(value), .. diff --git a/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs b/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs index f909ac3fea..7ae7764574 100644 --- a/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs +++ b/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs @@ -116,10 +116,10 @@ pub(crate) fn lambda_assignment( // rewriting it as a function declaration may break type-checking. // See: https://github.com/astral-sh/ruff/issues/3046 // See: https://github.com/astral-sh/ruff/issues/5421 - if (annotation.is_some() && checker.semantic().scope().kind.is_class()) + if (annotation.is_some() && checker.semantic().current_scope().kind.is_class()) || checker .semantic() - .scope() + .current_scope() .get_all(id) .any(|binding_id| checker.semantic().binding(binding_id).kind.is_annotation()) { diff --git a/crates/ruff/src/rules/pyflakes/rules/return_outside_function.rs b/crates/ruff/src/rules/pyflakes/rules/return_outside_function.rs index 6028e57491..c6416d5e3d 100644 --- a/crates/ruff/src/rules/pyflakes/rules/return_outside_function.rs +++ b/crates/ruff/src/rules/pyflakes/rules/return_outside_function.rs @@ -33,7 +33,7 @@ impl Violation for ReturnOutsideFunction { pub(crate) fn return_outside_function(checker: &mut Checker, stmt: &Stmt) { if matches!( - checker.semantic().scope().kind, + checker.semantic().current_scope().kind, ScopeKind::Class(_) | ScopeKind::Module ) { checker diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs index 54aaea3f40..22d39f3e23 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs @@ -116,7 +116,7 @@ pub(crate) fn unused_import(checker: &Checker, scope: &Scope, diagnostics: &mut continue; }; - let Some(stmt_id) = binding.source else { + let Some(statement_id) = binding.source else { continue; }; @@ -132,12 +132,12 @@ pub(crate) fn unused_import(checker: &Checker, scope: &Scope, diagnostics: &mut }) { ignored - .entry((stmt_id, binding.exceptions)) + .entry((statement_id, binding.exceptions)) .or_default() .push(import); } else { unused - .entry((stmt_id, binding.exceptions)) + .entry((statement_id, binding.exceptions)) .or_default() .push(import); } @@ -148,13 +148,13 @@ pub(crate) fn unused_import(checker: &Checker, scope: &Scope, diagnostics: &mut // Generate a diagnostic for every import, but share a fix across all imports within the same // statement (excluding those that are ignored). - for ((stmt_id, exceptions), imports) in unused { + for ((statement_id, exceptions), imports) in unused { let in_except_handler = exceptions.intersects(Exceptions::MODULE_NOT_FOUND_ERROR | Exceptions::IMPORT_ERROR); let multiple = imports.len() > 1; let fix = if !in_init && !in_except_handler && checker.patch(Rule::UnusedImport) { - fix_imports(checker, stmt_id, &imports).ok() + fix_imports(checker, statement_id, &imports).ok() } else { None }; @@ -225,9 +225,9 @@ struct ImportBinding<'a> { } /// Generate a [`Fix`] to remove unused imports from a statement. -fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> Result { - let stmt = checker.semantic().stmts[stmt_id]; - let parent = checker.semantic().stmts.parent(stmt); +fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { + let statement = checker.semantic().statements[statement_id]; + let parent = checker.semantic().statements.parent(statement); let member_names: Vec> = imports .iter() @@ -236,7 +236,7 @@ fn fix_imports(checker: &Checker, stmt_id: NodeId, imports: &[ImportBinding]) -> let edit = autofix::edits::remove_unused_imports( member_names.iter().map(AsRef::as_ref), - stmt, + statement, parent, checker.locator(), checker.stylist(), diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs index 94cbad3727..911582c29e 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs @@ -326,8 +326,8 @@ pub(crate) fn unused_variable(checker: &Checker, scope: &Scope, diagnostics: &mu let mut diagnostic = Diagnostic::new(UnusedVariable { name }, range); if checker.patch(diagnostic.kind.rule()) { if let Some(source) = source { - let stmt = checker.semantic().stmts[source]; - let parent = checker.semantic().stmts.parent(stmt); + let stmt = checker.semantic().statements[source]; + let parent = checker.semantic().statements.parent(stmt); if let Some(fix) = remove_unused_variable(stmt, parent, range, checker) { diagnostic.set_fix(fix); } diff --git a/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs b/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs index 57c6b4b687..355610adc2 100644 --- a/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs +++ b/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs @@ -55,7 +55,7 @@ impl Violation for YieldOutsideFunction { pub(crate) fn yield_outside_function(checker: &mut Checker, expr: &Expr) { if matches!( - checker.semantic().scope().kind, + checker.semantic().current_scope().kind, ScopeKind::Class(_) | ScopeKind::Module ) { let keyword = match expr { diff --git a/crates/ruff/src/rules/pylint/helpers.rs b/crates/ruff/src/rules/pylint/helpers.rs index 425771c55b..25ca39c544 100644 --- a/crates/ruff/src/rules/pylint/helpers.rs +++ b/crates/ruff/src/rules/pylint/helpers.rs @@ -23,7 +23,7 @@ pub(super) fn type_param_name(arguments: &Arguments) -> Option<&str> { } pub(super) fn in_dunder_init(semantic: &SemanticModel, settings: &Settings) -> bool { - let scope = semantic.scope(); + let scope = semantic.current_scope(); let (ScopeKind::Function(ast::StmtFunctionDef { name, decorator_list, diff --git a/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs b/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs index bb2c4d9049..a6d34938fd 100644 --- a/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs +++ b/crates/ruff/src/rules/pylint/rules/compare_to_empty_string.rs @@ -67,7 +67,7 @@ pub(crate) fn compare_to_empty_string( // DataFrame and np.ndarray indexing. if checker .semantic() - .expr_ancestors() + .current_expressions() .any(Expr::is_subscript_expr) { return; diff --git a/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs b/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs index 74eddd0f92..85a8ae570d 100644 --- a/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs +++ b/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs @@ -29,7 +29,7 @@ pub(crate) fn invalid_str_return(checker: &mut Checker, name: &str, body: &[Stmt return; } - if !checker.semantic().scope().kind.is_class() { + if !checker.semantic().current_scope().kind.is_class() { return; } diff --git a/crates/ruff/src/rules/pylint/rules/self_assigning_variable.rs b/crates/ruff/src/rules/pylint/rules/self_assigning_variable.rs index fe54bb484e..4176626a33 100644 --- a/crates/ruff/src/rules/pylint/rules/self_assigning_variable.rs +++ b/crates/ruff/src/rules/pylint/rules/self_assigning_variable.rs @@ -62,7 +62,7 @@ pub(crate) fn self_assigning_variable(checker: &mut Checker, target: &Expr, valu // Assignments in class bodies are attributes (e.g., `x = x` assigns `x` to `self.x`, and thus // is not a self-assignment). - if checker.semantic().scope().kind.is_class() { + if checker.semantic().current_scope().kind.is_class() { return; } diff --git a/crates/ruff/src/rules/pylint/rules/unexpected_special_method_signature.rs b/crates/ruff/src/rules/pylint/rules/unexpected_special_method_signature.rs index 5727667c82..09182ef384 100644 --- a/crates/ruff/src/rules/pylint/rules/unexpected_special_method_signature.rs +++ b/crates/ruff/src/rules/pylint/rules/unexpected_special_method_signature.rs @@ -143,7 +143,7 @@ pub(crate) fn unexpected_special_method_signature( decorator_list: &[Decorator], parameters: &Parameters, ) { - if !checker.semantic().scope().kind.is_class() { + if !checker.semantic().current_scope().kind.is_class() { return; } diff --git a/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs b/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs index 5ed24e994a..723a927ed4 100644 --- a/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs +++ b/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs @@ -38,7 +38,7 @@ impl Violation for YieldFromInAsyncFunction { /// PLE1700 pub(crate) fn yield_from_in_async_function(checker: &mut Checker, expr: &ExprYieldFrom) { - let scope = checker.semantic().scope(); + let scope = checker.semantic().current_scope(); if scope.kind.is_async_function() { checker .diagnostics diff --git a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs index f0942da106..07dde88bcb 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs @@ -149,7 +149,7 @@ pub(crate) fn native_literals( if checker.semantic().in_f_string() { if checker .semantic() - .expr_ancestors() + .current_expressions() .filter(|expr| expr.is_joined_str_expr()) .count() > 1 diff --git a/crates/ruff/src/rules/pyupgrade/rules/outdated_version_block.rs b/crates/ruff/src/rules/pyupgrade/rules/outdated_version_block.rs index 493b8413c7..25fecdf628 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/outdated_version_block.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/outdated_version_block.rs @@ -124,8 +124,8 @@ fn fix_py2_block(checker: &Checker, stmt_if: &StmtIf, branch: &IfElifBranch) -> BranchKind::If => match stmt_if.elif_else_clauses.first() { // If we have a lone `if`, delete as statement (insert pass in parent if required) None => { - let stmt = checker.semantic().stmt(); - let parent = checker.semantic().stmt_parent(); + let stmt = checker.semantic().current_statement(); + let parent = checker.semantic().current_statement_parent(); let edit = delete_stmt(stmt, parent, checker.locator(), checker.indexer()); Some(Fix::suggested(edit)) } diff --git a/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs b/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs index 8a67f5cf8d..457de15f0e 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs @@ -80,14 +80,14 @@ pub(crate) fn super_call_with_parameters( if !is_super_call_with_arguments(func, args) { return; } - let scope = checker.semantic().scope(); + let scope = checker.semantic().current_scope(); // Check: are we in a Function scope? if !scope.kind.is_any_function() { return; } - let mut parents = checker.semantic().parents(); + let mut parents = checker.semantic().current_statements(); // For a `super` invocation to be unnecessary, the first argument needs to match // the enclosing class, and the second argument needs to match the first diff --git a/crates/ruff/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs b/crates/ruff/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs index 17fbcbe284..bf7e6724b2 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs @@ -122,14 +122,14 @@ pub(crate) fn unnecessary_builtin_import( ); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - let stmt = checker.semantic().stmt(); - let parent = checker.semantic().stmt_parent(); + let statement = checker.semantic().current_statement(); + let parent = checker.semantic().current_statement_parent(); let edit = autofix::edits::remove_unused_imports( unused_imports .iter() .map(|alias| &alias.name) .map(ruff_python_ast::Identifier::as_str), - stmt, + statement, parent, checker.locator(), checker.stylist(), diff --git a/crates/ruff/src/rules/pyupgrade/rules/unnecessary_future_import.rs b/crates/ruff/src/rules/pyupgrade/rules/unnecessary_future_import.rs index ec4e4d7ba8..2cbf8dbe06 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/unnecessary_future_import.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/unnecessary_future_import.rs @@ -111,14 +111,14 @@ pub(crate) fn unnecessary_future_import(checker: &mut Checker, stmt: &Stmt, name if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { - let stmt = checker.semantic().stmt(); - let parent = checker.semantic().stmt_parent(); + let statement = checker.semantic().current_statement(); + let parent = checker.semantic().current_statement_parent(); let edit = autofix::edits::remove_unused_imports( unused_imports .iter() .map(|alias| &alias.name) .map(ruff_python_ast::Identifier::as_str), - stmt, + statement, parent, checker.locator(), checker.stylist(), diff --git a/crates/ruff/src/rules/pyupgrade/rules/useless_metaclass_type.rs b/crates/ruff/src/rules/pyupgrade/rules/useless_metaclass_type.rs index 70fd141857..c0ee032ef9 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/useless_metaclass_type.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/useless_metaclass_type.rs @@ -63,8 +63,8 @@ pub(crate) fn useless_metaclass_type( let mut diagnostic = Diagnostic::new(UselessMetaclassType, stmt.range()); if checker.patch(diagnostic.kind.rule()) { - let stmt = checker.semantic().stmt(); - let parent = checker.semantic().stmt_parent(); + let stmt = checker.semantic().current_statement(); + let parent = checker.semantic().current_statement_parent(); let edit = autofix::edits::delete_stmt(stmt, parent, checker.locator(), checker.indexer()); diagnostic.set_fix(Fix::automatic(edit).isolate(checker.isolation(parent))); } diff --git a/crates/ruff/src/rules/ruff/rules/collection_literal_concatenation.rs b/crates/ruff/src/rules/ruff/rules/collection_literal_concatenation.rs index a2156f8e11..125f950e10 100644 --- a/crates/ruff/src/rules/ruff/rules/collection_literal_concatenation.rs +++ b/crates/ruff/src/rules/ruff/rules/collection_literal_concatenation.rs @@ -166,7 +166,7 @@ fn concatenate_expressions(expr: &Expr) -> Option<(Expr, Type)> { pub(crate) fn collection_literal_concatenation(checker: &mut Checker, expr: &Expr) { // If the expression is already a child of an addition, we'll have analyzed it already. if matches!( - checker.semantic().expr_parent(), + checker.semantic().current_expression_parent(), Some(Expr::BinOp(ast::ExprBinOp { op: Operator::Add, .. diff --git a/crates/ruff_python_semantic/src/binding.rs b/crates/ruff_python_semantic/src/binding.rs index 10e1900888..ef06cce239 100644 --- a/crates/ruff_python_semantic/src/binding.rs +++ b/crates/ruff_python_semantic/src/binding.rs @@ -185,7 +185,7 @@ impl<'a> Binding<'a> { /// Returns the range of the binding's parent. pub fn parent_range(&self, semantic: &SemanticModel) -> Option { self.source - .map(|node_id| semantic.stmts[node_id]) + .map(|node_id| semantic.statements[node_id]) .and_then(|parent| { if parent.is_import_from_stmt() { Some(parent.range()) diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index e66e1c211e..5238269da3 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -31,16 +31,16 @@ pub struct SemanticModel<'a> { module_path: Option<&'a [String]>, /// Stack of all visited statements. - pub stmts: Nodes<'a, Stmt>, + pub statements: Nodes<'a, Stmt>, /// The identifier of the current statement. - stmt_id: Option, + statement_id: Option, /// Stack of all visited expressions. - exprs: Nodes<'a, Expr>, + expressions: Nodes<'a, Expr>, /// The identifier of the current expression. - expr_id: Option, + expression_id: Option, /// Stack of all scopes, along with the identifier of the current scope. pub scopes: Scopes<'a>, @@ -132,10 +132,10 @@ impl<'a> SemanticModel<'a> { Self { typing_modules, module_path: module.path(), - stmts: Nodes::::default(), - stmt_id: None, - exprs: Nodes::::default(), - expr_id: None, + statements: Nodes::::default(), + statement_id: None, + expressions: Nodes::::default(), + expression_id: None, scopes: Scopes::default(), scope_id: ScopeId::global(), definitions: Definitions::for_module(module), @@ -225,7 +225,7 @@ impl<'a> SemanticModel<'a> { flags, references: Vec::new(), scope: self.scope_id, - source: self.stmt_id, + source: self.statement_id, context: self.execution_context(), exceptions: self.exceptions(), }) @@ -233,7 +233,7 @@ impl<'a> SemanticModel<'a> { /// Return the current [`Binding`] for a given `name`. pub fn find_binding(&self, member: &str) -> Option<&Binding> { - self.scopes() + self.current_scopes() .find_map(|scope| scope.get(member)) .map(|binding_id| &self.bindings[binding_id]) } @@ -686,102 +686,110 @@ impl<'a> SemanticModel<'a> { ) -> Option { // TODO(charlie): Pass in a slice. let module_path: Vec<&str> = module.split('.').collect(); - self.scopes().enumerate().find_map(|(scope_index, scope)| { - scope.bindings().find_map(|(name, binding_id)| { - let binding = &self.bindings[binding_id]; - match &binding.kind { - // Ex) Given `module="sys"` and `object="exit"`: - // `import sys` -> `sys.exit` - // `import sys as sys2` -> `sys2.exit` - BindingKind::Import(Import { call_path }) => { - if call_path.as_ref() == module_path.as_slice() { - if let Some(source) = binding.source { - // Verify that `sys` isn't bound in an inner scope. - if self - .scopes() - .take(scope_index) - .all(|scope| !scope.has(name)) - { - return Some(ImportedName { - name: format!("{name}.{member}"), - range: self.stmts[source].range(), - context: binding.context, - }); - } - } - } - } - // Ex) Given `module="os.path"` and `object="join"`: - // `from os.path import join` -> `join` - // `from os.path import join as join2` -> `join2` - BindingKind::FromImport(FromImport { call_path }) => { - if let Some((target_member, target_module)) = call_path.split_last() { - if target_module == module_path.as_slice() && target_member == &member { + self.current_scopes() + .enumerate() + .find_map(|(scope_index, scope)| { + scope.bindings().find_map(|(name, binding_id)| { + let binding = &self.bindings[binding_id]; + match &binding.kind { + // Ex) Given `module="sys"` and `object="exit"`: + // `import sys` -> `sys.exit` + // `import sys as sys2` -> `sys2.exit` + BindingKind::Import(Import { call_path }) => { + if call_path.as_ref() == module_path.as_slice() { if let Some(source) = binding.source { - // Verify that `join` isn't bound in an inner scope. + // Verify that `sys` isn't bound in an inner scope. if self - .scopes() + .current_scopes() .take(scope_index) .all(|scope| !scope.has(name)) { return Some(ImportedName { - name: (*name).to_string(), - range: self.stmts[source].range(), + name: format!("{name}.{member}"), + range: self.statements[source].range(), context: binding.context, }); } } } } - } - // Ex) Given `module="os"` and `object="name"`: - // `import os.path ` -> `os.name` - BindingKind::SubmoduleImport(SubmoduleImport { .. }) => { - if name == module { - if let Some(source) = binding.source { - // Verify that `os` isn't bound in an inner scope. - if self - .scopes() - .take(scope_index) - .all(|scope| !scope.has(name)) + // Ex) Given `module="os.path"` and `object="join"`: + // `from os.path import join` -> `join` + // `from os.path import join as join2` -> `join2` + BindingKind::FromImport(FromImport { call_path }) => { + if let Some((target_member, target_module)) = call_path.split_last() { + if target_module == module_path.as_slice() + && target_member == &member { - return Some(ImportedName { - name: format!("{name}.{member}"), - range: self.stmts[source].range(), - context: binding.context, - }); + if let Some(source) = binding.source { + // Verify that `join` isn't bound in an inner scope. + if self + .current_scopes() + .take(scope_index) + .all(|scope| !scope.has(name)) + { + return Some(ImportedName { + name: (*name).to_string(), + range: self.statements[source].range(), + context: binding.context, + }); + } + } } } } + // Ex) Given `module="os"` and `object="name"`: + // `import os.path ` -> `os.name` + BindingKind::SubmoduleImport(SubmoduleImport { .. }) => { + if name == module { + if let Some(source) = binding.source { + // Verify that `os` isn't bound in an inner scope. + if self + .current_scopes() + .take(scope_index) + .all(|scope| !scope.has(name)) + { + return Some(ImportedName { + name: format!("{name}.{member}"), + range: self.statements[source].range(), + context: binding.context, + }); + } + } + } + } + // Non-imports. + _ => {} } - // Non-imports. - _ => {} - } - None + None + }) }) - }) } /// Push a [`Stmt`] onto the stack. - pub fn push_stmt(&mut self, stmt: &'a Stmt) { - self.stmt_id = Some(self.stmts.insert(stmt, self.stmt_id)); + pub fn push_statement(&mut self, stmt: &'a Stmt) { + self.statement_id = Some(self.statements.insert(stmt, self.statement_id)); } /// Pop the current [`Stmt`] off the stack. - pub fn pop_stmt(&mut self) { - let node_id = self.stmt_id.expect("Attempted to pop without statement"); - self.stmt_id = self.stmts.parent_id(node_id); + pub fn pop_statement(&mut self) { + let node_id = self + .statement_id + .expect("Attempted to pop without statement"); + self.statement_id = self.statements.parent_id(node_id); } /// Push a [`Expr`] onto the stack. - pub fn push_expr(&mut self, expr: &'a Expr) { - self.expr_id = Some(self.exprs.insert(expr, self.expr_id)); + pub fn push_expression(&mut self, expr: &'a Expr) { + self.expression_id = Some(self.expressions.insert(expr, self.expression_id)); } /// Pop the current [`Expr`] off the stack. - pub fn pop_expr(&mut self) { - let node_id = self.expr_id.expect("Attempted to pop without expression"); - self.expr_id = self.exprs.parent_id(node_id); + pub fn pop_expression(&mut self) { + let node_id = self + .expression_id + .expect("Attempted to pop without expression"); + self.expression_id = self.expressions.parent_id(node_id); } /// Push a [`Scope`] with the given [`ScopeKind`] onto the stack. @@ -811,69 +819,94 @@ impl<'a> SemanticModel<'a> { } /// Return the current `Stmt`. - pub fn stmt(&self) -> &'a Stmt { - let node_id = self.stmt_id.expect("No current statement"); - self.stmts[node_id] + pub fn current_statement(&self) -> &'a Stmt { + let node_id = self.statement_id.expect("No current statement"); + self.statements[node_id] } - /// Return the parent `Stmt` of the current `Stmt`, if any. - pub fn stmt_parent(&self) -> Option<&'a Stmt> { - let node_id = self.stmt_id.expect("No current statement"); - let parent_id = self.stmts.parent_id(node_id)?; - Some(self.stmts[parent_id]) - } - - /// Return the current `Expr`. - pub fn expr(&self) -> Option<&'a Expr> { - let node_id = self.expr_id?; - Some(self.exprs[node_id]) - } - - /// Return the parent `Expr` of the current `Expr`, if any. - pub fn expr_parent(&self) -> Option<&'a Expr> { - self.expr_ancestors().next() - } - - /// Return the grandparent `Expr` of the current `Expr`, if any. - pub fn expr_grandparent(&self) -> Option<&'a Expr> { - self.expr_ancestors().nth(1) - } - - /// Return an [`Iterator`] over the current `Expr` parents. - pub fn expr_ancestors(&self) -> impl Iterator + '_ { - self.expr_id + /// Returns an [`Iterator`] over the current statement hierarchy, from the current [`Stmt`] + /// through to any parents. + pub fn current_statements(&self) -> impl Iterator + '_ { + self.statement_id .iter() - .copied() .flat_map(|id| { - self.exprs - .ancestor_ids(id) - .skip(1) - .map(|id| &self.exprs[id]) + self.statements + .ancestor_ids(*id) + .map(|id| &self.statements[id]) }) .copied() } - /// Returns a reference to the global scope + /// Return the parent `Stmt` of the current `Stmt`, if any. + pub fn current_statement_parent(&self) -> Option<&'a Stmt> { + self.current_statements().nth(1) + } + + /// Return the grandparent `Stmt` of the current `Stmt`, if any. + pub fn current_statement_grandparent(&self) -> Option<&'a Stmt> { + self.current_statements().nth(2) + } + + /// Return the current `Expr`. + pub fn current_expression(&self) -> Option<&'a Expr> { + let node_id = self.expression_id?; + Some(self.expressions[node_id]) + } + + /// Returns an [`Iterator`] over the current statement hierarchy, from the current [`Expr`] + /// through to any parents. + pub fn current_expressions(&self) -> impl Iterator + '_ { + self.expression_id + .iter() + .flat_map(|id| { + self.expressions + .ancestor_ids(*id) + .map(|id| &self.expressions[id]) + }) + .copied() + } + + /// Return the parent [`Expr`] of the current [`Expr`], if any. + pub fn current_expression_parent(&self) -> Option<&'a Expr> { + self.current_expressions().nth(1) + } + + /// Return the grandparent [`Expr`] of the current [`Expr`], if any. + pub fn current_expression_grandparent(&self) -> Option<&'a Expr> { + self.current_expressions().nth(2) + } + + /// Returns a reference to the global [`Scope`]. pub fn global_scope(&self) -> &Scope<'a> { self.scopes.global() } - /// Returns a mutable reference to the global scope + /// Returns a mutable reference to the global [`Scope`]. pub fn global_scope_mut(&mut self) -> &mut Scope<'a> { self.scopes.global_mut() } - /// Returns the current top most scope. - pub fn scope(&self) -> &Scope<'a> { + /// Returns the current top-most [`Scope`]. + pub fn current_scope(&self) -> &Scope<'a> { &self.scopes[self.scope_id] } - /// Returns the parent of the given scope, if any. + /// Returns a mutable reference to the current top-most [`Scope`]. + pub fn current_scope_mut(&mut self) -> &mut Scope<'a> { + &mut self.scopes[self.scope_id] + } + + /// Returns an iterator over all scopes, starting from the current [`Scope`]. + pub fn current_scopes(&self) -> impl Iterator { + self.scopes.ancestors(self.scope_id) + } + + /// Returns the parent of the given [`Scope`], if any. pub fn parent_scope(&self, scope: &Scope) -> Option<&Scope<'a>> { scope.parent.map(|scope_id| &self.scopes[scope_id]) } - /// Returns the first parent of the given scope that is not a [`ScopeKind::Type`] scope, if any. + /// Returns the first parent of the given [`Scope`] that is not of [`ScopeKind::Type`], if any. pub fn first_non_type_parent_scope(&self, scope: &Scope) -> Option<&Scope<'a>> { let mut current_scope = scope; while let Some(parent) = self.parent_scope(current_scope) { @@ -886,22 +919,6 @@ impl<'a> SemanticModel<'a> { None } - /// Returns a mutable reference to the current top most scope. - pub fn scope_mut(&mut self) -> &mut Scope<'a> { - &mut self.scopes[self.scope_id] - } - - /// Returns an iterator over all scopes, starting from the current scope. - pub fn scopes(&self) -> impl Iterator { - self.scopes.ancestors(self.scope_id) - } - - /// Returns an iterator over all parent statements. - pub fn parents(&self) -> impl Iterator + '_ { - let node_id = self.stmt_id.expect("No current statement"); - self.stmts.ancestor_ids(node_id).map(|id| self.stmts[id]) - } - /// Set the [`Globals`] for the current [`Scope`]. pub fn set_globals(&mut self, globals: Globals<'a>) { // If any global bindings don't already exist in the global scope, add them. @@ -916,7 +933,7 @@ impl<'a> SemanticModel<'a> { range: *range, references: Vec::new(), scope: self.scope_id, - source: self.stmt_id, + source: self.statement_id, context: self.execution_context(), exceptions: self.exceptions(), flags: BindingFlags::empty(), @@ -964,13 +981,13 @@ impl<'a> SemanticModel<'a> { pub fn at_top_level(&self) -> bool { self.scope_id.is_global() && self - .stmt_id - .map_or(true, |stmt_id| self.stmts.parent_id(stmt_id).is_none()) + .statement_id + .map_or(true, |stmt_id| self.statements.parent_id(stmt_id).is_none()) } /// Return `true` if the model is in an async context. pub fn in_async_context(&self) -> bool { - for scope in self.scopes() { + for scope in self.current_scopes() { if scope.kind.is_async_function() { return true; } @@ -1048,8 +1065,8 @@ impl<'a> SemanticModel<'a> { pub fn snapshot(&self) -> Snapshot { Snapshot { scope_id: self.scope_id, - stmt_id: self.stmt_id, - expr_id: self.expr_id, + stmt_id: self.statement_id, + expr_id: self.expression_id, definition_id: self.definition_id, flags: self.flags, } @@ -1065,8 +1082,8 @@ impl<'a> SemanticModel<'a> { flags, } = snapshot; self.scope_id = scope_id; - self.stmt_id = stmt_id; - self.expr_id = expr_id; + self.statement_id = stmt_id; + self.expression_id = expr_id; self.definition_id = definition_id; self.flags = flags; } From 61d3977f95498f90f7ffe96b661adc9de495f7c7 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 11:02:14 -0400 Subject: [PATCH 008/155] Make the `statement` vector private on `SemanticModel` (#6348) ## Summary Instead, expose these as methods, now that we can use a reasonable nomenclature on the API. --- .../checkers/ast/analyze/deferred_scopes.rs | 12 +++++---- crates/ruff/src/checkers/ast/mod.rs | 2 +- .../rules/unused_private_type_definition.rs | 8 +++--- .../runtime_import_in_type_checking_block.rs | 8 +++--- .../rules/typing_only_runtime_import.rs | 8 +++--- .../perflint/rules/unnecessary_list_cast.rs | 2 +- .../src/rules/pyflakes/rules/unused_import.rs | 7 +++--- .../rules/pyflakes/rules/unused_variable.rs | 6 ++--- crates/ruff_python_semantic/src/binding.rs | 2 +- crates/ruff_python_semantic/src/model.rs | 25 ++++++++++++++++++- 10 files changed, 55 insertions(+), 25 deletions(-) diff --git a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs index b9c6e56601..bcb655a16b 100644 --- a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs +++ b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs @@ -115,7 +115,7 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { branch_detection::different_forks( left, right, - &checker.semantic.statements, + checker.semantic.statements(), ) }) }) { @@ -172,12 +172,14 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { continue; } + let Some(source) = shadowed.source else { + continue; + }; + // If this is an overloaded function, abort. if shadowed.kind.is_function_definition() && visibility::is_overload( - cast::decorator_list( - checker.semantic.statements[shadowed.source.unwrap()], - ), + cast::decorator_list(checker.semantic.statement(source)), &checker.semantic, ) { @@ -202,7 +204,7 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { branch_detection::different_forks( left, right, - &checker.semantic.statements, + checker.semantic.statements(), ) }) }) { diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs index e604047ccf..4b6972ead1 100644 --- a/crates/ruff/src/checkers/ast/mod.rs +++ b/crates/ruff/src/checkers/ast/mod.rs @@ -202,7 +202,7 @@ impl<'a> Checker<'a> { /// thus be applied whenever we delete a statement, but can otherwise be omitted. pub(crate) fn isolation(&self, parent: Option<&Stmt>) -> IsolationLevel { parent - .and_then(|stmt| self.semantic.statements.node_id(stmt)) + .and_then(|stmt| self.semantic.statement_id(stmt)) .map_or(IsolationLevel::default(), |node_id| { IsolationLevel::Group(node_id.into()) }) diff --git a/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs b/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs index 4d90d77371..481aa88671 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/unused_private_type_definition.rs @@ -174,7 +174,7 @@ pub(crate) fn unused_private_type_var( continue; }; let Stmt::Assign(ast::StmtAssign { targets, value, .. }) = - checker.semantic().statements[source] + checker.semantic().statement(source) else { continue; }; @@ -218,7 +218,7 @@ pub(crate) fn unused_private_protocol( continue; }; - let Stmt::ClassDef(class_def) = checker.semantic().statements[source] else { + let Stmt::ClassDef(class_def) = checker.semantic().statement(source) else { continue; }; @@ -261,7 +261,7 @@ pub(crate) fn unused_private_type_alias( }; let Stmt::AnnAssign(ast::StmtAnnAssign { target, annotation, .. - }) = checker.semantic().statements[source] + }) = checker.semantic().statement(source) else { continue; }; @@ -305,7 +305,7 @@ pub(crate) fn unused_private_typed_dict( let Some(source) = binding.source else { continue; }; - let Stmt::ClassDef(class_def) = checker.semantic().statements[source] else { + let Stmt::ClassDef(class_def) = checker.semantic().statement(source) else { continue; }; diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs index 5fc6722cf0..e351b3b5fb 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs @@ -193,11 +193,13 @@ struct ImportBinding<'a> { /// Generate a [`Fix`] to remove runtime imports from a type-checking block. fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { - let statement = checker.semantic().statements[statement_id]; - let parent = checker.semantic().statements.parent(statement); + let statement = checker.semantic().statement(statement_id); + let parent = checker.semantic().parent_statement(statement); + let member_names: Vec> = imports .iter() - .map(|ImportBinding { import, .. }| import.member_name()) + .map(|ImportBinding { import, .. }| import) + .map(Imported::member_name) .collect(); // Find the first reference across all imports. diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs index 15a7f658c2..821bfa9ed4 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs @@ -403,11 +403,13 @@ fn is_exempt(name: &str, exempt_modules: &[&str]) -> bool { /// Generate a [`Fix`] to remove typing-only imports from a runtime context. fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { - let statement = checker.semantic().statements[statement_id]; - let parent = checker.semantic().statements.parent(statement); + let statement = checker.semantic().statement(statement_id); + let parent = checker.semantic().parent_statement(statement); + let member_names: Vec> = imports .iter() - .map(|ImportBinding { import, .. }| import.member_name()) + .map(|ImportBinding { import, .. }| import) + .map(Imported::member_name) .collect(); // Find the first reference across all imports. diff --git a/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs b/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs index 67551e0988..94385fca3b 100644 --- a/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs +++ b/crates/ruff/src/rules/perflint/rules/unnecessary_list_cast.rs @@ -107,7 +107,7 @@ pub(crate) fn unnecessary_list_cast(checker: &mut Checker, iter: &Expr) { let binding = checker.semantic().binding(binding_id); if binding.kind.is_assignment() || binding.kind.is_named_expr_assignment() { if let Some(parent_id) = binding.source { - let parent = checker.semantic().statements[parent_id]; + let parent = checker.semantic().statement(parent_id); if let Stmt::Assign(ast::StmtAssign { value, .. }) | Stmt::AnnAssign(ast::StmtAnnAssign { value: Some(value), .. diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs index 22d39f3e23..580167bde3 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs @@ -226,12 +226,13 @@ struct ImportBinding<'a> { /// Generate a [`Fix`] to remove unused imports from a statement. fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { - let statement = checker.semantic().statements[statement_id]; - let parent = checker.semantic().statements.parent(statement); + let statement = checker.semantic().statement(statement_id); + let parent = checker.semantic().parent_statement(statement); let member_names: Vec> = imports .iter() - .map(|ImportBinding { import, .. }| import.member_name()) + .map(|ImportBinding { import, .. }| import) + .map(Imported::member_name) .collect(); let edit = autofix::edits::remove_unused_imports( diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs index 911582c29e..69c44529af 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs @@ -326,9 +326,9 @@ pub(crate) fn unused_variable(checker: &Checker, scope: &Scope, diagnostics: &mu let mut diagnostic = Diagnostic::new(UnusedVariable { name }, range); if checker.patch(diagnostic.kind.rule()) { if let Some(source) = source { - let stmt = checker.semantic().statements[source]; - let parent = checker.semantic().statements.parent(stmt); - if let Some(fix) = remove_unused_variable(stmt, parent, range, checker) { + let statement = checker.semantic().statement(source); + let parent = checker.semantic().parent_statement(statement); + if let Some(fix) = remove_unused_variable(statement, parent, range, checker) { diagnostic.set_fix(fix); } } diff --git a/crates/ruff_python_semantic/src/binding.rs b/crates/ruff_python_semantic/src/binding.rs index ef06cce239..ecbba9c3d7 100644 --- a/crates/ruff_python_semantic/src/binding.rs +++ b/crates/ruff_python_semantic/src/binding.rs @@ -185,7 +185,7 @@ impl<'a> Binding<'a> { /// Returns the range of the binding's parent. pub fn parent_range(&self, semantic: &SemanticModel) -> Option { self.source - .map(|node_id| semantic.statements[node_id]) + .map(|statement_id| semantic.statement(statement_id)) .and_then(|parent| { if parent.is_import_from_stmt() { Some(parent.range()) diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index 5238269da3..e1c1ebdfaf 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -31,7 +31,7 @@ pub struct SemanticModel<'a> { module_path: Option<&'a [String]>, /// Stack of all visited statements. - pub statements: Nodes<'a, Stmt>, + statements: Nodes<'a, Stmt>, /// The identifier of the current statement. statement_id: Option, @@ -919,6 +919,29 @@ impl<'a> SemanticModel<'a> { None } + /// Return the [`Nodes`] vector of all statements. + pub const fn statements(&self) -> &Nodes<'a, Stmt> { + &self.statements + } + + /// Return the [`NodeId`] corresponding to the given [`Stmt`]. + #[inline] + pub fn statement_id(&self, statement: &Stmt) -> Option { + self.statements.node_id(statement) + } + + /// Return the [`Stmt]` corresponding to the given [`NodeId`]. + #[inline] + pub fn statement(&self, statement_id: NodeId) -> &'a Stmt { + self.statements[statement_id] + } + + /// Given a [`Stmt`], return its parent, if any. + #[inline] + pub fn parent_statement(&self, statement: &'a Stmt) -> Option<&'a Stmt> { + self.statements.parent(statement) + } + /// Set the [`Globals`] for the current [`Scope`]. pub fn set_globals(&mut self, globals: Globals<'a>) { // If any global bindings don't already exist in the global scope, add them. From b21abe0a571faae499beb37053811fad9ae040b5 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 11:27:42 -0400 Subject: [PATCH 009/155] Use separate structs for expression and statement tracking (#6351) ## Summary This PR fixes the performance degradation introduced in https://github.com/astral-sh/ruff/pull/6345. Instead of using the generic `Nodes` structs, we now use separate `Statement` and `Expression` structs. Importantly, we can avoid tracking a bunch of state for expressions that we need for parents: we don't need to track reference-to-ID pointers (we just have no use-case for this -- I'd actually like to remove this from statements too, but we need it for branch detection right now), we don't need to track depth, etc. In my testing, this entirely removes the regression on all-rules, and gets us down to 2ms slower on the default rules (as a crude hyperfine benchmark, so this is within margin of error IMO). No behavioral changes. --- .../runtime_import_in_type_checking_block.rs | 19 ++-- .../rules/typing_only_runtime_import.rs | 12 +- .../src/rules/pyflakes/rules/unused_import.rs | 16 ++- .../rules/pyflakes/rules/unused_variable.rs | 6 +- .../src/analyze/branch_detection.rs | 22 ++-- crates/ruff_python_semantic/src/binding.rs | 4 +- .../ruff_python_semantic/src/expressions.rs | 58 ++++++++++ crates/ruff_python_semantic/src/lib.rs | 6 +- crates/ruff_python_semantic/src/model.rs | 38 ++++--- crates/ruff_python_semantic/src/node.rs | 105 ------------------ crates/ruff_python_semantic/src/statements.rs | 94 ++++++++++++++++ 11 files changed, 223 insertions(+), 157 deletions(-) create mode 100644 crates/ruff_python_semantic/src/expressions.rs delete mode 100644 crates/ruff_python_semantic/src/node.rs create mode 100644 crates/ruff_python_semantic/src/statements.rs diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs index e351b3b5fb..05c9550c9a 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs @@ -1,11 +1,12 @@ -use anyhow::Result; -use ruff_text_size::TextRange; -use rustc_hash::FxHashMap; use std::borrow::Cow; +use anyhow::Result; +use rustc_hash::FxHashMap; + use ruff_diagnostics::{AutofixKind, Diagnostic, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::{AnyImport, Imported, NodeId, ResolvedReferenceId, Scope}; +use ruff_python_semantic::{AnyImport, Imported, ResolvedReferenceId, Scope, StatementId}; +use ruff_text_size::TextRange; use crate::autofix; use crate::checkers::ast::Checker; @@ -70,8 +71,8 @@ pub(crate) fn runtime_import_in_type_checking_block( diagnostics: &mut Vec, ) { // Collect all runtime imports by statement. - let mut errors_by_statement: FxHashMap> = FxHashMap::default(); - let mut ignores_by_statement: FxHashMap> = FxHashMap::default(); + let mut errors_by_statement: FxHashMap> = FxHashMap::default(); + let mut ignores_by_statement: FxHashMap> = FxHashMap::default(); for binding_id in scope.binding_ids() { let binding = checker.semantic().binding(binding_id); @@ -192,7 +193,11 @@ struct ImportBinding<'a> { } /// Generate a [`Fix`] to remove runtime imports from a type-checking block. -fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { +fn fix_imports( + checker: &Checker, + statement_id: StatementId, + imports: &[ImportBinding], +) -> Result { let statement = checker.semantic().statement(statement_id); let parent = checker.semantic().parent_statement(statement); diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs index 821bfa9ed4..bdba8bc11a 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs @@ -5,7 +5,7 @@ use rustc_hash::FxHashMap; use ruff_diagnostics::{AutofixKind, Diagnostic, DiagnosticKind, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::{AnyImport, Binding, Imported, NodeId, ResolvedReferenceId, Scope}; +use ruff_python_semantic::{AnyImport, Binding, Imported, ResolvedReferenceId, Scope, StatementId}; use ruff_text_size::TextRange; use crate::autofix; @@ -190,9 +190,9 @@ pub(crate) fn typing_only_runtime_import( diagnostics: &mut Vec, ) { // Collect all typing-only imports by statement and import type. - let mut errors_by_statement: FxHashMap<(NodeId, ImportType), Vec> = + let mut errors_by_statement: FxHashMap<(StatementId, ImportType), Vec> = FxHashMap::default(); - let mut ignores_by_statement: FxHashMap<(NodeId, ImportType), Vec> = + let mut ignores_by_statement: FxHashMap<(StatementId, ImportType), Vec> = FxHashMap::default(); for binding_id in scope.binding_ids() { @@ -402,7 +402,11 @@ fn is_exempt(name: &str, exempt_modules: &[&str]) -> bool { } /// Generate a [`Fix`] to remove typing-only imports from a runtime context. -fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { +fn fix_imports( + checker: &Checker, + statement_id: StatementId, + imports: &[ImportBinding], +) -> Result { let statement = checker.semantic().statement(statement_id); let parent = checker.semantic().parent_statement(statement); diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs index 580167bde3..93285307df 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs @@ -1,10 +1,11 @@ +use std::borrow::Cow; + use anyhow::Result; use rustc_hash::FxHashMap; -use std::borrow::Cow; use ruff_diagnostics::{AutofixKind, Diagnostic, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::{AnyImport, Exceptions, Imported, NodeId, Scope}; +use ruff_python_semantic::{AnyImport, Exceptions, Imported, Scope, StatementId}; use ruff_text_size::TextRange; use crate::autofix; @@ -98,8 +99,9 @@ impl Violation for UnusedImport { pub(crate) fn unused_import(checker: &Checker, scope: &Scope, diagnostics: &mut Vec) { // Collect all unused imports by statement. - let mut unused: FxHashMap<(NodeId, Exceptions), Vec> = FxHashMap::default(); - let mut ignored: FxHashMap<(NodeId, Exceptions), Vec> = FxHashMap::default(); + let mut unused: FxHashMap<(StatementId, Exceptions), Vec> = FxHashMap::default(); + let mut ignored: FxHashMap<(StatementId, Exceptions), Vec> = + FxHashMap::default(); for binding_id in scope.binding_ids() { let binding = checker.semantic().binding(binding_id); @@ -225,7 +227,11 @@ struct ImportBinding<'a> { } /// Generate a [`Fix`] to remove unused imports from a statement. -fn fix_imports(checker: &Checker, statement_id: NodeId, imports: &[ImportBinding]) -> Result { +fn fix_imports( + checker: &Checker, + statement_id: StatementId, + imports: &[ImportBinding], +) -> Result { let statement = checker.semantic().statement(statement_id); let parent = checker.semantic().parent_statement(statement); diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs index 69c44529af..dae4923c4f 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs @@ -1,13 +1,13 @@ use itertools::Itertools; -use ruff_python_ast::{self as ast, PySourceType, Ranged, Stmt}; -use ruff_python_parser::{lexer, AsMode, Tok}; -use ruff_text_size::{TextRange, TextSize}; use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::helpers::contains_effect; +use ruff_python_ast::{self as ast, PySourceType, Ranged, Stmt}; +use ruff_python_parser::{lexer, AsMode, Tok}; use ruff_python_semantic::Scope; use ruff_source_file::Locator; +use ruff_text_size::{TextRange, TextSize}; use crate::autofix::edits::delete_stmt; use crate::checkers::ast::Checker; diff --git a/crates/ruff_python_semantic/src/analyze/branch_detection.rs b/crates/ruff_python_semantic/src/analyze/branch_detection.rs index 3e68dc20b9..97c6b2b9f9 100644 --- a/crates/ruff_python_semantic/src/analyze/branch_detection.rs +++ b/crates/ruff_python_semantic/src/analyze/branch_detection.rs @@ -3,15 +3,15 @@ use std::iter; use ruff_python_ast::{self as ast, ExceptHandler, Stmt}; -use crate::node::{NodeId, Nodes}; +use crate::statements::{StatementId, Statements}; /// Return the common ancestor of `left` and `right` below `stop`, or `None`. fn common_ancestor( - left: NodeId, - right: NodeId, - stop: Option, - node_tree: &Nodes, -) -> Option { + left: StatementId, + right: StatementId, + stop: Option, + node_tree: &Statements, +) -> Option { if stop.is_some_and(|stop| left == stop || right == stop) { return None; } @@ -83,13 +83,13 @@ fn alternatives(stmt: &Stmt) -> Vec> { /// Return `true` if `stmt` is a descendent of any of the nodes in `ancestors`. fn descendant_of<'a>( - stmt: NodeId, + stmt: StatementId, ancestors: &[&'a Stmt], - stop: NodeId, - node_tree: &Nodes<'a, Stmt>, + stop: StatementId, + node_tree: &Statements<'a>, ) -> bool { ancestors.iter().any(|ancestor| { - node_tree.node_id(ancestor).is_some_and(|ancestor| { + node_tree.statement_id(ancestor).is_some_and(|ancestor| { common_ancestor(stmt, ancestor, Some(stop), node_tree).is_some() }) }) @@ -97,7 +97,7 @@ fn descendant_of<'a>( /// Return `true` if `left` and `right` are on different branches of an `if` or /// `try` statement. -pub fn different_forks(left: NodeId, right: NodeId, node_tree: &Nodes) -> bool { +pub fn different_forks(left: StatementId, right: StatementId, node_tree: &Statements) -> bool { if let Some(ancestor) = common_ancestor(left, right, None, node_tree) { for items in alternatives(node_tree[ancestor]) { let l = descendant_of(left, &items, ancestor, node_tree); diff --git a/crates/ruff_python_semantic/src/binding.rs b/crates/ruff_python_semantic/src/binding.rs index ecbba9c3d7..8194640fff 100644 --- a/crates/ruff_python_semantic/src/binding.rs +++ b/crates/ruff_python_semantic/src/binding.rs @@ -11,8 +11,8 @@ use ruff_text_size::TextRange; use crate::context::ExecutionContext; use crate::model::SemanticModel; -use crate::node::NodeId; use crate::reference::ResolvedReferenceId; +use crate::statements::StatementId; use crate::ScopeId; #[derive(Debug, Clone)] @@ -24,7 +24,7 @@ pub struct Binding<'a> { /// The context in which the [`Binding`] was created. pub context: ExecutionContext, /// The statement in which the [`Binding`] was defined. - pub source: Option, + pub source: Option, /// The references to the [`Binding`]. pub references: Vec, /// The exceptions that were handled when the [`Binding`] was defined. diff --git a/crates/ruff_python_semantic/src/expressions.rs b/crates/ruff_python_semantic/src/expressions.rs new file mode 100644 index 0000000000..344e6d073b --- /dev/null +++ b/crates/ruff_python_semantic/src/expressions.rs @@ -0,0 +1,58 @@ +use std::ops::Index; + +use ruff_index::{newtype_index, IndexVec}; +use ruff_python_ast::Expr; + +/// Id uniquely identifying an expression in a program. +/// +/// Using a `u32` is sufficient because Ruff only supports parsing documents with a size of max +/// `u32::max` and it is impossible to have more nodes than characters in the file. We use a +/// `NonZeroU32` to take advantage of memory layout optimizations. +#[newtype_index] +#[derive(Ord, PartialOrd)] +pub struct ExpressionId; + +/// An [`Expr`] AST node in a program, along with a pointer to its parent expression (if any). +#[derive(Debug)] +struct ExpressionWithParent<'a> { + /// A pointer to the AST node. + node: &'a Expr, + /// The ID of the parent of this node, if any. + parent: Option, +} + +/// The nodes of a program indexed by [`ExpressionId`] +#[derive(Debug, Default)] +pub struct Expressions<'a> { + nodes: IndexVec>, +} + +impl<'a> Expressions<'a> { + /// Inserts a new expression into the node tree and returns its unique id. + pub(crate) fn insert(&mut self, node: &'a Expr, parent: Option) -> ExpressionId { + self.nodes.push(ExpressionWithParent { node, parent }) + } + + /// Return the [`ExpressionId`] of the parent node. + #[inline] + pub fn parent_id(&self, node_id: ExpressionId) -> Option { + self.nodes[node_id].parent + } + + /// Returns an iterator over all [`ExpressionId`] ancestors, starting from the given [`ExpressionId`]. + pub(crate) fn ancestor_ids( + &self, + node_id: ExpressionId, + ) -> impl Iterator + '_ { + std::iter::successors(Some(node_id), |&node_id| self.nodes[node_id].parent) + } +} + +impl<'a> Index for Expressions<'a> { + type Output = &'a Expr; + + #[inline] + fn index(&self, index: ExpressionId) -> &Self::Output { + &self.nodes[index].node + } +} diff --git a/crates/ruff_python_semantic/src/lib.rs b/crates/ruff_python_semantic/src/lib.rs index 3b7ce9a7a5..7fd04143d4 100644 --- a/crates/ruff_python_semantic/src/lib.rs +++ b/crates/ruff_python_semantic/src/lib.rs @@ -2,19 +2,21 @@ pub mod analyze; mod binding; mod context; mod definition; +mod expressions; mod globals; mod model; -mod node; mod reference; mod scope; mod star_import; +mod statements; pub use binding::*; pub use context::*; pub use definition::*; +pub use expressions::*; pub use globals::*; pub use model::*; -pub use node::*; pub use reference::*; pub use scope::*; pub use star_import::*; +pub use statements::*; diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index e1c1ebdfaf..707ac323a1 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -17,13 +17,15 @@ use crate::binding::{ }; use crate::context::ExecutionContext; use crate::definition::{Definition, DefinitionId, Definitions, Member, Module}; +use crate::expressions::{ExpressionId, Expressions}; use crate::globals::{Globals, GlobalsArena}; -use crate::node::{NodeId, Nodes}; use crate::reference::{ - ResolvedReference, ResolvedReferenceId, ResolvedReferences, UnresolvedReferences, + ResolvedReference, ResolvedReferenceId, ResolvedReferences, UnresolvedReference, + UnresolvedReferenceFlags, UnresolvedReferences, }; use crate::scope::{Scope, ScopeId, ScopeKind, Scopes}; -use crate::{Imported, UnresolvedReference, UnresolvedReferenceFlags}; +use crate::statements::{StatementId, Statements}; +use crate::Imported; /// A semantic model for a Python module, to enable querying the module's semantic information. pub struct SemanticModel<'a> { @@ -31,16 +33,16 @@ pub struct SemanticModel<'a> { module_path: Option<&'a [String]>, /// Stack of all visited statements. - statements: Nodes<'a, Stmt>, + statements: Statements<'a>, /// The identifier of the current statement. - statement_id: Option, + statement_id: Option, /// Stack of all visited expressions. - expressions: Nodes<'a, Expr>, + expressions: Expressions<'a>, /// The identifier of the current expression. - expression_id: Option, + expression_id: Option, /// Stack of all scopes, along with the identifier of the current scope. pub scopes: Scopes<'a>, @@ -132,9 +134,9 @@ impl<'a> SemanticModel<'a> { Self { typing_modules, module_path: module.path(), - statements: Nodes::::default(), + statements: Statements::default(), statement_id: None, - expressions: Nodes::::default(), + expressions: Expressions::default(), expression_id: None, scopes: Scopes::default(), scope_id: ScopeId::global(), @@ -919,20 +921,20 @@ impl<'a> SemanticModel<'a> { None } - /// Return the [`Nodes`] vector of all statements. - pub const fn statements(&self) -> &Nodes<'a, Stmt> { + /// Return the [`Statements`] vector of all statements. + pub const fn statements(&self) -> &Statements<'a> { &self.statements } - /// Return the [`NodeId`] corresponding to the given [`Stmt`]. + /// Return the [`StatementId`] corresponding to the given [`Stmt`]. #[inline] - pub fn statement_id(&self, statement: &Stmt) -> Option { - self.statements.node_id(statement) + pub fn statement_id(&self, statement: &Stmt) -> Option { + self.statements.statement_id(statement) } - /// Return the [`Stmt]` corresponding to the given [`NodeId`]. + /// Return the [`Stmt]` corresponding to the given [`StatementId`]. #[inline] - pub fn statement(&self, statement_id: NodeId) -> &'a Stmt { + pub fn statement(&self, statement_id: StatementId) -> &'a Stmt { self.statements[statement_id] } @@ -1519,8 +1521,8 @@ impl SemanticModelFlags { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Snapshot { scope_id: ScopeId, - stmt_id: Option, - expr_id: Option, + stmt_id: Option, + expr_id: Option, definition_id: DefinitionId, flags: SemanticModelFlags, } diff --git a/crates/ruff_python_semantic/src/node.rs b/crates/ruff_python_semantic/src/node.rs deleted file mode 100644 index b7d4b82f94..0000000000 --- a/crates/ruff_python_semantic/src/node.rs +++ /dev/null @@ -1,105 +0,0 @@ -use std::ops::{Index, IndexMut}; - -use ruff_index::{newtype_index, IndexVec}; -use rustc_hash::FxHashMap; - -use ruff_python_ast::types::RefEquality; - -/// Id uniquely identifying an AST node in a program. -/// -/// Using a `u32` is sufficient because Ruff only supports parsing documents with a size of max `u32::max` -/// and it is impossible to have more nodes than characters in the file. We use a `NonZeroU32` to -/// take advantage of memory layout optimizations. -#[newtype_index] -#[derive(Ord, PartialOrd)] -pub struct NodeId; - -/// A [`Node`] represents an AST node in a program, along with a pointer to its parent (if any). -#[derive(Debug)] -struct Node<'a, T> { - /// A pointer to the AST node. - node: &'a T, - /// The ID of the parent of this node, if any. - parent: Option, - /// The depth of this node in the tree. - depth: u32, -} - -/// The nodes of a program indexed by [`NodeId`] -#[derive(Debug)] -pub struct Nodes<'a, T> { - nodes: IndexVec>, - node_to_id: FxHashMap, NodeId>, -} - -impl<'a, T> Default for Nodes<'a, T> { - fn default() -> Self { - Self { - nodes: IndexVec::default(), - node_to_id: FxHashMap::default(), - } - } -} - -impl<'a, T> Nodes<'a, T> { - /// Inserts a new node into the node tree and returns its unique id. - /// - /// Panics if a node with the same pointer already exists. - pub(crate) fn insert(&mut self, node: &'a T, parent: Option) -> NodeId { - let next_id = self.nodes.next_index(); - if let Some(existing_id) = self.node_to_id.insert(RefEquality(node), next_id) { - panic!("Node already exists with id {existing_id:?}"); - } - self.nodes.push(Node { - node, - parent, - depth: parent.map_or(0, |parent| self.nodes[parent].depth + 1), - }) - } - - /// Returns the [`NodeId`] of the given node. - #[inline] - pub fn node_id(&self, node: &'a T) -> Option { - self.node_to_id.get(&RefEquality(node)).copied() - } - - /// Return the [`NodeId`] of the parent node. - #[inline] - pub fn parent_id(&self, node_id: NodeId) -> Option { - self.nodes[node_id].parent - } - - /// Return the parent of the given node. - pub fn parent(&self, node: &'a T) -> Option<&'a T> { - let node_id = self.node_to_id.get(&RefEquality(node))?; - let parent_id = self.nodes[*node_id].parent?; - Some(self[parent_id]) - } - - /// Return the depth of the node. - #[inline] - pub(crate) fn depth(&self, node_id: NodeId) -> u32 { - self.nodes[node_id].depth - } - - /// Returns an iterator over all [`NodeId`] ancestors, starting from the given [`NodeId`]. - pub(crate) fn ancestor_ids(&self, node_id: NodeId) -> impl Iterator + '_ { - std::iter::successors(Some(node_id), |&node_id| self.nodes[node_id].parent) - } -} - -impl<'a, T> Index for Nodes<'a, T> { - type Output = &'a T; - - #[inline] - fn index(&self, index: NodeId) -> &Self::Output { - &self.nodes[index].node - } -} - -impl<'a, T> IndexMut for Nodes<'a, T> { - #[inline] - fn index_mut(&mut self, index: NodeId) -> &mut Self::Output { - &mut self.nodes[index].node - } -} diff --git a/crates/ruff_python_semantic/src/statements.rs b/crates/ruff_python_semantic/src/statements.rs new file mode 100644 index 0000000000..71e1ed82cc --- /dev/null +++ b/crates/ruff_python_semantic/src/statements.rs @@ -0,0 +1,94 @@ +use std::ops::Index; + +use ruff_index::{newtype_index, IndexVec}; +use ruff_python_ast::Stmt; +use rustc_hash::FxHashMap; + +use ruff_python_ast::types::RefEquality; + +/// Id uniquely identifying a statement AST node. +/// +/// Using a `u32` is sufficient because Ruff only supports parsing documents with a size of max +/// `u32::max` and it is impossible to have more nodes than characters in the file. We use a +/// `NonZeroU32` to take advantage of memory layout optimizations. +#[newtype_index] +#[derive(Ord, PartialOrd)] +pub struct StatementId; + +/// A [`Stmt`] AST node, along with a pointer to its parent statement (if any). +#[derive(Debug)] +struct StatementWithParent<'a> { + /// A pointer to the AST node. + statement: &'a Stmt, + /// The ID of the parent of this node, if any. + parent: Option, + /// The depth of this node in the tree. + depth: u32, +} + +/// The statements of a program indexed by [`StatementId`] +#[derive(Debug, Default)] +pub struct Statements<'a> { + statements: IndexVec>, + statement_to_id: FxHashMap, StatementId>, +} + +impl<'a> Statements<'a> { + /// Inserts a new statement into the statement vector and returns its unique ID. + /// + /// Panics if a statement with the same pointer already exists. + pub(crate) fn insert( + &mut self, + statement: &'a Stmt, + parent: Option, + ) -> StatementId { + let next_id = self.statements.next_index(); + if let Some(existing_id) = self.statement_to_id.insert(RefEquality(statement), next_id) { + panic!("Statements already exists with ID: {existing_id:?}"); + } + self.statements.push(StatementWithParent { + statement, + parent, + depth: parent.map_or(0, |parent| self.statements[parent].depth + 1), + }) + } + + /// Returns the [`StatementId`] of the given statement. + #[inline] + pub fn statement_id(&self, statement: &'a Stmt) -> Option { + self.statement_to_id.get(&RefEquality(statement)).copied() + } + + /// Return the [`StatementId`] of the parent statement. + #[inline] + pub fn parent_id(&self, statement_id: StatementId) -> Option { + self.statements[statement_id].parent + } + + /// Return the parent of the given statement. + pub fn parent(&self, statement: &'a Stmt) -> Option<&'a Stmt> { + let statement_id = self.statement_to_id.get(&RefEquality(statement))?; + let parent_id = self.statements[*statement_id].parent?; + Some(self[parent_id]) + } + + /// Return the depth of the statement. + #[inline] + pub(crate) fn depth(&self, id: StatementId) -> u32 { + self.statements[id].depth + } + + /// Returns an iterator over all [`StatementId`] ancestors, starting from the given [`StatementId`]. + pub(crate) fn ancestor_ids(&self, id: StatementId) -> impl Iterator + '_ { + std::iter::successors(Some(id), |&id| self.statements[id].parent) + } +} + +impl<'a> Index for Statements<'a> { + type Output = &'a Stmt; + + #[inline] + fn index(&self, index: StatementId) -> &Self::Output { + &self.statements[index].statement + } +} From e4a46609251cab140a92be4b828eed79088ba3e5 Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Mon, 7 Aug 2023 21:01:02 +0530 Subject: [PATCH 010/155] Support help end escape command with priority (#6272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR adds support for help end escape command in the lexer. ### What are "help end escape commands"? First, the escape commands are special IPython syntax which enhances the functionality for the IPython REPL. There are 9 types of escape kinds which are recognized by the tokens which are present at the start of the command (`?`, `??`, `!`, `!!`, etc.). Here, the help command is using either the `?` or `??` token at the start (`?str.replace` for example). Those 2 tokens are also supported when they're at the end of the command (`str.replace?`), but the other tokens aren't supported in that position. There are mainly two types of help end escape commands: 1. Ending with either `?` or `??`, but it also starts with one of the escape tokens (`%matplotlib?`) 2. On the other hand, there's a stricter version for (1) which doesn't start with any escape tokens (`str.replace?`) This PR adds support for (1) while (2) will be supported in the parser. ### Priority Now, if the command starts and ends with an escape token, how do we decide the kind of this command? This is where priority comes into picture. This is simple as there's only one priority where `?`/`??` at the end takes priority over any other escape token and all of the other tokens are at the same priority. Remember that only `?`/`??` at the end is considered valid. This is mainly useful in the case where someone would want to invoke the help command on the magic command itself. For example, in `%matplotlib?` the help command takes priority which means that we want help for the `matplotlib` magic function instead of calling the magic function itself. ### Specification Here's where things get a bit tricky. What if there are question mark tokens at both ends. How do we decide if it's `Help` (`?`) kind or `Help2` (`??`) kind? | | Magic | Value | Kind | | --- | --- | --- | --- | | 1 | `?foo?` | `foo` | `Help` | | 2 | `??foo?` | `foo` | `Help` | | 3 | `?foo??` | `foo` | `Help2` | | 4 | `??foo??` | `foo` | `Help2` | | 5 | `???foo??` | `foo` | `Help2` | | 6 | `??foo???` | `foo???` | `Help2` | | 7 | `???foo???` | `?foo???` | `Help2` | Looking at the above table: - The question mark tokens on the right takes priority over the ones on the left but only if the number of question mark on the right is 1 or 2. - If there are more than 2 question mark tokens on the right side, then the left side is used to determine the same. - If the right side is used to determine the kind, then all of the question marks and whitespaces on the left side are ignored in the `value`, but if it’s the other way around, then all of the extra question marks are part of the `value`. ### References - IPython implementation using the regex: https://github.com/ipython/ipython/blob/292e3a23459ca965b8c1bfe2c3707044c510209a/IPython/core/inputtransformer2.py#L454-L462 - Priorities: https://github.com/ipython/ipython/blob/292e3a23459ca965b8c1bfe2c3707044c510209a/IPython/core/inputtransformer2.py#L466-L469 ## Test Plan Add a bunch of test cases for the lexer and verify that it matches the behavior of IPython transformer. resolves: #6357 --- crates/ruff_python_ast/src/nodes.rs | 36 +++- crates/ruff_python_parser/Cargo.toml | 2 +- crates/ruff_python_parser/src/lexer.rs | 191 ++++++++++++++++++ ..._parser__parser__tests__jupyter_magic.snap | 4 +- 4 files changed, 219 insertions(+), 14 deletions(-) diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs index 7ed613913f..d536ce8ca6 100644 --- a/crates/ruff_python_ast/src/nodes.rs +++ b/crates/ruff_python_ast/src/nodes.rs @@ -2348,17 +2348,7 @@ impl TryFrom<[char; 2]> for MagicKind { impl fmt::Display for MagicKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - MagicKind::Shell => f.write_str("!"), - MagicKind::ShCap => f.write_str("!!"), - MagicKind::Help => f.write_str("?"), - MagicKind::Help2 => f.write_str("??"), - MagicKind::Magic => f.write_str("%"), - MagicKind::Magic2 => f.write_str("%%"), - MagicKind::Quote => f.write_str(","), - MagicKind::Quote2 => f.write_str(";"), - MagicKind::Paren => f.write_str("/"), - } + f.write_str(self.as_str()) } } @@ -2376,6 +2366,30 @@ impl MagicKind { }; len.into() } + + /// Returns `true` if the kind is a help command i.e., `?` or `??`. + pub const fn is_help(self) -> bool { + matches!(self, MagicKind::Help | MagicKind::Help2) + } + + /// Returns `true` if the kind is a magic command i.e., `%` or `%%`. + pub const fn is_magic(self) -> bool { + matches!(self, MagicKind::Magic | MagicKind::Magic2) + } + + pub fn as_str(self) -> &'static str { + match self { + MagicKind::Shell => "!", + MagicKind::ShCap => "!!", + MagicKind::Help => "?", + MagicKind::Help2 => "??", + MagicKind::Magic => "%", + MagicKind::Magic2 => "%%", + MagicKind::Quote => ",", + MagicKind::Quote2 => ";", + MagicKind::Paren => "/", + } + } } #[derive(Clone, Debug, PartialEq, Eq, Hash)] diff --git a/crates/ruff_python_parser/Cargo.toml b/crates/ruff_python_parser/Cargo.toml index 052105013a..9fa52c06c9 100644 --- a/crates/ruff_python_parser/Cargo.toml +++ b/crates/ruff_python_parser/Cargo.toml @@ -14,7 +14,7 @@ build = "build.rs" [lib] [dependencies] -ruff_python_ast = { path = "../ruff_python_ast"} +ruff_python_ast = { path = "../ruff_python_ast" } ruff_text_size = { path = "../ruff_text_size" } anyhow = { workspace = true } diff --git a/crates/ruff_python_parser/src/lexer.rs b/crates/ruff_python_parser/src/lexer.rs index a65737c04f..48670d922b 100644 --- a/crates/ruff_python_parser/src/lexer.rs +++ b/crates/ruff_python_parser/src/lexer.rs @@ -428,6 +428,72 @@ impl<'source> Lexer<'source> { self.cursor.bump(); value.push('\\'); } + // Help end escape commands are those that end with 1 or 2 question marks. + // Here, we're only looking for a subset of help end escape commands which + // are the ones that has the escape token at the start of the line as well. + // On the other hand, we're not looking for help end escape commands that + // are strict in the sense that the escape token is only at the end. For example, + // + // * `%foo?` is recognized as a help end escape command but not as a strict one. + // * `foo?` is recognized as a strict help end escape command which is not + // lexed here but is identified at the parser level. + // + // Help end escape commands implemented in the IPython codebase using regex: + // https://github.com/ipython/ipython/blob/292e3a23459ca965b8c1bfe2c3707044c510209a/IPython/core/inputtransformer2.py#L454-L462 + '?' => { + self.cursor.bump(); + let mut question_count = 1u32; + while self.cursor.eat_char('?') { + question_count += 1; + } + + // The original implementation in the IPython codebase is based on regex which + // means that it's strict in the sense that it won't recognize a help end escape: + // * If there's any whitespace before the escape token (e.g. `%foo ?`) + // * If there are more than 2 question mark tokens (e.g. `%foo???`) + // which is what we're doing here as well. In that case, we'll continue with + // the prefixed escape token. + // + // Now, the whitespace and empty value check also makes sure that an empty + // command (e.g. `%?` or `? ??`, no value after/between the escape tokens) + // is not recognized as a help end escape command. So, `%?` and `? ??` are + // `MagicKind::Magic` and `MagicKind::Help` because of the initial `%` and `??` + // tokens. + if question_count > 2 + || value.chars().last().map_or(true, is_python_whitespace) + || !matches!(self.cursor.first(), '\n' | '\r' | EOF_CHAR) + { + // Not a help end escape command, so continue with the lexing. + value.reserve(question_count as usize); + for _ in 0..question_count { + value.push('?'); + } + continue; + } + + if kind.is_help() { + // If we've recognize this as a help end escape command, then + // any question mark token / whitespaces at the start are not + // considered as part of the value. + // + // For example, `??foo?` is recognized as `MagicKind::Help` and + // `value` is `foo` instead of `??foo`. + value = value.trim_start_matches([' ', '?']).to_string(); + } else if kind.is_magic() { + // Between `%` and `?` (at the end), the `?` takes priority + // over the `%` so `%foo?` is recognized as `MagicKind::Help` + // and `value` is `%foo` instead of `foo`. So, we need to + // insert the magic escape token at the start. + value.insert_str(0, kind.as_str()); + } + + let kind = match question_count { + 1 => MagicKind::Help, + 2 => MagicKind::Help2, + _ => unreachable!("`question_count` is always 1 or 2"), + }; + return Tok::MagicCommand { kind, value }; + } '\n' | '\r' | EOF_CHAR => { return Tok::MagicCommand { kind, value }; } @@ -1122,6 +1188,20 @@ fn is_identifier_continuation(c: char) -> bool { } } +/// Returns `true` for [whitespace](https://docs.python.org/3/reference/lexical_analysis.html#whitespace-between-tokens) +/// characters. +/// +/// This is the same as `ruff_python_trivia::is_python_whitespace` and is copied +/// here to avoid a circular dependency as `ruff_python_trivia` has a dev-dependency +/// on `ruff_python_lexer`. +const fn is_python_whitespace(c: char) -> bool { + matches!( + c, + // Space, tab, or form-feed + ' ' | '\t' | '\x0C' + ) +} + #[cfg(test)] mod tests { use num_bigint::BigInt; @@ -1355,6 +1435,117 @@ mod tests { ] ); } + + #[test] + fn test_jupyter_magic_help_end() { + let source = r" +?foo? +?? foo? +?? foo ? +?foo?? +??foo?? +???foo? +???foo?? +??foo??? +???foo??? +?? \ + foo? +?? \ +? +???? +%foo? +%foo?? +%%foo??? +!pwd?" + .trim(); + let tokens = lex_jupyter_source(source); + assert_eq!( + tokens, + [ + Tok::MagicCommand { + value: "foo".to_string(), + kind: MagicKind::Help, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo".to_string(), + kind: MagicKind::Help, + }, + Tok::Newline, + Tok::MagicCommand { + value: " foo ?".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo".to_string(), + kind: MagicKind::Help, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo???".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "?foo???".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo".to_string(), + kind: MagicKind::Help, + }, + Tok::Newline, + Tok::MagicCommand { + value: " ?".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "??".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "%foo".to_string(), + kind: MagicKind::Help, + }, + Tok::Newline, + Tok::MagicCommand { + value: "%foo".to_string(), + kind: MagicKind::Help2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "foo???".to_string(), + kind: MagicKind::Magic2, + }, + Tok::Newline, + Tok::MagicCommand { + value: "pwd".to_string(), + kind: MagicKind::Help, + }, + Tok::Newline, + ] + ); + } + #[test] fn test_jupyter_magic_indentation() { let source = r" diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap index adfa86aeed..895867df6e 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap @@ -49,14 +49,14 @@ Module( StmtLineMagic { range: 81..88, kind: Help, - value: "a.foo?", + value: "a.foo", }, ), LineMagic( StmtLineMagic { range: 89..100, kind: Help2, - value: "a.foo()??", + value: "a.foo()", }, ), LineMagic( From 93286068430e0229ca23588c270692c106a424cd Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 11:41:02 -0400 Subject: [PATCH 011/155] Remove `Statements#parent` (#6392) Discussed in https://github.com/astral-sh/ruff/pull/6351#discussion_r1284997065. --- .../rules/runtime_import_in_type_checking_block.rs | 2 +- .../rules/typing_only_runtime_import.rs | 2 +- crates/ruff/src/rules/pyflakes/rules/unused_import.rs | 2 +- .../ruff/src/rules/pyflakes/rules/unused_variable.rs | 6 +++--- crates/ruff_python_semantic/src/model.rs | 6 ++++-- crates/ruff_python_semantic/src/statements.rs | 11 ++--------- 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs index 05c9550c9a..f26f4fe929 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs @@ -199,7 +199,7 @@ fn fix_imports( imports: &[ImportBinding], ) -> Result { let statement = checker.semantic().statement(statement_id); - let parent = checker.semantic().parent_statement(statement); + let parent = checker.semantic().parent_statement(statement_id); let member_names: Vec> = imports .iter() diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs index bdba8bc11a..19b2f3472b 100644 --- a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs +++ b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs @@ -408,7 +408,7 @@ fn fix_imports( imports: &[ImportBinding], ) -> Result { let statement = checker.semantic().statement(statement_id); - let parent = checker.semantic().parent_statement(statement); + let parent = checker.semantic().parent_statement(statement_id); let member_names: Vec> = imports .iter() diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs index 93285307df..6f1413d555 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_import.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_import.rs @@ -233,7 +233,7 @@ fn fix_imports( imports: &[ImportBinding], ) -> Result { let statement = checker.semantic().statement(statement_id); - let parent = checker.semantic().parent_statement(statement); + let parent = checker.semantic().parent_statement(statement_id); let member_names: Vec> = imports .iter() diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs index dae4923c4f..e91407a7ca 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs @@ -325,9 +325,9 @@ pub(crate) fn unused_variable(checker: &Checker, scope: &Scope, diagnostics: &mu { let mut diagnostic = Diagnostic::new(UnusedVariable { name }, range); if checker.patch(diagnostic.kind.rule()) { - if let Some(source) = source { - let statement = checker.semantic().statement(source); - let parent = checker.semantic().parent_statement(statement); + if let Some(statement_id) = source { + let statement = checker.semantic().statement(statement_id); + let parent = checker.semantic().parent_statement(statement_id); if let Some(fix) = remove_unused_variable(statement, parent, range, checker) { diagnostic.set_fix(fix); } diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index 707ac323a1..2dc7e6e69b 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -940,8 +940,10 @@ impl<'a> SemanticModel<'a> { /// Given a [`Stmt`], return its parent, if any. #[inline] - pub fn parent_statement(&self, statement: &'a Stmt) -> Option<&'a Stmt> { - self.statements.parent(statement) + pub fn parent_statement(&self, statement_id: StatementId) -> Option<&'a Stmt> { + self.statements + .parent_id(statement_id) + .map(|id| self.statements[id]) } /// Set the [`Globals`] for the current [`Scope`]. diff --git a/crates/ruff_python_semantic/src/statements.rs b/crates/ruff_python_semantic/src/statements.rs index 71e1ed82cc..8388273bd7 100644 --- a/crates/ruff_python_semantic/src/statements.rs +++ b/crates/ruff_python_semantic/src/statements.rs @@ -1,10 +1,10 @@ use std::ops::Index; -use ruff_index::{newtype_index, IndexVec}; -use ruff_python_ast::Stmt; use rustc_hash::FxHashMap; +use ruff_index::{newtype_index, IndexVec}; use ruff_python_ast::types::RefEquality; +use ruff_python_ast::Stmt; /// Id uniquely identifying a statement AST node. /// @@ -65,13 +65,6 @@ impl<'a> Statements<'a> { self.statements[statement_id].parent } - /// Return the parent of the given statement. - pub fn parent(&self, statement: &'a Stmt) -> Option<&'a Stmt> { - let statement_id = self.statement_to_id.get(&RefEquality(statement))?; - let parent_id = self.statements[*statement_id].parent?; - Some(self[parent_id]) - } - /// Return the depth of the statement. #[inline] pub(crate) fn depth(&self, id: StatementId) -> u32 { From c895252aae7b82807b8d036bcf7393d938e58a82 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 12:04:50 -0400 Subject: [PATCH 012/155] Remove `RefEquality` (#6393) ## Summary See discussion in https://github.com/astral-sh/ruff/pull/6351#discussion_r1284996979. We can remove `RefEquality` entirely and instead use a text offset for statement keys, since no two statements can start at the same text offset. ## Test Plan `cargo test` --- .../pyupgrade/rules/yield_in_for_loop.rs | 12 +-- crates/ruff_python_ast/src/types.rs | 77 ------------------- crates/ruff_python_semantic/src/statements.rs | 27 +++++-- 3 files changed, 28 insertions(+), 88 deletions(-) diff --git a/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs b/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs index ddb832a4a5..12e686facb 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs @@ -4,9 +4,9 @@ use rustc_hash::FxHashMap; use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::statement_visitor::StatementVisitor; -use ruff_python_ast::types::RefEquality; use ruff_python_ast::visitor::Visitor; use ruff_python_ast::{statement_visitor, visitor}; +use ruff_python_semantic::StatementKey; use crate::checkers::ast::Checker; use crate::registry::AsRule; @@ -131,7 +131,7 @@ impl<'a> StatementVisitor<'a> for YieldFromVisitor<'a> { #[derive(Default)] struct ReferenceVisitor<'a> { parent: Option<&'a Stmt>, - references: FxHashMap, Vec<&'a str>>, + references: FxHashMap>, } impl<'a> Visitor<'a> for ReferenceVisitor<'a> { @@ -148,7 +148,7 @@ impl<'a> Visitor<'a> for ReferenceVisitor<'a> { if matches!(ctx, ExprContext::Load | ExprContext::Del) { if let Some(parent) = self.parent { self.references - .entry(RefEquality(parent)) + .entry(StatementKey::from(parent)) .or_default() .push(id); } @@ -177,9 +177,9 @@ pub(crate) fn yield_in_for_loop(checker: &mut Checker, stmt: &Stmt) { for item in yields { // If any of the bound names are used outside of the loop, don't rewrite. - if references.iter().any(|(stmt, names)| { - stmt != &RefEquality(item.stmt) - && stmt != &RefEquality(item.body) + if references.iter().any(|(statement, names)| { + *statement != StatementKey::from(item.stmt) + && *statement != StatementKey::from(item.body) && item.names.iter().any(|name| names.contains(name)) }) { continue; diff --git a/crates/ruff_python_ast/src/types.rs b/crates/ruff_python_ast/src/types.rs index 5243f94b42..32732ed6cb 100644 --- a/crates/ruff_python_ast/src/types.rs +++ b/crates/ruff_python_ast/src/types.rs @@ -1,5 +1,3 @@ -use std::ops::Deref; - use crate::{Expr, Stmt}; #[derive(Clone)] @@ -7,78 +5,3 @@ pub enum Node<'a> { Stmt(&'a Stmt), Expr(&'a Expr), } - -#[derive(Debug)] -pub struct RefEquality<'a, T>(pub &'a T); - -impl<'a, T> RefEquality<'a, T> { - // More specific implementation that keeps the `'a` lifetime. - // It's otherwise the same as [`AsRef::as_ref`] - #[allow(clippy::should_implement_trait)] - pub fn as_ref(&self) -> &'a T { - self.0 - } -} - -impl<'a, T> AsRef for RefEquality<'a, T> { - fn as_ref(&self) -> &T { - self.0 - } -} - -impl<'a, T> Clone for RefEquality<'a, T> { - fn clone(&self) -> Self { - *self - } -} - -impl<'a, T> Copy for RefEquality<'a, T> {} - -impl<'a, T> std::hash::Hash for RefEquality<'a, T> { - fn hash(&self, state: &mut H) - where - H: std::hash::Hasher, - { - (self.0 as *const T).hash(state); - } -} - -impl<'a, 'b, T> PartialEq> for RefEquality<'a, T> { - fn eq(&self, other: &RefEquality<'b, T>) -> bool { - std::ptr::eq(self.0, other.0) - } -} - -impl<'a, T> Eq for RefEquality<'a, T> {} - -impl<'a, T> Deref for RefEquality<'a, T> { - type Target = T; - - fn deref(&self) -> &T { - self.0 - } -} - -impl<'a> From<&RefEquality<'a, Stmt>> for &'a Stmt { - fn from(r: &RefEquality<'a, Stmt>) -> Self { - r.0 - } -} - -impl<'a> From<&RefEquality<'a, Expr>> for &'a Expr { - fn from(r: &RefEquality<'a, Expr>) -> Self { - r.0 - } -} - -impl<'a> From> for &'a Stmt { - fn from(r: RefEquality<'a, Stmt>) -> Self { - r.0 - } -} - -impl<'a> From> for &'a Expr { - fn from(r: RefEquality<'a, Expr>) -> Self { - r.0 - } -} diff --git a/crates/ruff_python_semantic/src/statements.rs b/crates/ruff_python_semantic/src/statements.rs index 8388273bd7..8295a04a7d 100644 --- a/crates/ruff_python_semantic/src/statements.rs +++ b/crates/ruff_python_semantic/src/statements.rs @@ -3,8 +3,8 @@ use std::ops::Index; use rustc_hash::FxHashMap; use ruff_index::{newtype_index, IndexVec}; -use ruff_python_ast::types::RefEquality; -use ruff_python_ast::Stmt; +use ruff_python_ast::{Ranged, Stmt}; +use ruff_text_size::TextSize; /// Id uniquely identifying a statement AST node. /// @@ -30,7 +30,19 @@ struct StatementWithParent<'a> { #[derive(Debug, Default)] pub struct Statements<'a> { statements: IndexVec>, - statement_to_id: FxHashMap, StatementId>, + statement_to_id: FxHashMap, +} + +/// A unique key for a statement AST node. No two statements can appear at the same location +/// in the source code, since compound statements must be delimited by _at least_ one character +/// (a colon), so the starting offset is a cheap and sufficient unique identifier. +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct StatementKey(TextSize); + +impl From<&Stmt> for StatementKey { + fn from(statement: &Stmt) -> Self { + Self(statement.start()) + } } impl<'a> Statements<'a> { @@ -43,7 +55,10 @@ impl<'a> Statements<'a> { parent: Option, ) -> StatementId { let next_id = self.statements.next_index(); - if let Some(existing_id) = self.statement_to_id.insert(RefEquality(statement), next_id) { + if let Some(existing_id) = self + .statement_to_id + .insert(StatementKey::from(statement), next_id) + { panic!("Statements already exists with ID: {existing_id:?}"); } self.statements.push(StatementWithParent { @@ -56,7 +71,9 @@ impl<'a> Statements<'a> { /// Returns the [`StatementId`] of the given statement. #[inline] pub fn statement_id(&self, statement: &'a Stmt) -> Option { - self.statement_to_id.get(&RefEquality(statement)).copied() + self.statement_to_id + .get(&StatementKey::from(statement)) + .copied() } /// Return the [`StatementId`] of the parent statement. From daefa74e9ad4014ed79f59b0a741a5bac2e5f0b7 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 12:36:02 -0400 Subject: [PATCH 013/155] Remove async AST node variants for `with`, `for`, and `def` (#6369) ## Summary Per the suggestion in https://github.com/astral-sh/ruff/discussions/6183, this PR removes `AsyncWith`, `AsyncFor`, and `AsyncFunctionDef`, replacing them with an `is_async` field on the non-async variants of those structs. Unlike an interpreter, we _generally_ have identical handling for these nodes, so separating them into distinct variants adds complexity from which we don't really benefit. This can be seen below, where we get to remove a _ton_ of code related to adding generic `Any*` wrappers, and a ton of duplicate branches for these cases. ## Test Plan `cargo test` is unchanged, apart from parser snapshots. --- crates/ruff/src/autofix/edits.rs | 5 +- .../ast/analyze/deferred_for_loops.rs | 25 ++- .../checkers/ast/analyze/deferred_scopes.rs | 10 +- .../src/checkers/ast/analyze/expression.rs | 2 +- .../src/checkers/ast/analyze/statement.rs | 38 +--- crates/ruff/src/checkers/ast/mod.rs | 37 ++-- crates/ruff/src/docstrings/extraction.rs | 3 +- .../src/rules/flake8_annotations/helpers.rs | 8 - .../rules/abstract_base_class.rs | 10 +- .../rules/function_uses_loop_variable.rs | 8 +- .../rules/jump_statement_in_finally.rs | 7 +- .../rules/iter_method_return_iterable.rs | 12 +- .../flake8_pyi/rules/non_self_return_type.rs | 4 +- .../flake8_pytest_style/rules/fixture.rs | 2 +- .../rules/flake8_pytest_style/rules/raises.rs | 7 +- .../src/rules/flake8_return/rules/function.rs | 7 +- .../ruff/src/rules/flake8_return/visitor.rs | 9 +- .../flake8_simplify/rules/ast_unary_op.rs | 6 +- .../rules/flake8_simplify/rules/ast_with.rs | 24 ++- .../rules/flake8_simplify/rules/fix_with.rs | 10 +- .../rules/reimplemented_builtin.rs | 2 +- .../rules/unused_arguments.rs | 7 - crates/ruff/src/rules/isort/block.rs | 25 +-- .../mccabe/rules/function_is_too_complex.rs | 9 +- .../pycodestyle/rules/lambda_assignment.rs | 2 + .../src/rules/pydocstyle/rules/sections.rs | 4 +- .../pyflakes/rules/break_outside_loop.rs | 6 +- .../pyflakes/rules/continue_outside_loop.rs | 6 +- .../rules/pyflakes/rules/undefined_local.rs | 2 +- .../rules/pyflakes/rules/unused_variable.rs | 2 +- crates/ruff/src/rules/pylint/helpers.rs | 9 +- .../rules/pylint/rules/continue_in_finally.rs | 9 +- .../rules/pylint/rules/redefined_loop_name.rs | 19 +- .../rules/pylint/rules/too_many_branches.rs | 1 - .../rules/pylint/rules/too_many_statements.rs | 4 +- .../pylint/rules/useless_else_on_loop.rs | 9 +- .../rules/yield_from_in_async_function.rs | 12 +- .../rules/super_call_with_parameters.rs | 2 +- .../pyupgrade/rules/yield_in_for_loop.rs | 71 ++++--- .../ruff/src/rules/ruff/rules/unreachable.rs | 20 +- .../rules/type_check_without_type_error.rs | 2 +- crates/ruff_python_ast/src/cast.rs | 20 +- crates/ruff_python_ast/src/comparable.rs | 72 +------ crates/ruff_python_ast/src/function.rs | 134 ------------- crates/ruff_python_ast/src/helpers.rs | 33 +--- crates/ruff_python_ast/src/identifier.rs | 6 +- crates/ruff_python_ast/src/lib.rs | 1 - crates/ruff_python_ast/src/node.rs | 183 ------------------ crates/ruff_python_ast/src/nodes.rs | 99 ++-------- .../ruff_python_ast/src/statement_visitor.rs | 10 - crates/ruff_python_ast/src/traversal.rs | 11 -- crates/ruff_python_ast/src/visitor.rs | 38 ---- .../ruff_python_ast/src/visitor/preorder.rs | 21 +- crates/ruff_python_codegen/src/generator.rs | 89 ++------- .../src/comments/placement.rs | 14 +- .../src/expression/expr_named_expr.rs | 1 - crates/ruff_python_formatter/src/generated.rs | 108 ----------- .../src/statement/mod.rs | 6 - .../src/statement/stmt_async_for.rs | 23 --- .../src/statement/stmt_async_function_def.rs | 24 --- .../src/statement/stmt_async_with.rs | 22 --- .../src/statement/stmt_for.rs | 106 ++-------- .../src/statement/stmt_function_def.rs | 71 ++----- .../src/statement/stmt_with.rs | 106 ++-------- .../src/statement/suite.rs | 5 +- crates/ruff_python_parser/src/python.lalrpop | 18 +- crates/ruff_python_parser/src/python.rs | 20 +- ...on_parser__context__tests__assign_for.snap | 1 + ...n_parser__context__tests__assign_with.snap | 1 + ...unction__tests__function_kw_only_args.snap | 1 + ...__function_kw_only_args_with_defaults.snap | 1 + ...er__function__tests__function_no_args.snap | 1 + ...__tests__function_no_args_with_ranges.snap | 1 + ..._tests__function_pos_and_kw_only_args.snap | 1 + ...on_pos_and_kw_only_args_with_defaults.snap | 1 + ...w_only_args_with_defaults_and_varargs.snap | 1 + ..._with_defaults_and_varargs_and_kwargs.snap | 1 + ...r__function__tests__function_pos_args.snap | 1 + ...ests__function_pos_args_with_defaults.snap | 1 + ..._tests__function_pos_args_with_ranges.snap | 1 + ...rser__parser__tests__decorator_ranges.snap | 1 + ..._parser__parser__tests__jupyter_magic.snap | 2 + ...on_parser__parser__tests__parse_class.snap | 2 + ...ser__tests__parse_function_definition.snap | 7 + ...ser__parser__tests__variadic_generics.snap | 1 + ...parser__parser__tests__with_statement.snap | 28 ++- .../src/analyze/visibility.rs | 80 ++++---- crates/ruff_python_semantic/src/definition.rs | 1 - crates/ruff_python_semantic/src/globals.rs | 2 +- crates/ruff_python_semantic/src/model.rs | 11 +- crates/ruff_python_semantic/src/scope.rs | 7 - 91 files changed, 375 insertions(+), 1478 deletions(-) delete mode 100644 crates/ruff_python_ast/src/function.rs delete mode 100644 crates/ruff_python_formatter/src/statement/stmt_async_for.rs delete mode 100644 crates/ruff_python_formatter/src/statement/stmt_async_function_def.rs delete mode 100644 crates/ruff_python_formatter/src/statement/stmt_async_with.rs diff --git a/crates/ruff/src/autofix/edits.rs b/crates/ruff/src/autofix/edits.rs index 17736349a5..6bdc112ffb 100644 --- a/crates/ruff/src/autofix/edits.rs +++ b/crates/ruff/src/autofix/edits.rs @@ -179,16 +179,13 @@ fn is_only(vec: &[T], value: &T) -> bool { fn is_lone_child(child: &Stmt, parent: &Stmt) -> bool { match parent { Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) | Stmt::ClassDef(ast::StmtClassDef { body, .. }) - | Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { + | Stmt::With(ast::StmtWith { body, .. }) => { if is_only(body, child) { return true; } } Stmt::For(ast::StmtFor { body, orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) | Stmt::While(ast::StmtWhile { body, orelse, .. }) => { if is_only(body, child) || is_only(orelse, child) { return true; diff --git a/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs b/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs index c9ed5be35d..8898e1df69 100644 --- a/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs +++ b/crates/ruff/src/checkers/ast/analyze/deferred_for_loops.rs @@ -11,21 +11,18 @@ pub(crate) fn deferred_for_loops(checker: &mut Checker) { for snapshot in for_loops { checker.semantic.restore(snapshot); - if let Stmt::For(ast::StmtFor { + let Stmt::For(ast::StmtFor { target, iter, body, .. - }) - | Stmt::AsyncFor(ast::StmtAsyncFor { - target, iter, body, .. - }) = &checker.semantic.current_statement() - { - if checker.enabled(Rule::UnusedLoopControlVariable) { - flake8_bugbear::rules::unused_loop_control_variable(checker, target, body); - } - if checker.enabled(Rule::IncorrectDictIterator) { - perflint::rules::incorrect_dict_iterator(checker, target, iter); - } - } else { - unreachable!("Expected Expr::For | Expr::AsyncFor"); + }) = checker.semantic.current_statement() + else { + unreachable!("Expected Stmt::For"); + }; + + if checker.enabled(Rule::UnusedLoopControlVariable) { + flake8_bugbear::rules::unused_loop_control_variable(checker, target, body); + } + if checker.enabled(Rule::IncorrectDictIterator) { + perflint::rules::incorrect_dict_iterator(checker, target, iter); } } } diff --git a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs index bcb655a16b..6ab4f74d30 100644 --- a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs +++ b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs @@ -241,10 +241,7 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { flake8_pyi::rules::unused_private_typed_dict(checker, scope, &mut diagnostics); } - if matches!( - scope.kind, - ScopeKind::Function(_) | ScopeKind::AsyncFunction(_) | ScopeKind::Lambda(_) - ) { + if matches!(scope.kind, ScopeKind::Function(_) | ScopeKind::Lambda(_)) { if checker.enabled(Rule::UnusedVariable) { pyflakes::rules::unused_variable(checker, scope, &mut diagnostics); } @@ -270,10 +267,7 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { } } - if matches!( - scope.kind, - ScopeKind::Function(_) | ScopeKind::AsyncFunction(_) | ScopeKind::Module - ) { + if matches!(scope.kind, ScopeKind::Function(_) | ScopeKind::Module) { if enforce_typing_imports { let runtime_imports: Vec<&Binding> = checker .semantic diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index 6398e14e87..038ded69c7 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -206,7 +206,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { } ExprContext::Store => { if checker.enabled(Rule::NonLowercaseVariableInFunction) { - if checker.semantic.current_scope().kind.is_any_function() { + if checker.semantic.current_scope().kind.is_function() { // Ignore globals. if !checker .semantic diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index eee23db997..db0fa91f56 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -70,22 +70,14 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } } Stmt::FunctionDef(ast::StmtFunctionDef { + is_async, name, decorator_list, returns, parameters, body, type_params, - .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - name, - decorator_list, - returns, - parameters, - body, - type_params, - .. + range: _, }) => { if checker.enabled(Rule::DjangoNonLeadingReceiverDecorator) { flake8_django::rules::non_leading_receiver_decorator(checker, decorator_list); @@ -151,11 +143,11 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { flake8_pyi::rules::non_self_return_type( checker, stmt, + *is_async, name, decorator_list, returns.as_ref().map(AsRef::as_ref), parameters, - stmt.is_async_function_def_stmt(), ); } if checker.enabled(Rule::CustomTypeVarReturnType) { @@ -181,12 +173,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } } if checker.enabled(Rule::BadExitAnnotation) { - flake8_pyi::rules::bad_exit_annotation( - checker, - stmt.is_async_function_def_stmt(), - name, - parameters, - ); + flake8_pyi::rules::bad_exit_annotation(checker, *is_async, name, parameters); } if checker.enabled(Rule::RedundantNumericUnion) { flake8_pyi::rules::redundant_numeric_union(checker, parameters); @@ -1097,8 +1084,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { pygrep_hooks::rules::non_existent_mock_method(checker, test); } } - Stmt::With(ast::StmtWith { items, body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { items, body, .. }) => { + Stmt::With(with_ @ ast::StmtWith { items, body, .. }) => { if checker.enabled(Rule::AssertRaisesException) { flake8_bugbear::rules::assert_raises_exception(checker, items); } @@ -1108,8 +1094,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.enabled(Rule::MultipleWithStatements) { flake8_simplify::rules::multiple_with_statements( checker, - stmt, - body, + with_, checker.semantic.current_statement_parent(), ); } @@ -1134,13 +1119,6 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { iter, orelse, .. - }) - | Stmt::AsyncFor(ast::StmtAsyncFor { - target, - body, - iter, - orelse, - .. }) => { if checker.any_enabled(&[Rule::UnusedLoopControlVariable, Rule::IncorrectDictIterator]) { @@ -1339,7 +1317,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if !checker .semantic .current_scopes() - .any(|scope| scope.kind.is_any_function()) + .any(|scope| scope.kind.is_function()) { if checker.enabled(Rule::UnprefixedTypeParam) { flake8_pyi::rules::prefix_type_params(checker, value, targets); @@ -1404,7 +1382,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if !checker .semantic .current_scopes() - .any(|scope| scope.kind.is_any_function()) + .any(|scope| scope.kind.is_function()) { flake8_pyi::rules::annotated_assignment_default_in_stub( checker, target, value, annotation, diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs index 4b6972ead1..030ea33af9 100644 --- a/crates/ruff/src/checkers/ast/mod.rs +++ b/crates/ruff/src/checkers/ast/mod.rs @@ -462,14 +462,6 @@ where returns, type_params, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - body, - parameters, - decorator_list, - type_params, - returns, - .. }) => { // Visit the decorators and arguments, but avoid the body, which will be // deferred. @@ -540,8 +532,7 @@ where self.semantic.push_scope(match &stmt { Stmt::FunctionDef(stmt) => ScopeKind::Function(stmt), - Stmt::AsyncFunctionDef(stmt) => ScopeKind::AsyncFunction(stmt), - _ => unreachable!("Expected Stmt::FunctionDef | Stmt::AsyncFunctionDef"), + _ => unreachable!("Expected Stmt::FunctionDef"), }); self.deferred.functions.push(self.semantic.snapshot()); @@ -743,8 +734,7 @@ where // Step 3: Clean-up match stmt { - Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { name, .. }) => { + Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) => { let scope_id = self.semantic.scope_id; self.deferred.scopes.push(scope_id); self.semantic.pop_scope(); // Function scope @@ -1626,7 +1616,7 @@ impl<'a> Checker<'a> { return; } - if matches!(parent, Stmt::For(_) | Stmt::AsyncFor(_)) { + if parent.is_for_stmt() { self.add_binding( id, expr.range(), @@ -1825,19 +1815,14 @@ impl<'a> Checker<'a> { for snapshot in deferred_functions { self.semantic.restore(snapshot); - match &self.semantic.current_statement() { - Stmt::FunctionDef(ast::StmtFunctionDef { - body, parameters, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - body, parameters, .. - }) => { - self.visit_parameters(parameters); - self.visit_body(body); - } - _ => { - unreachable!("Expected Stmt::FunctionDef | Stmt::AsyncFunctionDef") - } + if let Stmt::FunctionDef(ast::StmtFunctionDef { + body, parameters, .. + }) = self.semantic.current_statement() + { + self.visit_parameters(parameters); + self.visit_body(body); + } else { + unreachable!("Expected Stmt::FunctionDef") } } } diff --git a/crates/ruff/src/docstrings/extraction.rs b/crates/ruff/src/docstrings/extraction.rs index 3a2fdb7660..84cdba07e2 100644 --- a/crates/ruff/src/docstrings/extraction.rs +++ b/crates/ruff/src/docstrings/extraction.rs @@ -30,8 +30,7 @@ pub(crate) fn extract_docstring<'a>(definition: &'a Definition<'a>) -> Option<&' Definition::Module(module) => docstring_from(module.python_ast), Definition::Member(member) => { if let Stmt::ClassDef(ast::StmtClassDef { body, .. }) - | Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) = &member.stmt + | Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) = &member.stmt { docstring_from(body) } else { diff --git a/crates/ruff/src/rules/flake8_annotations/helpers.rs b/crates/ruff/src/rules/flake8_annotations/helpers.rs index b1572efd82..04ecc41290 100644 --- a/crates/ruff/src/rules/flake8_annotations/helpers.rs +++ b/crates/ruff/src/rules/flake8_annotations/helpers.rs @@ -15,14 +15,6 @@ pub(super) fn match_function_def( body, decorator_list, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - name, - parameters, - returns, - body, - decorator_list, - .. }) => ( name, parameters, diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/abstract_base_class.rs b/crates/ruff/src/rules/flake8_bugbear/rules/abstract_base_class.rs index 8b69b2cf61..43307aa5c1 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/abstract_base_class.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/abstract_base_class.rs @@ -159,18 +159,12 @@ pub(crate) fn abstract_base_class( continue; } - let (Stmt::FunctionDef(ast::StmtFunctionDef { + let Stmt::FunctionDef(ast::StmtFunctionDef { decorator_list, body, name: method_name, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - decorator_list, - body, - name: method_name, - .. - })) = stmt + }) = stmt else { continue; }; diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs b/crates/ruff/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs index 500acd9015..b0291c21b6 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs @@ -86,9 +86,6 @@ impl<'a> Visitor<'a> for SuspiciousVariablesVisitor<'a> { match stmt { Stmt::FunctionDef(ast::StmtFunctionDef { parameters, body, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - parameters, body, .. }) => { // Collect all loaded variable names. let mut visitor = LoadedNamesVisitor::default(); @@ -236,7 +233,7 @@ struct AssignedNamesVisitor<'a> { /// `Visitor` to collect all used identifiers in a statement. impl<'a> Visitor<'a> for AssignedNamesVisitor<'a> { fn visit_stmt(&mut self, stmt: &'a Stmt) { - if matches!(stmt, Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_)) { + if stmt.is_function_def_stmt() { // Don't recurse. return; } @@ -251,8 +248,7 @@ impl<'a> Visitor<'a> for AssignedNamesVisitor<'a> { } Stmt::AugAssign(ast::StmtAugAssign { target, .. }) | Stmt::AnnAssign(ast::StmtAnnAssign { target, .. }) - | Stmt::For(ast::StmtFor { target, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { target, .. }) => { + | Stmt::For(ast::StmtFor { target, .. }) => { let mut visitor = NamesFromAssignmentsVisitor::default(); visitor.visit_expr(target); self.names.extend(visitor.names); diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs b/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs index df83409f2e..2d796f4706 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs @@ -69,16 +69,13 @@ fn walk_stmt(checker: &mut Checker, body: &[Stmt], f: fn(&Stmt) -> bool) { )); } match stmt { - Stmt::While(ast::StmtWhile { body, .. }) - | Stmt::For(ast::StmtFor { body, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { body, .. }) => { + Stmt::While(ast::StmtWhile { body, .. }) | Stmt::For(ast::StmtFor { body, .. }) => { walk_stmt(checker, body, Stmt::is_return_stmt); } Stmt::If(ast::StmtIf { body, .. }) | Stmt::Try(ast::StmtTry { body, .. }) | Stmt::TryStar(ast::StmtTryStar { body, .. }) - | Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { + | Stmt::With(ast::StmtWith { body, .. }) => { walk_stmt(checker, body, f); } Stmt::Match(ast::StmtMatch { cases, .. }) => { diff --git a/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs b/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs index a3f9c1b2c1..1be0eec92f 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs @@ -49,14 +49,14 @@ use crate::checkers::ast::Checker; /// ``` #[violation] pub struct IterMethodReturnIterable { - async_: bool, + is_async: bool, } impl Violation for IterMethodReturnIterable { #[derive_message_formats] fn message(&self) -> String { - let IterMethodReturnIterable { async_ } = self; - if *async_ { + let IterMethodReturnIterable { is_async } = self; + if *is_async { format!("`__aiter__` methods should return an `AsyncIterator`, not an `AsyncIterable`") } else { format!("`__iter__` methods should return an `Iterator`, not an `Iterable`") @@ -91,7 +91,7 @@ pub(crate) fn iter_method_return_iterable(checker: &mut Checker, definition: &De returns }; - let async_ = match name.as_str() { + let is_async = match name.as_str() { "__iter__" => false, "__aiter__" => true, _ => return, @@ -101,7 +101,7 @@ pub(crate) fn iter_method_return_iterable(checker: &mut Checker, definition: &De .semantic() .resolve_call_path(annotation) .is_some_and(|call_path| { - if async_ { + if is_async { matches!( call_path.as_slice(), ["typing", "AsyncIterable"] | ["collections", "abc", "AsyncIterable"] @@ -115,7 +115,7 @@ pub(crate) fn iter_method_return_iterable(checker: &mut Checker, definition: &De }) { checker.diagnostics.push(Diagnostic::new( - IterMethodReturnIterable { async_ }, + IterMethodReturnIterable { is_async }, returns.range(), )); } diff --git a/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs b/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs index f4b9e32ea2..0f251297cb 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/non_self_return_type.rs @@ -113,11 +113,11 @@ impl Violation for NonSelfReturnType { pub(crate) fn non_self_return_type( checker: &mut Checker, stmt: &Stmt, + is_async: bool, name: &str, decorator_list: &[Decorator], returns: Option<&Expr>, parameters: &Parameters, - async_: bool, ) { let ScopeKind::Class(class_def) = checker.semantic().current_scope().kind else { return; @@ -138,7 +138,7 @@ pub(crate) fn non_self_return_type( return; } - if async_ { + if is_async { if name == "__aenter__" && is_name(returns, &class_def.name) && !is_final(&class_def.decorator_list, checker.semantic()) diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs index 63352d2ffa..0a95d0cb60 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs @@ -448,7 +448,7 @@ where self.has_return_with_value = true; } } - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) => {} + Stmt::FunctionDef(_) => {} _ => visitor::walk_stmt(self, stmt), } } diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs index c8c824648b..f44ad46824 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs @@ -195,12 +195,9 @@ pub(crate) fn complex_raises( if raises_called { let is_too_complex = if let [stmt] = body { match stmt { - Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { - is_non_trivial_with_body(body) - } + Stmt::With(ast::StmtWith { body, .. }) => is_non_trivial_with_body(body), // Allow function and class definitions to test decorators - Stmt::ClassDef(_) | Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) => false, + Stmt::ClassDef(_) | Stmt::FunctionDef(_) => false, stmt => is_compound_statement(stmt), } } else { diff --git a/crates/ruff/src/rules/flake8_return/rules/function.rs b/crates/ruff/src/rules/flake8_return/rules/function.rs index 00675beb65..90dfb25173 100644 --- a/crates/ruff/src/rules/flake8_return/rules/function.rs +++ b/crates/ruff/src/rules/flake8_return/rules/function.rs @@ -425,9 +425,7 @@ fn implicit_return(checker: &mut Checker, stmt: &Stmt) { } Stmt::Assert(ast::StmtAssert { test, .. }) if is_const_false(test) => {} Stmt::While(ast::StmtWhile { test, .. }) if is_const_true(test) => {} - Stmt::For(ast::StmtFor { orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { orelse, .. }) - | Stmt::While(ast::StmtWhile { orelse, .. }) => { + Stmt::For(ast::StmtFor { orelse, .. }) | Stmt::While(ast::StmtWhile { orelse, .. }) => { if let Some(last_stmt) = orelse.last() { implicit_return(checker, last_stmt); } else { @@ -454,8 +452,7 @@ fn implicit_return(checker: &mut Checker, stmt: &Stmt) { } } } - Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { + Stmt::With(ast::StmtWith { body, .. }) => { if let Some(last_stmt) = body.last() { implicit_return(checker, last_stmt); } diff --git a/crates/ruff/src/rules/flake8_return/visitor.rs b/crates/ruff/src/rules/flake8_return/visitor.rs index 80bc2f8d7d..775c3356e5 100644 --- a/crates/ruff/src/rules/flake8_return/visitor.rs +++ b/crates/ruff/src/rules/flake8_return/visitor.rs @@ -50,12 +50,6 @@ impl<'a> Visitor<'a> for ReturnVisitor<'a> { decorator_list, returns, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - parameters, - decorator_list, - returns, - .. }) => { // Visit the decorators, etc. self.sibling = Some(stmt); @@ -101,8 +95,7 @@ impl<'a> Visitor<'a> for ReturnVisitor<'a> { // x = f.read() // return x // ``` - Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { + Stmt::With(ast::StmtWith { body, .. }) => { if let Some(stmt_assign) = body.last().and_then(Stmt::as_assign_stmt) { self.stack .assignment_return diff --git a/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs b/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs index c2aa396b17..f5da2c443b 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/ast_unary_op.rs @@ -160,8 +160,7 @@ pub(crate) fn negation_with_equal_op( } // Avoid flagging issues in dunder implementations. - if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) - | ScopeKind::AsyncFunction(ast::StmtAsyncFunctionDef { name, .. }) = + if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) = &checker.semantic().current_scope().kind { if is_dunder_method(name) { @@ -218,8 +217,7 @@ pub(crate) fn negation_with_not_equal_op( } // Avoid flagging issues in dunder implementations. - if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) - | ScopeKind::AsyncFunction(ast::StmtAsyncFunctionDef { name, .. }) = + if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) = &checker.semantic().current_scope().kind { if is_dunder_method(name) { diff --git a/crates/ruff/src/rules/flake8_simplify/rules/ast_with.rs b/crates/ruff/src/rules/flake8_simplify/rules/ast_with.rs index 55c5d0d781..528b82e050 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/ast_with.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/ast_with.rs @@ -63,18 +63,22 @@ impl Violation for MultipleWithStatements { /// Returns a boolean indicating whether it's an async with statement, the items /// and body. fn next_with(body: &[Stmt]) -> Option<(bool, &[WithItem], &[Stmt])> { - match body { - [Stmt::With(ast::StmtWith { items, body, .. })] => Some((false, items, body)), - [Stmt::AsyncWith(ast::StmtAsyncWith { items, body, .. })] => Some((true, items, body)), - _ => None, - } + let [Stmt::With(ast::StmtWith { + is_async, + items, + body, + .. + })] = body + else { + return None; + }; + Some((*is_async, items, body)) } /// SIM117 pub(crate) fn multiple_with_statements( checker: &mut Checker, - with_stmt: &Stmt, - with_body: &[Stmt], + with_stmt: &ast::StmtWith, with_parent: Option<&Stmt>, ) { // Make sure we fix from top to bottom for nested with statements, e.g. for @@ -102,8 +106,8 @@ pub(crate) fn multiple_with_statements( } } - if let Some((is_async, items, body)) = next_with(with_body) { - if is_async != with_stmt.is_async_with_stmt() { + if let Some((is_async, items, body)) = next_with(&with_stmt.body) { + if is_async != with_stmt.is_async { // One of the statements is an async with, while the other is not, // we can't merge those statements. return; @@ -133,7 +137,7 @@ pub(crate) fn multiple_with_statements( if !checker .indexer() .comment_ranges() - .intersects(TextRange::new(with_stmt.start(), with_body[0].start())) + .intersects(TextRange::new(with_stmt.start(), with_stmt.body[0].start())) { match fix_with::fix_multiple_with_statements( checker.locator(), diff --git a/crates/ruff/src/rules/flake8_simplify/rules/fix_with.rs b/crates/ruff/src/rules/flake8_simplify/rules/fix_with.rs index d5dc5ca9d8..36d1f6eb96 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/fix_with.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/fix_with.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Result}; use libcst_native::{CompoundStatement, Statement, Suite, With}; -use ruff_python_ast::Ranged; +use ruff_python_ast::{self as ast, Ranged}; use crate::autofix::codemods::CodegenStylist; use ruff_diagnostics::Edit; @@ -14,15 +14,15 @@ use crate::cst::matchers::{match_function_def, match_indented_block, match_state pub(crate) fn fix_multiple_with_statements( locator: &Locator, stylist: &Stylist, - stmt: &ruff_python_ast::Stmt, + with_stmt: &ast::StmtWith, ) -> Result { // Infer the indentation of the outer block. - let Some(outer_indent) = whitespace::indentation(locator, stmt) else { + let Some(outer_indent) = whitespace::indentation(locator, with_stmt) else { bail!("Unable to fix multiline statement"); }; // Extract the module text. - let contents = locator.lines(stmt.range()); + let contents = locator.lines(with_stmt.range()); // If the block is indented, "embed" it in a function definition, to preserve // indentation while retaining valid source code. (We'll strip the prefix later @@ -82,7 +82,7 @@ pub(crate) fn fix_multiple_with_statements( .to_string() }; - let range = locator.lines_range(stmt.range()); + let range = locator.lines_range(with_stmt.range()); Ok(Edit::range_replacement(contents, range)) } diff --git a/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs b/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs index 989036b0e4..257c080349 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/reimplemented_builtin.rs @@ -60,7 +60,7 @@ impl Violation for ReimplementedBuiltin { /// SIM110, SIM111 pub(crate) fn convert_for_loop_to_any_all(checker: &mut Checker, stmt: &Stmt) { - if !checker.semantic().current_scope().kind.is_any_function() { + if !checker.semantic().current_scope().kind.is_function() { return; } diff --git a/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs b/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs index b6bc1e23b7..5699bf8e01 100644 --- a/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs +++ b/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs @@ -328,13 +328,6 @@ pub(crate) fn unused_arguments( body, decorator_list, .. - }) - | ScopeKind::AsyncFunction(ast::StmtAsyncFunctionDef { - name, - parameters, - body, - decorator_list, - .. }) => { match function_type::classify( name, diff --git a/crates/ruff/src/rules/isort/block.rs b/crates/ruff/src/rules/isort/block.rs index f5a2607d8b..3832444b4c 100644 --- a/crates/ruff/src/rules/isort/block.rs +++ b/crates/ruff/src/rules/isort/block.rs @@ -89,7 +89,7 @@ impl<'a> BlockBuilder<'a> { // sibling (i.e., as if the comment is the next statement, as // opposed to the class or function). match stmt { - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) => { + Stmt::FunctionDef(_) => { if helpers::has_comment_break(stmt, self.locator) { Trailer::Sibling } else { @@ -196,12 +196,6 @@ where } self.finalize(None); } - Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) => { - for stmt in body { - self.visit_stmt(stmt); - } - self.finalize(None); - } Stmt::ClassDef(ast::StmtClassDef { body, .. }) => { for stmt in body { self.visit_stmt(stmt); @@ -219,17 +213,6 @@ where } self.finalize(None); } - Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) => { - for stmt in body { - self.visit_stmt(stmt); - } - self.finalize(None); - - for stmt in orelse { - self.visit_stmt(stmt); - } - self.finalize(None); - } Stmt::While(ast::StmtWhile { body, orelse, .. }) => { for stmt in body { self.visit_stmt(stmt); @@ -261,12 +244,6 @@ where } self.finalize(None); } - Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { - for stmt in body { - self.visit_stmt(stmt); - } - self.finalize(None); - } Stmt::Match(ast::StmtMatch { cases, .. }) => { for match_case in cases { self.visit_match_case(match_case); diff --git a/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs b/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs index 927ae37b5c..60938d334c 100644 --- a/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs +++ b/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs @@ -82,14 +82,12 @@ fn get_complexity_number(stmts: &[Stmt]) -> usize { complexity += get_complexity_number(&clause.body); } } - Stmt::For(ast::StmtFor { body, orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) => { + Stmt::For(ast::StmtFor { body, orelse, .. }) => { complexity += 1; complexity += get_complexity_number(body); complexity += get_complexity_number(orelse); } - Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { + Stmt::With(ast::StmtWith { body, .. }) => { complexity += get_complexity_number(body); } Stmt::While(ast::StmtWhile { body, orelse, .. }) => { @@ -131,8 +129,7 @@ fn get_complexity_number(stmts: &[Stmt]) -> usize { complexity += get_complexity_number(body); } } - Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) => { + Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) => { complexity += 1; complexity += get_complexity_number(body); } diff --git a/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs b/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs index 7ae7764574..d06d032d4e 100644 --- a/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs +++ b/crates/ruff/src/rules/pycodestyle/rules/lambda_assignment.rs @@ -220,6 +220,7 @@ fn function( }) .collect::>(); let func = Stmt::FunctionDef(ast::StmtFunctionDef { + is_async: false, name: Identifier::new(name.to_string(), TextRange::default()), parameters: Box::new(Parameters { posonlyargs: new_posonlyargs, @@ -236,6 +237,7 @@ fn function( } } let func = Stmt::FunctionDef(ast::StmtFunctionDef { + is_async: false, name: Identifier::new(name.to_string(), TextRange::default()), parameters: Box::new(parameters.clone()), body: vec![body], diff --git a/crates/ruff/src/rules/pydocstyle/rules/sections.rs b/crates/ruff/src/rules/pydocstyle/rules/sections.rs index 001e5830ff..38f49dbdfe 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/sections.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/sections.rs @@ -1726,9 +1726,7 @@ fn missing_args(checker: &mut Checker, docstring: &Docstring, docstrings_args: & return; }; - let (Stmt::FunctionDef(ast::StmtFunctionDef { parameters, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { parameters, .. })) = stmt - else { + let Stmt::FunctionDef(ast::StmtFunctionDef { parameters, .. }) = stmt else { return; }; diff --git a/crates/ruff/src/rules/pyflakes/rules/break_outside_loop.rs b/crates/ruff/src/rules/pyflakes/rules/break_outside_loop.rs index cfe9323c43..0fb29fcc04 100644 --- a/crates/ruff/src/rules/pyflakes/rules/break_outside_loop.rs +++ b/crates/ruff/src/rules/pyflakes/rules/break_outside_loop.rs @@ -36,14 +36,12 @@ pub(crate) fn break_outside_loop<'a>( let mut child = stmt; for parent in parents { match parent { - Stmt::For(ast::StmtFor { orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { orelse, .. }) - | Stmt::While(ast::StmtWhile { orelse, .. }) => { + Stmt::For(ast::StmtFor { orelse, .. }) | Stmt::While(ast::StmtWhile { orelse, .. }) => { if !orelse.contains(child) { return None; } } - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) => { + Stmt::FunctionDef(_) | Stmt::ClassDef(_) => { break; } _ => {} diff --git a/crates/ruff/src/rules/pyflakes/rules/continue_outside_loop.rs b/crates/ruff/src/rules/pyflakes/rules/continue_outside_loop.rs index 5e773e4095..15a0accc9c 100644 --- a/crates/ruff/src/rules/pyflakes/rules/continue_outside_loop.rs +++ b/crates/ruff/src/rules/pyflakes/rules/continue_outside_loop.rs @@ -36,14 +36,12 @@ pub(crate) fn continue_outside_loop<'a>( let mut child = stmt; for parent in parents { match parent { - Stmt::For(ast::StmtFor { orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { orelse, .. }) - | Stmt::While(ast::StmtWhile { orelse, .. }) => { + Stmt::For(ast::StmtFor { orelse, .. }) | Stmt::While(ast::StmtWhile { orelse, .. }) => { if !orelse.contains(child) { return None; } } - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) => { + Stmt::FunctionDef(_) | Stmt::ClassDef(_) => { break; } _ => {} diff --git a/crates/ruff/src/rules/pyflakes/rules/undefined_local.rs b/crates/ruff/src/rules/pyflakes/rules/undefined_local.rs index 43c4eda595..e4f931a7bc 100644 --- a/crates/ruff/src/rules/pyflakes/rules/undefined_local.rs +++ b/crates/ruff/src/rules/pyflakes/rules/undefined_local.rs @@ -51,7 +51,7 @@ pub(crate) fn undefined_local( scope: &Scope, diagnostics: &mut Vec, ) { - if scope.kind.is_any_function() { + if scope.kind.is_function() { for (name, binding_id) in scope.bindings() { // If the variable shadows a binding in a parent scope... if let Some(shadowed_id) = checker.semantic().shadowed_binding(binding_id) { diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs index e91407a7ca..dd3ff4c7c7 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs @@ -299,7 +299,7 @@ fn remove_unused_variable( /// F841 pub(crate) fn unused_variable(checker: &Checker, scope: &Scope, diagnostics: &mut Vec) { - if scope.uses_locals() && scope.kind.is_any_function() { + if scope.uses_locals() && scope.kind.is_function() { return; } diff --git a/crates/ruff/src/rules/pylint/helpers.rs b/crates/ruff/src/rules/pylint/helpers.rs index 25ca39c544..60bb0dd223 100644 --- a/crates/ruff/src/rules/pylint/helpers.rs +++ b/crates/ruff/src/rules/pylint/helpers.rs @@ -24,16 +24,11 @@ pub(super) fn type_param_name(arguments: &Arguments) -> Option<&str> { pub(super) fn in_dunder_init(semantic: &SemanticModel, settings: &Settings) -> bool { let scope = semantic.current_scope(); - let (ScopeKind::Function(ast::StmtFunctionDef { + let ScopeKind::Function(ast::StmtFunctionDef { name, decorator_list, .. - }) - | ScopeKind::AsyncFunction(ast::StmtAsyncFunctionDef { - name, - decorator_list, - .. - })) = scope.kind + }) = scope.kind else { return false; }; diff --git a/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs b/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs index 90f75b83e4..8624f65304 100644 --- a/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs +++ b/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs @@ -69,11 +69,10 @@ fn traverse_body(checker: &mut Checker, body: &[Stmt]) { traverse_body(checker, body); traverse_body(checker, orelse); } - Stmt::For(ast::StmtFor { orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { orelse, .. }) - | Stmt::While(ast::StmtWhile { orelse, .. }) => traverse_body(checker, orelse), - Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { + Stmt::For(ast::StmtFor { orelse, .. }) | Stmt::While(ast::StmtWhile { orelse, .. }) => { + traverse_body(checker, orelse); + } + Stmt::With(ast::StmtWith { body, .. }) => { traverse_body(checker, body); } Stmt::Match(ast::StmtMatch { cases, .. }) => { diff --git a/crates/ruff/src/rules/pylint/rules/redefined_loop_name.rs b/crates/ruff/src/rules/pylint/rules/redefined_loop_name.rs index 870da016f6..23ec06ba31 100644 --- a/crates/ruff/src/rules/pylint/rules/redefined_loop_name.rs +++ b/crates/ruff/src/rules/pylint/rules/redefined_loop_name.rs @@ -147,9 +147,7 @@ impl<'a, 'b> StatementVisitor<'b> for InnerForWithAssignTargetsVisitor<'a, 'b> { fn visit_stmt(&mut self, stmt: &'b Stmt) { // Collect target expressions. match stmt { - // For and async for. - Stmt::For(ast::StmtFor { target, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { target, .. }) => { + Stmt::For(ast::StmtFor { target, .. }) => { self.assignment_targets.extend( assignment_targets_from_expr(target, self.dummy_variable_rgx).map(|expr| { ExprWithInnerBindingKind { @@ -159,7 +157,6 @@ impl<'a, 'b> StatementVisitor<'b> for InnerForWithAssignTargetsVisitor<'a, 'b> { }), ); } - // With. Stmt::With(ast::StmtWith { items, .. }) => { self.assignment_targets.extend( assignment_targets_from_with_items(items, self.dummy_variable_rgx).map( @@ -170,7 +167,6 @@ impl<'a, 'b> StatementVisitor<'b> for InnerForWithAssignTargetsVisitor<'a, 'b> { ), ); } - // Assignment, augmented assignment, and annotated assignment. Stmt::Assign(ast::StmtAssign { targets, value, .. }) => { // Check for single-target assignments which are of the // form `x = cast(..., x)`. @@ -217,8 +213,7 @@ impl<'a, 'b> StatementVisitor<'b> for InnerForWithAssignTargetsVisitor<'a, 'b> { // Decide whether to recurse. match stmt { // Don't recurse into blocks that create a new scope. - Stmt::ClassDef(_) => {} - Stmt::FunctionDef(_) => {} + Stmt::ClassDef(_) | Stmt::FunctionDef(_) => {} // Otherwise, do recurse. _ => { walk_stmt(self, stmt); @@ -339,8 +334,7 @@ fn assignment_targets_from_assign_targets<'a>( /// PLW2901 pub(crate) fn redefined_loop_name(checker: &mut Checker, stmt: &Stmt) { let (outer_assignment_targets, inner_assignment_targets) = match stmt { - Stmt::With(ast::StmtWith { items, body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { items, body, .. }) => { + Stmt::With(ast::StmtWith { items, body, .. }) => { let outer_assignment_targets: Vec = assignment_targets_from_with_items(items, &checker.settings.dummy_variable_rgx) .map(|expr| ExprWithOuterBindingKind { @@ -358,8 +352,7 @@ pub(crate) fn redefined_loop_name(checker: &mut Checker, stmt: &Stmt) { } (outer_assignment_targets, visitor.assignment_targets) } - Stmt::For(ast::StmtFor { target, body, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { target, body, .. }) => { + Stmt::For(ast::StmtFor { target, body, .. }) => { let outer_assignment_targets: Vec = assignment_targets_from_expr(target, &checker.settings.dummy_variable_rgx) .map(|expr| ExprWithOuterBindingKind { @@ -377,9 +370,7 @@ pub(crate) fn redefined_loop_name(checker: &mut Checker, stmt: &Stmt) { } (outer_assignment_targets, visitor.assignment_targets) } - _ => panic!( - "redefined_loop_name called on Statement that is not a With, For, AsyncWith, or AsyncFor" - ) + _ => panic!("redefined_loop_name called on Statement that is not a `With` or `For`"), }; let mut diagnostics = Vec::new(); diff --git a/crates/ruff/src/rules/pylint/rules/too_many_branches.rs b/crates/ruff/src/rules/pylint/rules/too_many_branches.rs index bc5e459e9f..2e6e220ec8 100644 --- a/crates/ruff/src/rules/pylint/rules/too_many_branches.rs +++ b/crates/ruff/src/rules/pylint/rules/too_many_branches.rs @@ -108,7 +108,6 @@ fn num_branches(stmts: &[Stmt]) -> usize { .sum::() } Stmt::For(ast::StmtFor { body, orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) | Stmt::While(ast::StmtWhile { body, orelse, .. }) => { 1 + num_branches(body) + (if orelse.is_empty() { diff --git a/crates/ruff/src/rules/pylint/rules/too_many_statements.rs b/crates/ruff/src/rules/pylint/rules/too_many_statements.rs index 0df12604ac..4088a9e473 100644 --- a/crates/ruff/src/rules/pylint/rules/too_many_statements.rs +++ b/crates/ruff/src/rules/pylint/rules/too_many_statements.rs @@ -78,8 +78,7 @@ fn num_statements(stmts: &[Stmt]) -> usize { count += num_statements(&clause.body); } } - Stmt::For(ast::StmtFor { body, orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) => { + Stmt::For(ast::StmtFor { body, orelse, .. }) => { count += num_statements(body); count += num_statements(orelse); } @@ -129,7 +128,6 @@ fn num_statements(stmts: &[Stmt]) -> usize { } } Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) | Stmt::With(ast::StmtWith { body, .. }) => { count += 1; count += num_statements(body); diff --git a/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs b/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs index 00b0caad33..bf290b59c5 100644 --- a/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs +++ b/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs @@ -63,8 +63,7 @@ fn loop_exits_early(body: &[Stmt]) -> bool { .iter() .any(|clause| loop_exits_early(&clause.body)) } - Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => loop_exits_early(body), + Stmt::With(ast::StmtWith { body, .. }) => loop_exits_early(body), Stmt::Match(ast::StmtMatch { cases, .. }) => cases .iter() .any(|MatchCase { body, .. }| loop_exits_early(body)), @@ -91,9 +90,9 @@ fn loop_exits_early(body: &[Stmt]) -> bool { }) => loop_exits_early(body), }) } - Stmt::For(ast::StmtFor { orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { orelse, .. }) - | Stmt::While(ast::StmtWhile { orelse, .. }) => loop_exits_early(orelse), + Stmt::For(ast::StmtFor { orelse, .. }) | Stmt::While(ast::StmtWhile { orelse, .. }) => { + loop_exits_early(orelse) + } Stmt::Break(_) => true, _ => false, }) diff --git a/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs b/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs index 723a927ed4..a94f388a03 100644 --- a/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs +++ b/crates/ruff/src/rules/pylint/rules/yield_from_in_async_function.rs @@ -1,7 +1,7 @@ -use ruff_python_ast::{ExprYieldFrom, Ranged}; - use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; +use ruff_python_ast::{self as ast, Ranged}; +use ruff_python_semantic::ScopeKind; use crate::checkers::ast::Checker; @@ -37,9 +37,11 @@ impl Violation for YieldFromInAsyncFunction { } /// PLE1700 -pub(crate) fn yield_from_in_async_function(checker: &mut Checker, expr: &ExprYieldFrom) { - let scope = checker.semantic().current_scope(); - if scope.kind.is_async_function() { +pub(crate) fn yield_from_in_async_function(checker: &mut Checker, expr: &ast::ExprYieldFrom) { + if matches!( + checker.semantic().current_scope().kind, + ScopeKind::Function(ast::StmtFunctionDef { is_async: true, .. }) + ) { checker .diagnostics .push(Diagnostic::new(YieldFromInAsyncFunction, expr.range())); diff --git a/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs b/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs index 457de15f0e..d8c6981aa0 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/super_call_with_parameters.rs @@ -83,7 +83,7 @@ pub(crate) fn super_call_with_parameters( let scope = checker.semantic().current_scope(); // Check: are we in a Function scope? - if !scope.kind.is_any_function() { + if !scope.kind.is_function() { return; } diff --git a/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs b/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs index 12e686facb..acf96c59be 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/yield_in_for_loop.rs @@ -1,10 +1,10 @@ -use ruff_python_ast::{self as ast, Expr, ExprContext, Ranged, Stmt}; use rustc_hash::FxHashMap; use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::statement_visitor::StatementVisitor; use ruff_python_ast::visitor::Visitor; +use ruff_python_ast::{self as ast, Expr, ExprContext, Ranged, Stmt}; use ruff_python_ast::{statement_visitor, visitor}; use ruff_python_semantic::StatementKey; @@ -120,7 +120,7 @@ impl<'a> StatementVisitor<'a> for YieldFromVisitor<'a> { } } } - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) => { + Stmt::FunctionDef(_) | Stmt::ClassDef(_) => { // Don't recurse into anything that defines a new scope. } _ => statement_visitor::walk_stmt(self, stmt), @@ -162,39 +162,46 @@ impl<'a> Visitor<'a> for ReferenceVisitor<'a> { /// UP028 pub(crate) fn yield_in_for_loop(checker: &mut Checker, stmt: &Stmt) { // Intentionally omit async functions. - if let Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) = stmt { - let yields = { - let mut visitor = YieldFromVisitor::default(); - visitor.visit_body(body); - visitor.yields - }; + let Stmt::FunctionDef(ast::StmtFunctionDef { + is_async: false, + body, + .. + }) = stmt + else { + return; + }; - let references = { - let mut visitor = ReferenceVisitor::default(); - visitor.visit_body(body); - visitor.references - }; + let yields = { + let mut visitor = YieldFromVisitor::default(); + visitor.visit_body(body); + visitor.yields + }; - for item in yields { - // If any of the bound names are used outside of the loop, don't rewrite. - if references.iter().any(|(statement, names)| { - *statement != StatementKey::from(item.stmt) - && *statement != StatementKey::from(item.body) - && item.names.iter().any(|name| names.contains(name)) - }) { - continue; - } + let references = { + let mut visitor = ReferenceVisitor::default(); + visitor.visit_body(body); + visitor.references + }; - let mut diagnostic = Diagnostic::new(YieldInForLoop, item.stmt.range()); - if checker.patch(diagnostic.kind.rule()) { - let contents = checker.locator().slice(item.iter.range()); - let contents = format!("yield from {contents}"); - diagnostic.set_fix(Fix::suggested(Edit::range_replacement( - contents, - item.stmt.range(), - ))); - } - checker.diagnostics.push(diagnostic); + for item in yields { + // If any of the bound names are used outside of the loop, don't rewrite. + if references.iter().any(|(statement, names)| { + *statement != StatementKey::from(item.stmt) + && *statement != StatementKey::from(item.body) + && item.names.iter().any(|name| names.contains(name)) + }) { + continue; } + + let mut diagnostic = Diagnostic::new(YieldInForLoop, item.stmt.range()); + if checker.patch(diagnostic.kind.rule()) { + let contents = checker.locator().slice(item.iter.range()); + let contents = format!("yield from {contents}"); + diagnostic.set_fix(Fix::suggested(Edit::range_replacement( + contents, + item.stmt.range(), + ))); + } + checker.diagnostics.push(diagnostic); } } diff --git a/crates/ruff/src/rules/ruff/rules/unreachable.rs b/crates/ruff/src/rules/ruff/rules/unreachable.rs index 5e2c94a226..b803fce617 100644 --- a/crates/ruff/src/rules/ruff/rules/unreachable.rs +++ b/crates/ruff/src/rules/ruff/rules/unreachable.rs @@ -2,8 +2,8 @@ use std::{fmt, iter, usize}; use log::error; use ruff_python_ast::{ - Expr, Identifier, MatchCase, Pattern, PatternMatchAs, Ranged, Stmt, StmtAsyncFor, - StmtAsyncWith, StmtFor, StmtMatch, StmtReturn, StmtTry, StmtTryStar, StmtWhile, StmtWith, + Expr, Identifier, MatchCase, Pattern, PatternMatchAs, Ranged, Stmt, StmtFor, StmtMatch, + StmtReturn, StmtTry, StmtTryStar, StmtWhile, StmtWith, }; use ruff_text_size::{TextRange, TextSize}; @@ -467,7 +467,6 @@ impl<'stmt> BasicBlocksBuilder<'stmt> { let next = match stmt { // Statements that continue to the next statement after execution. Stmt::FunctionDef(_) - | Stmt::AsyncFunctionDef(_) | Stmt::Import(_) | Stmt::ImportFrom(_) | Stmt::ClassDef(_) @@ -535,12 +534,6 @@ impl<'stmt> BasicBlocksBuilder<'stmt> { body, orelse, .. - }) - | Stmt::AsyncFor(StmtAsyncFor { - iter: condition, - body, - orelse, - .. }) => loop_block(self, Condition::Iterator(condition), body, orelse, after), Stmt::Try(StmtTry { body, @@ -566,8 +559,7 @@ impl<'stmt> BasicBlocksBuilder<'stmt> { let _ = (body, handlers, orelse, finalbody); // Silence unused code warnings. self.unconditional_next_block(after) } - Stmt::With(StmtWith { items, body, .. }) - | Stmt::AsyncWith(StmtAsyncWith { items, body, .. }) => { + Stmt::With(StmtWith { items, body, .. }) => { // TODO: handle `with` statements, see // . // I recommend to `try` statements first as `with` can desugar @@ -889,7 +881,6 @@ fn needs_next_block(stmts: &[Stmt]) -> bool { Stmt::Return(_) | Stmt::Raise(_) => false, Stmt::If(stmt) => needs_next_block(&stmt.body) || stmt.elif_else_clauses.last().map_or(true, |clause| needs_next_block(&clause.body)), Stmt::FunctionDef(_) - | Stmt::AsyncFunctionDef(_) | Stmt::Import(_) | Stmt::ImportFrom(_) | Stmt::ClassDef(_) @@ -905,10 +896,8 @@ fn needs_next_block(stmts: &[Stmt]) -> bool { | Stmt::Break(_) | Stmt::Continue(_) | Stmt::For(_) - | Stmt::AsyncFor(_) | Stmt::While(_) | Stmt::With(_) - | Stmt::AsyncWith(_) | Stmt::Match(_) | Stmt::Try(_) | Stmt::TryStar(_) @@ -923,7 +912,6 @@ fn needs_next_block(stmts: &[Stmt]) -> bool { fn is_control_flow_stmt(stmt: &Stmt) -> bool { match stmt { Stmt::FunctionDef(_) - | Stmt::AsyncFunctionDef(_) | Stmt::Import(_) | Stmt::ImportFrom(_) | Stmt::ClassDef(_) @@ -937,11 +925,9 @@ fn is_control_flow_stmt(stmt: &Stmt) -> bool { | Stmt::Pass(_) => false, Stmt::Return(_) | Stmt::For(_) - | Stmt::AsyncFor(_) | Stmt::While(_) | Stmt::If(_) | Stmt::With(_) - | Stmt::AsyncWith(_) | Stmt::Match(_) | Stmt::Raise(_) | Stmt::Try(_) diff --git a/crates/ruff/src/rules/tryceratops/rules/type_check_without_type_error.rs b/crates/ruff/src/rules/tryceratops/rules/type_check_without_type_error.rs index 208f9d3ff9..91e1d25b4c 100644 --- a/crates/ruff/src/rules/tryceratops/rules/type_check_without_type_error.rs +++ b/crates/ruff/src/rules/tryceratops/rules/type_check_without_type_error.rs @@ -55,7 +55,7 @@ where { fn visit_stmt(&mut self, stmt: &'b Stmt) { match stmt { - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) => { + Stmt::FunctionDef(_) | Stmt::ClassDef(_) => { // Don't recurse. } Stmt::Return(_) => self.returns.push(stmt), diff --git a/crates/ruff_python_ast/src/cast.rs b/crates/ruff_python_ast/src/cast.rs index 1b59f69b20..6246442ed7 100644 --- a/crates/ruff_python_ast/src/cast.rs +++ b/crates/ruff_python_ast/src/cast.rs @@ -1,19 +1,15 @@ use crate::{nodes, Decorator, Stmt}; pub fn name(stmt: &Stmt) -> &str { - match stmt { - Stmt::FunctionDef(nodes::StmtFunctionDef { name, .. }) - | Stmt::AsyncFunctionDef(nodes::StmtAsyncFunctionDef { name, .. }) => name.as_str(), - _ => panic!("Expected Stmt::FunctionDef | Stmt::AsyncFunctionDef"), - } + let Stmt::FunctionDef(nodes::StmtFunctionDef { name, .. }) = stmt else { + panic!("Expected Stmt::FunctionDef") + }; + name.as_str() } pub fn decorator_list(stmt: &Stmt) -> &[Decorator] { - match stmt { - Stmt::FunctionDef(nodes::StmtFunctionDef { decorator_list, .. }) - | Stmt::AsyncFunctionDef(nodes::StmtAsyncFunctionDef { decorator_list, .. }) => { - decorator_list - } - _ => panic!("Expected Stmt::FunctionDef | Stmt::AsyncFunctionDef"), - } + let Stmt::FunctionDef(nodes::StmtFunctionDef { decorator_list, .. }) = stmt else { + panic!("Expected Stmt::FunctionDef") + }; + decorator_list } diff --git a/crates/ruff_python_ast/src/comparable.rs b/crates/ruff_python_ast/src/comparable.rs index 107e079128..71b546a342 100644 --- a/crates/ruff_python_ast/src/comparable.rs +++ b/crates/ruff_python_ast/src/comparable.rs @@ -950,16 +950,7 @@ impl<'a> From<&'a ast::Expr> for ComparableExpr<'a> { #[derive(Debug, PartialEq, Eq, Hash)] pub struct StmtFunctionDef<'a> { - decorator_list: Vec>, - name: &'a str, - type_params: Option>, - parameters: ComparableParameters<'a>, - returns: Option>, - body: Vec>, -} - -#[derive(Debug, PartialEq, Eq, Hash)] -pub struct StmtAsyncFunctionDef<'a> { + is_async: bool, decorator_list: Vec>, name: &'a str, type_params: Option>, @@ -1084,14 +1075,7 @@ pub struct StmtAnnAssign<'a> { #[derive(Debug, PartialEq, Eq, Hash)] pub struct StmtFor<'a> { - target: ComparableExpr<'a>, - iter: ComparableExpr<'a>, - body: Vec>, - orelse: Vec>, -} - -#[derive(Debug, PartialEq, Eq, Hash)] -pub struct StmtAsyncFor<'a> { + is_async: bool, target: ComparableExpr<'a>, iter: ComparableExpr<'a>, body: Vec>, @@ -1114,12 +1098,7 @@ pub struct StmtIf<'a> { #[derive(Debug, PartialEq, Eq, Hash)] pub struct StmtWith<'a> { - items: Vec>, - body: Vec>, -} - -#[derive(Debug, PartialEq, Eq, Hash)] -pub struct StmtAsyncWith<'a> { + is_async: bool, items: Vec>, body: Vec>, } @@ -1194,7 +1173,6 @@ pub struct StmtLineMagic<'a> { #[derive(Debug, PartialEq, Eq, Hash)] pub enum ComparableStmt<'a> { FunctionDef(StmtFunctionDef<'a>), - AsyncFunctionDef(StmtAsyncFunctionDef<'a>), ClassDef(StmtClassDef<'a>), Return(StmtReturn<'a>), Delete(StmtDelete<'a>), @@ -1202,11 +1180,9 @@ pub enum ComparableStmt<'a> { AugAssign(StmtAugAssign<'a>), AnnAssign(StmtAnnAssign<'a>), For(StmtFor<'a>), - AsyncFor(StmtAsyncFor<'a>), While(StmtWhile<'a>), If(StmtIf<'a>), With(StmtWith<'a>), - AsyncWith(StmtAsyncWith<'a>), Match(StmtMatch<'a>), Raise(StmtRaise<'a>), Try(StmtTry<'a>), @@ -1228,6 +1204,7 @@ impl<'a> From<&'a ast::Stmt> for ComparableStmt<'a> { fn from(stmt: &'a ast::Stmt) -> Self { match stmt { ast::Stmt::FunctionDef(ast::StmtFunctionDef { + is_async, name, parameters, body, @@ -1236,22 +1213,7 @@ impl<'a> From<&'a ast::Stmt> for ComparableStmt<'a> { type_params, range: _, }) => Self::FunctionDef(StmtFunctionDef { - name: name.as_str(), - parameters: parameters.into(), - body: body.iter().map(Into::into).collect(), - decorator_list: decorator_list.iter().map(Into::into).collect(), - returns: returns.as_ref().map(Into::into), - type_params: type_params.as_ref().map(Into::into), - }), - ast::Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - name, - parameters, - body, - decorator_list, - returns, - type_params, - range: _, - }) => Self::AsyncFunctionDef(StmtAsyncFunctionDef { + is_async: *is_async, name: name.as_str(), parameters: parameters.into(), body: body.iter().map(Into::into).collect(), @@ -1320,24 +1282,14 @@ impl<'a> From<&'a ast::Stmt> for ComparableStmt<'a> { simple: *simple, }), ast::Stmt::For(ast::StmtFor { + is_async, target, iter, body, orelse, range: _, }) => Self::For(StmtFor { - target: target.into(), - iter: iter.into(), - body: body.iter().map(Into::into).collect(), - orelse: orelse.iter().map(Into::into).collect(), - }), - ast::Stmt::AsyncFor(ast::StmtAsyncFor { - target, - iter, - body, - orelse, - range: _, - }) => Self::AsyncFor(StmtAsyncFor { + is_async: *is_async, target: target.into(), iter: iter.into(), body: body.iter().map(Into::into).collect(), @@ -1364,18 +1316,12 @@ impl<'a> From<&'a ast::Stmt> for ComparableStmt<'a> { elif_else_clauses: elif_else_clauses.iter().map(Into::into).collect(), }), ast::Stmt::With(ast::StmtWith { + is_async, items, body, range: _, }) => Self::With(StmtWith { - items: items.iter().map(Into::into).collect(), - body: body.iter().map(Into::into).collect(), - }), - ast::Stmt::AsyncWith(ast::StmtAsyncWith { - items, - body, - range: _, - }) => Self::AsyncWith(StmtAsyncWith { + is_async: *is_async, items: items.iter().map(Into::into).collect(), body: body.iter().map(Into::into).collect(), }), diff --git a/crates/ruff_python_ast/src/function.rs b/crates/ruff_python_ast/src/function.rs deleted file mode 100644 index 96737bcf86..0000000000 --- a/crates/ruff_python_ast/src/function.rs +++ /dev/null @@ -1,134 +0,0 @@ -use crate::node::AnyNodeRef; -use crate::{ - Decorator, Expr, Identifier, Parameters, Ranged, StmtAsyncFunctionDef, StmtFunctionDef, Suite, - TypeParams, -}; -use ruff_text_size::TextRange; - -/// Enum that represents any python function definition. -#[derive(Copy, Clone, PartialEq, Debug)] -pub enum AnyFunctionDefinition<'a> { - FunctionDefinition(&'a StmtFunctionDef), - AsyncFunctionDefinition(&'a StmtAsyncFunctionDef), -} - -impl<'a> AnyFunctionDefinition<'a> { - pub const fn cast_ref(reference: AnyNodeRef<'a>) -> Option { - match reference { - AnyNodeRef::StmtAsyncFunctionDef(definition) => { - Some(Self::AsyncFunctionDefinition(definition)) - } - AnyNodeRef::StmtFunctionDef(definition) => Some(Self::FunctionDefinition(definition)), - _ => None, - } - } - - /// Returns `Some` if this is a [`StmtFunctionDef`] and `None` otherwise. - pub const fn as_function_definition(self) -> Option<&'a StmtFunctionDef> { - if let Self::FunctionDefinition(definition) = self { - Some(definition) - } else { - None - } - } - - /// Returns `Some` if this is a [`StmtAsyncFunctionDef`] and `None` otherwise. - pub const fn as_async_function_definition(self) -> Option<&'a StmtAsyncFunctionDef> { - if let Self::AsyncFunctionDefinition(definition) = self { - Some(definition) - } else { - None - } - } - - /// Returns the function's name - pub const fn name(self) -> &'a Identifier { - match self { - Self::FunctionDefinition(definition) => &definition.name, - Self::AsyncFunctionDefinition(definition) => &definition.name, - } - } - - /// Returns the function arguments (parameters). - pub fn arguments(self) -> &'a Parameters { - match self { - Self::FunctionDefinition(definition) => definition.parameters.as_ref(), - Self::AsyncFunctionDefinition(definition) => definition.parameters.as_ref(), - } - } - - /// Returns the function's body - pub const fn body(self) -> &'a Suite { - match self { - Self::FunctionDefinition(definition) => &definition.body, - Self::AsyncFunctionDefinition(definition) => &definition.body, - } - } - - /// Returns the decorators attributing the function. - pub fn decorators(self) -> &'a [Decorator] { - match self { - Self::FunctionDefinition(definition) => &definition.decorator_list, - Self::AsyncFunctionDefinition(definition) => &definition.decorator_list, - } - } - - pub fn returns(self) -> Option<&'a Expr> { - match self { - Self::FunctionDefinition(definition) => definition.returns.as_deref(), - Self::AsyncFunctionDefinition(definition) => definition.returns.as_deref(), - } - } - - pub fn type_params(self) -> Option<&'a TypeParams> { - match self { - Self::FunctionDefinition(definition) => definition.type_params.as_ref(), - Self::AsyncFunctionDefinition(definition) => definition.type_params.as_ref(), - } - } - - /// Returns `true` if this is [`Self::AsyncFunctionDefinition`] - pub const fn is_async(self) -> bool { - matches!(self, Self::AsyncFunctionDefinition(_)) - } -} - -impl Ranged for AnyFunctionDefinition<'_> { - fn range(&self) -> TextRange { - match self { - AnyFunctionDefinition::FunctionDefinition(definition) => definition.range(), - AnyFunctionDefinition::AsyncFunctionDefinition(definition) => definition.range(), - } - } -} - -impl<'a> From<&'a StmtFunctionDef> for AnyFunctionDefinition<'a> { - fn from(value: &'a StmtFunctionDef) -> Self { - Self::FunctionDefinition(value) - } -} - -impl<'a> From<&'a StmtAsyncFunctionDef> for AnyFunctionDefinition<'a> { - fn from(value: &'a StmtAsyncFunctionDef) -> Self { - Self::AsyncFunctionDefinition(value) - } -} - -impl<'a> From> for AnyNodeRef<'a> { - fn from(value: AnyFunctionDefinition<'a>) -> Self { - match value { - AnyFunctionDefinition::FunctionDefinition(function_def) => { - AnyNodeRef::StmtFunctionDef(function_def) - } - AnyFunctionDefinition::AsyncFunctionDefinition(async_def) => { - AnyNodeRef::StmtAsyncFunctionDef(async_def) - } - } - } -} - -impl<'a> From<&'a AnyFunctionDefinition<'a>> for AnyNodeRef<'a> { - fn from(value: &'a AnyFunctionDefinition<'a>) -> Self { - (*value).into() - } -} diff --git a/crates/ruff_python_ast/src/helpers.rs b/crates/ruff_python_ast/src/helpers.rs index d29a68b167..a7994a3b49 100644 --- a/crates/ruff_python_ast/src/helpers.rs +++ b/crates/ruff_python_ast/src/helpers.rs @@ -18,14 +18,11 @@ pub const fn is_compound_statement(stmt: &Stmt) -> bool { matches!( stmt, Stmt::FunctionDef(_) - | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) | Stmt::While(_) | Stmt::For(_) - | Stmt::AsyncFor(_) | Stmt::Match(_) | Stmt::With(_) - | Stmt::AsyncWith(_) | Stmt::If(_) | Stmt::Try(_) | Stmt::TryStar(_) @@ -321,14 +318,6 @@ where decorator_list, returns, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - parameters, - type_params, - body, - decorator_list, - returns, - .. }) => { parameters .posonlyargs @@ -439,13 +428,6 @@ where body, orelse, .. - }) - | Stmt::AsyncFor(ast::StmtAsyncFor { - target, - iter, - body, - orelse, - .. }) => { any_over_expr(target, func) || any_over_expr(iter, func) @@ -474,8 +456,7 @@ where || any_over_body(&clause.body, func) }) } - Stmt::With(ast::StmtWith { items, body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { items, body, .. }) => { + Stmt::With(ast::StmtWith { items, body, .. }) => { items.iter().any(|with_item| { any_over_expr(&with_item.context_expr, func) || with_item @@ -912,7 +893,7 @@ where { fn visit_stmt(&mut self, stmt: &'b Stmt) { match stmt { - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) => { + Stmt::FunctionDef(_) | Stmt::ClassDef(_) => { // Don't recurse. } Stmt::Return(stmt) => self.returns.push(stmt), @@ -941,11 +922,7 @@ where self.raises .push((stmt.range(), exc.as_deref(), cause.as_deref())); } - Stmt::ClassDef(_) - | Stmt::FunctionDef(_) - | Stmt::AsyncFunctionDef(_) - | Stmt::Try(_) - | Stmt::TryStar(_) => {} + Stmt::ClassDef(_) | Stmt::FunctionDef(_) | Stmt::Try(_) | Stmt::TryStar(_) => {} Stmt::If(ast::StmtIf { body, elif_else_clauses, @@ -958,9 +935,7 @@ where } Stmt::While(ast::StmtWhile { body, .. }) | Stmt::With(ast::StmtWith { body, .. }) - | Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) - | Stmt::For(ast::StmtFor { body, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { body, .. }) => { + | Stmt::For(ast::StmtFor { body, .. }) => { walk_body(self, body); } Stmt::Match(ast::StmtMatch { cases, .. }) => { diff --git a/crates/ruff_python_ast/src/identifier.rs b/crates/ruff_python_ast/src/identifier.rs index d5d18a9641..38a014ef14 100644 --- a/crates/ruff_python_ast/src/identifier.rs +++ b/crates/ruff_python_ast/src/identifier.rs @@ -31,8 +31,7 @@ impl Identifier for Stmt { fn identifier(&self) -> TextRange { match self { Stmt::ClassDef(ast::StmtClassDef { name, .. }) - | Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { name, .. }) => name.range(), + | Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) => name.range(), _ => self.range(), } } @@ -85,10 +84,9 @@ pub fn except(handler: &ExceptHandler, source: &str) -> TextRange { .expect("Failed to find `except` token in `ExceptHandler`") } -/// Return the [`TextRange`] of the `else` token in a `For`, `AsyncFor`, or `While` statement. +/// Return the [`TextRange`] of the `else` token in a `For` or `While` statement. pub fn else_(stmt: &Stmt, source: &str) -> Option { let (Stmt::For(ast::StmtFor { body, orelse, .. }) - | Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) | Stmt::While(ast::StmtWhile { body, orelse, .. })) = stmt else { return None; diff --git a/crates/ruff_python_ast/src/lib.rs b/crates/ruff_python_ast/src/lib.rs index a7489fb7a1..25ebbc0329 100644 --- a/crates/ruff_python_ast/src/lib.rs +++ b/crates/ruff_python_ast/src/lib.rs @@ -6,7 +6,6 @@ pub mod call_path; pub mod cast; pub mod comparable; pub mod docstrings; -pub mod function; pub mod hashable; pub mod helpers; pub mod identifier; diff --git a/crates/ruff_python_ast/src/node.rs b/crates/ruff_python_ast/src/node.rs index 6f7f2c911f..ec2c6075c0 100644 --- a/crates/ruff_python_ast/src/node.rs +++ b/crates/ruff_python_ast/src/node.rs @@ -24,7 +24,6 @@ pub enum AnyNode { ModModule(ast::ModModule), ModExpression(ast::ModExpression), StmtFunctionDef(ast::StmtFunctionDef), - StmtAsyncFunctionDef(ast::StmtAsyncFunctionDef), StmtClassDef(ast::StmtClassDef), StmtReturn(ast::StmtReturn), StmtDelete(ast::StmtDelete), @@ -33,11 +32,9 @@ pub enum AnyNode { StmtAugAssign(ast::StmtAugAssign), StmtAnnAssign(ast::StmtAnnAssign), StmtFor(ast::StmtFor), - StmtAsyncFor(ast::StmtAsyncFor), StmtWhile(ast::StmtWhile), StmtIf(ast::StmtIf), StmtWith(ast::StmtWith), - StmtAsyncWith(ast::StmtAsyncWith), StmtMatch(ast::StmtMatch), StmtRaise(ast::StmtRaise), StmtTry(ast::StmtTry), @@ -110,7 +107,6 @@ impl AnyNode { pub fn statement(self) -> Option { match self { AnyNode::StmtFunctionDef(node) => Some(Stmt::FunctionDef(node)), - AnyNode::StmtAsyncFunctionDef(node) => Some(Stmt::AsyncFunctionDef(node)), AnyNode::StmtClassDef(node) => Some(Stmt::ClassDef(node)), AnyNode::StmtReturn(node) => Some(Stmt::Return(node)), AnyNode::StmtDelete(node) => Some(Stmt::Delete(node)), @@ -119,11 +115,9 @@ impl AnyNode { AnyNode::StmtAugAssign(node) => Some(Stmt::AugAssign(node)), AnyNode::StmtAnnAssign(node) => Some(Stmt::AnnAssign(node)), AnyNode::StmtFor(node) => Some(Stmt::For(node)), - AnyNode::StmtAsyncFor(node) => Some(Stmt::AsyncFor(node)), AnyNode::StmtWhile(node) => Some(Stmt::While(node)), AnyNode::StmtIf(node) => Some(Stmt::If(node)), AnyNode::StmtWith(node) => Some(Stmt::With(node)), - AnyNode::StmtAsyncWith(node) => Some(Stmt::AsyncWith(node)), AnyNode::StmtMatch(node) => Some(Stmt::Match(node)), AnyNode::StmtRaise(node) => Some(Stmt::Raise(node)), AnyNode::StmtTry(node) => Some(Stmt::Try(node)), @@ -230,7 +224,6 @@ impl AnyNode { AnyNode::ModModule(_) | AnyNode::ModExpression(_) | AnyNode::StmtFunctionDef(_) - | AnyNode::StmtAsyncFunctionDef(_) | AnyNode::StmtClassDef(_) | AnyNode::StmtReturn(_) | AnyNode::StmtDelete(_) @@ -239,11 +232,9 @@ impl AnyNode { | AnyNode::StmtAugAssign(_) | AnyNode::StmtAnnAssign(_) | AnyNode::StmtFor(_) - | AnyNode::StmtAsyncFor(_) | AnyNode::StmtWhile(_) | AnyNode::StmtIf(_) | AnyNode::StmtWith(_) - | AnyNode::StmtAsyncWith(_) | AnyNode::StmtMatch(_) | AnyNode::StmtRaise(_) | AnyNode::StmtTry(_) @@ -291,7 +282,6 @@ impl AnyNode { AnyNode::ModExpression(node) => Some(Mod::Expression(node)), AnyNode::StmtFunctionDef(_) - | AnyNode::StmtAsyncFunctionDef(_) | AnyNode::StmtClassDef(_) | AnyNode::StmtReturn(_) | AnyNode::StmtDelete(_) @@ -300,11 +290,9 @@ impl AnyNode { | AnyNode::StmtAugAssign(_) | AnyNode::StmtAnnAssign(_) | AnyNode::StmtFor(_) - | AnyNode::StmtAsyncFor(_) | AnyNode::StmtWhile(_) | AnyNode::StmtIf(_) | AnyNode::StmtWith(_) - | AnyNode::StmtAsyncWith(_) | AnyNode::StmtMatch(_) | AnyNode::StmtRaise(_) | AnyNode::StmtTry(_) @@ -388,7 +376,6 @@ impl AnyNode { AnyNode::ModModule(_) | AnyNode::ModExpression(_) | AnyNode::StmtFunctionDef(_) - | AnyNode::StmtAsyncFunctionDef(_) | AnyNode::StmtClassDef(_) | AnyNode::StmtReturn(_) | AnyNode::StmtDelete(_) @@ -397,11 +384,9 @@ impl AnyNode { | AnyNode::StmtAugAssign(_) | AnyNode::StmtAnnAssign(_) | AnyNode::StmtFor(_) - | AnyNode::StmtAsyncFor(_) | AnyNode::StmtWhile(_) | AnyNode::StmtIf(_) | AnyNode::StmtWith(_) - | AnyNode::StmtAsyncWith(_) | AnyNode::StmtMatch(_) | AnyNode::StmtRaise(_) | AnyNode::StmtTry(_) @@ -470,7 +455,6 @@ impl AnyNode { AnyNode::ModModule(_) | AnyNode::ModExpression(_) | AnyNode::StmtFunctionDef(_) - | AnyNode::StmtAsyncFunctionDef(_) | AnyNode::StmtClassDef(_) | AnyNode::StmtReturn(_) | AnyNode::StmtDelete(_) @@ -479,11 +463,9 @@ impl AnyNode { | AnyNode::StmtAugAssign(_) | AnyNode::StmtAnnAssign(_) | AnyNode::StmtFor(_) - | AnyNode::StmtAsyncFor(_) | AnyNode::StmtWhile(_) | AnyNode::StmtIf(_) | AnyNode::StmtWith(_) - | AnyNode::StmtAsyncWith(_) | AnyNode::StmtMatch(_) | AnyNode::StmtRaise(_) | AnyNode::StmtTry(_) @@ -577,7 +559,6 @@ impl AnyNode { Self::ModModule(node) => AnyNodeRef::ModModule(node), Self::ModExpression(node) => AnyNodeRef::ModExpression(node), Self::StmtFunctionDef(node) => AnyNodeRef::StmtFunctionDef(node), - Self::StmtAsyncFunctionDef(node) => AnyNodeRef::StmtAsyncFunctionDef(node), Self::StmtClassDef(node) => AnyNodeRef::StmtClassDef(node), Self::StmtReturn(node) => AnyNodeRef::StmtReturn(node), Self::StmtDelete(node) => AnyNodeRef::StmtDelete(node), @@ -586,11 +567,9 @@ impl AnyNode { Self::StmtAugAssign(node) => AnyNodeRef::StmtAugAssign(node), Self::StmtAnnAssign(node) => AnyNodeRef::StmtAnnAssign(node), Self::StmtFor(node) => AnyNodeRef::StmtFor(node), - Self::StmtAsyncFor(node) => AnyNodeRef::StmtAsyncFor(node), Self::StmtWhile(node) => AnyNodeRef::StmtWhile(node), Self::StmtIf(node) => AnyNodeRef::StmtIf(node), Self::StmtWith(node) => AnyNodeRef::StmtWith(node), - Self::StmtAsyncWith(node) => AnyNodeRef::StmtAsyncWith(node), Self::StmtMatch(node) => AnyNodeRef::StmtMatch(node), Self::StmtRaise(node) => AnyNodeRef::StmtRaise(node), Self::StmtTry(node) => AnyNodeRef::StmtTry(node), @@ -750,34 +729,6 @@ impl AstNode for ast::StmtFunctionDef { AnyNode::from(self) } } -impl AstNode for ast::StmtAsyncFunctionDef { - fn cast(kind: AnyNode) -> Option - where - Self: Sized, - { - if let AnyNode::StmtAsyncFunctionDef(node) = kind { - Some(node) - } else { - None - } - } - - fn cast_ref(kind: AnyNodeRef) -> Option<&Self> { - if let AnyNodeRef::StmtAsyncFunctionDef(node) = kind { - Some(node) - } else { - None - } - } - - fn as_any_node_ref(&self) -> AnyNodeRef { - AnyNodeRef::from(self) - } - - fn into_any_node(self) -> AnyNode { - AnyNode::from(self) - } -} impl AstNode for ast::StmtClassDef { fn cast(kind: AnyNode) -> Option where @@ -1002,34 +953,6 @@ impl AstNode for ast::StmtFor { AnyNode::from(self) } } -impl AstNode for ast::StmtAsyncFor { - fn cast(kind: AnyNode) -> Option - where - Self: Sized, - { - if let AnyNode::StmtAsyncFor(node) = kind { - Some(node) - } else { - None - } - } - - fn cast_ref(kind: AnyNodeRef) -> Option<&Self> { - if let AnyNodeRef::StmtAsyncFor(node) = kind { - Some(node) - } else { - None - } - } - - fn as_any_node_ref(&self) -> AnyNodeRef { - AnyNodeRef::from(self) - } - - fn into_any_node(self) -> AnyNode { - AnyNode::from(self) - } -} impl AstNode for ast::StmtWhile { fn cast(kind: AnyNode) -> Option where @@ -1142,34 +1065,6 @@ impl AstNode for ast::StmtWith { AnyNode::from(self) } } -impl AstNode for ast::StmtAsyncWith { - fn cast(kind: AnyNode) -> Option - where - Self: Sized, - { - if let AnyNode::StmtAsyncWith(node) = kind { - Some(node) - } else { - None - } - } - - fn cast_ref(kind: AnyNodeRef) -> Option<&Self> { - if let AnyNodeRef::StmtAsyncWith(node) = kind { - Some(node) - } else { - None - } - } - - fn as_any_node_ref(&self) -> AnyNodeRef { - AnyNodeRef::from(self) - } - - fn into_any_node(self) -> AnyNode { - AnyNode::from(self) - } -} impl AstNode for ast::StmtMatch { fn cast(kind: AnyNode) -> Option where @@ -2996,7 +2891,6 @@ impl From for AnyNode { fn from(stmt: Stmt) -> Self { match stmt { Stmt::FunctionDef(node) => AnyNode::StmtFunctionDef(node), - Stmt::AsyncFunctionDef(node) => AnyNode::StmtAsyncFunctionDef(node), Stmt::ClassDef(node) => AnyNode::StmtClassDef(node), Stmt::Return(node) => AnyNode::StmtReturn(node), Stmt::Delete(node) => AnyNode::StmtDelete(node), @@ -3005,11 +2899,9 @@ impl From for AnyNode { Stmt::AugAssign(node) => AnyNode::StmtAugAssign(node), Stmt::AnnAssign(node) => AnyNode::StmtAnnAssign(node), Stmt::For(node) => AnyNode::StmtFor(node), - Stmt::AsyncFor(node) => AnyNode::StmtAsyncFor(node), Stmt::While(node) => AnyNode::StmtWhile(node), Stmt::If(node) => AnyNode::StmtIf(node), Stmt::With(node) => AnyNode::StmtWith(node), - Stmt::AsyncWith(node) => AnyNode::StmtAsyncWith(node), Stmt::Match(node) => AnyNode::StmtMatch(node), Stmt::Raise(node) => AnyNode::StmtRaise(node), Stmt::Try(node) => AnyNode::StmtTry(node), @@ -3113,12 +3005,6 @@ impl From for AnyNode { } } -impl From for AnyNode { - fn from(node: ast::StmtAsyncFunctionDef) -> Self { - AnyNode::StmtAsyncFunctionDef(node) - } -} - impl From for AnyNode { fn from(node: ast::StmtClassDef) -> Self { AnyNode::StmtClassDef(node) @@ -3167,12 +3053,6 @@ impl From for AnyNode { } } -impl From for AnyNode { - fn from(node: ast::StmtAsyncFor) -> Self { - AnyNode::StmtAsyncFor(node) - } -} - impl From for AnyNode { fn from(node: ast::StmtWhile) -> Self { AnyNode::StmtWhile(node) @@ -3197,12 +3077,6 @@ impl From for AnyNode { } } -impl From for AnyNode { - fn from(node: ast::StmtAsyncWith) -> Self { - AnyNode::StmtAsyncWith(node) - } -} - impl From for AnyNode { fn from(node: ast::StmtMatch) -> Self { AnyNode::StmtMatch(node) @@ -3588,7 +3462,6 @@ impl Ranged for AnyNode { AnyNode::ModModule(node) => node.range(), AnyNode::ModExpression(node) => node.range(), AnyNode::StmtFunctionDef(node) => node.range(), - AnyNode::StmtAsyncFunctionDef(node) => node.range(), AnyNode::StmtClassDef(node) => node.range(), AnyNode::StmtReturn(node) => node.range(), AnyNode::StmtDelete(node) => node.range(), @@ -3597,11 +3470,9 @@ impl Ranged for AnyNode { AnyNode::StmtAugAssign(node) => node.range(), AnyNode::StmtAnnAssign(node) => node.range(), AnyNode::StmtFor(node) => node.range(), - AnyNode::StmtAsyncFor(node) => node.range(), AnyNode::StmtWhile(node) => node.range(), AnyNode::StmtIf(node) => node.range(), AnyNode::StmtWith(node) => node.range(), - AnyNode::StmtAsyncWith(node) => node.range(), AnyNode::StmtMatch(node) => node.range(), AnyNode::StmtRaise(node) => node.range(), AnyNode::StmtTry(node) => node.range(), @@ -3677,7 +3548,6 @@ pub enum AnyNodeRef<'a> { ModModule(&'a ast::ModModule), ModExpression(&'a ast::ModExpression), StmtFunctionDef(&'a ast::StmtFunctionDef), - StmtAsyncFunctionDef(&'a ast::StmtAsyncFunctionDef), StmtClassDef(&'a ast::StmtClassDef), StmtReturn(&'a ast::StmtReturn), StmtDelete(&'a ast::StmtDelete), @@ -3686,11 +3556,9 @@ pub enum AnyNodeRef<'a> { StmtAugAssign(&'a ast::StmtAugAssign), StmtAnnAssign(&'a ast::StmtAnnAssign), StmtFor(&'a ast::StmtFor), - StmtAsyncFor(&'a ast::StmtAsyncFor), StmtWhile(&'a ast::StmtWhile), StmtIf(&'a ast::StmtIf), StmtWith(&'a ast::StmtWith), - StmtAsyncWith(&'a ast::StmtAsyncWith), StmtMatch(&'a ast::StmtMatch), StmtRaise(&'a ast::StmtRaise), StmtTry(&'a ast::StmtTry), @@ -3765,7 +3633,6 @@ impl AnyNodeRef<'_> { AnyNodeRef::ModModule(node) => NonNull::from(*node).cast(), AnyNodeRef::ModExpression(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtFunctionDef(node) => NonNull::from(*node).cast(), - AnyNodeRef::StmtAsyncFunctionDef(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtClassDef(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtReturn(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtDelete(node) => NonNull::from(*node).cast(), @@ -3774,11 +3641,9 @@ impl AnyNodeRef<'_> { AnyNodeRef::StmtAugAssign(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtAnnAssign(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtFor(node) => NonNull::from(*node).cast(), - AnyNodeRef::StmtAsyncFor(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtWhile(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtIf(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtWith(node) => NonNull::from(*node).cast(), - AnyNodeRef::StmtAsyncWith(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtMatch(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtRaise(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtTry(node) => NonNull::from(*node).cast(), @@ -3859,7 +3724,6 @@ impl AnyNodeRef<'_> { AnyNodeRef::ModModule(_) => NodeKind::ModModule, AnyNodeRef::ModExpression(_) => NodeKind::ModExpression, AnyNodeRef::StmtFunctionDef(_) => NodeKind::StmtFunctionDef, - AnyNodeRef::StmtAsyncFunctionDef(_) => NodeKind::StmtAsyncFunctionDef, AnyNodeRef::StmtClassDef(_) => NodeKind::StmtClassDef, AnyNodeRef::StmtReturn(_) => NodeKind::StmtReturn, AnyNodeRef::StmtDelete(_) => NodeKind::StmtDelete, @@ -3868,11 +3732,9 @@ impl AnyNodeRef<'_> { AnyNodeRef::StmtAugAssign(_) => NodeKind::StmtAugAssign, AnyNodeRef::StmtAnnAssign(_) => NodeKind::StmtAnnAssign, AnyNodeRef::StmtFor(_) => NodeKind::StmtFor, - AnyNodeRef::StmtAsyncFor(_) => NodeKind::StmtAsyncFor, AnyNodeRef::StmtWhile(_) => NodeKind::StmtWhile, AnyNodeRef::StmtIf(_) => NodeKind::StmtIf, AnyNodeRef::StmtWith(_) => NodeKind::StmtWith, - AnyNodeRef::StmtAsyncWith(_) => NodeKind::StmtAsyncWith, AnyNodeRef::StmtMatch(_) => NodeKind::StmtMatch, AnyNodeRef::StmtRaise(_) => NodeKind::StmtRaise, AnyNodeRef::StmtTry(_) => NodeKind::StmtTry, @@ -3945,7 +3807,6 @@ impl AnyNodeRef<'_> { pub const fn is_statement(self) -> bool { match self { AnyNodeRef::StmtFunctionDef(_) - | AnyNodeRef::StmtAsyncFunctionDef(_) | AnyNodeRef::StmtClassDef(_) | AnyNodeRef::StmtReturn(_) | AnyNodeRef::StmtDelete(_) @@ -3954,11 +3815,9 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtAugAssign(_) | AnyNodeRef::StmtAnnAssign(_) | AnyNodeRef::StmtFor(_) - | AnyNodeRef::StmtAsyncFor(_) | AnyNodeRef::StmtWhile(_) | AnyNodeRef::StmtIf(_) | AnyNodeRef::StmtWith(_) - | AnyNodeRef::StmtAsyncWith(_) | AnyNodeRef::StmtMatch(_) | AnyNodeRef::StmtRaise(_) | AnyNodeRef::StmtTry(_) @@ -4065,7 +3924,6 @@ impl AnyNodeRef<'_> { AnyNodeRef::ModModule(_) | AnyNodeRef::ModExpression(_) | AnyNodeRef::StmtFunctionDef(_) - | AnyNodeRef::StmtAsyncFunctionDef(_) | AnyNodeRef::StmtClassDef(_) | AnyNodeRef::StmtReturn(_) | AnyNodeRef::StmtDelete(_) @@ -4074,11 +3932,9 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtAugAssign(_) | AnyNodeRef::StmtAnnAssign(_) | AnyNodeRef::StmtFor(_) - | AnyNodeRef::StmtAsyncFor(_) | AnyNodeRef::StmtWhile(_) | AnyNodeRef::StmtIf(_) | AnyNodeRef::StmtWith(_) - | AnyNodeRef::StmtAsyncWith(_) | AnyNodeRef::StmtMatch(_) | AnyNodeRef::StmtRaise(_) | AnyNodeRef::StmtTry(_) @@ -4125,7 +3981,6 @@ impl AnyNodeRef<'_> { AnyNodeRef::ModModule(_) | AnyNodeRef::ModExpression(_) => true, AnyNodeRef::StmtFunctionDef(_) - | AnyNodeRef::StmtAsyncFunctionDef(_) | AnyNodeRef::StmtClassDef(_) | AnyNodeRef::StmtReturn(_) | AnyNodeRef::StmtDelete(_) @@ -4134,11 +3989,9 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtAugAssign(_) | AnyNodeRef::StmtAnnAssign(_) | AnyNodeRef::StmtFor(_) - | AnyNodeRef::StmtAsyncFor(_) | AnyNodeRef::StmtWhile(_) | AnyNodeRef::StmtIf(_) | AnyNodeRef::StmtWith(_) - | AnyNodeRef::StmtAsyncWith(_) | AnyNodeRef::StmtMatch(_) | AnyNodeRef::StmtRaise(_) | AnyNodeRef::StmtTry(_) @@ -4222,7 +4075,6 @@ impl AnyNodeRef<'_> { AnyNodeRef::ModModule(_) | AnyNodeRef::ModExpression(_) | AnyNodeRef::StmtFunctionDef(_) - | AnyNodeRef::StmtAsyncFunctionDef(_) | AnyNodeRef::StmtClassDef(_) | AnyNodeRef::StmtReturn(_) | AnyNodeRef::StmtDelete(_) @@ -4231,11 +4083,9 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtAugAssign(_) | AnyNodeRef::StmtAnnAssign(_) | AnyNodeRef::StmtFor(_) - | AnyNodeRef::StmtAsyncFor(_) | AnyNodeRef::StmtWhile(_) | AnyNodeRef::StmtIf(_) | AnyNodeRef::StmtWith(_) - | AnyNodeRef::StmtAsyncWith(_) | AnyNodeRef::StmtMatch(_) | AnyNodeRef::StmtRaise(_) | AnyNodeRef::StmtTry(_) @@ -4304,7 +4154,6 @@ impl AnyNodeRef<'_> { AnyNodeRef::ModModule(_) | AnyNodeRef::ModExpression(_) | AnyNodeRef::StmtFunctionDef(_) - | AnyNodeRef::StmtAsyncFunctionDef(_) | AnyNodeRef::StmtClassDef(_) | AnyNodeRef::StmtReturn(_) | AnyNodeRef::StmtDelete(_) @@ -4313,11 +4162,9 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtAugAssign(_) | AnyNodeRef::StmtAnnAssign(_) | AnyNodeRef::StmtFor(_) - | AnyNodeRef::StmtAsyncFor(_) | AnyNodeRef::StmtWhile(_) | AnyNodeRef::StmtIf(_) | AnyNodeRef::StmtWith(_) - | AnyNodeRef::StmtAsyncWith(_) | AnyNodeRef::StmtMatch(_) | AnyNodeRef::StmtRaise(_) | AnyNodeRef::StmtTry(_) @@ -4391,13 +4238,10 @@ impl AnyNodeRef<'_> { self, AnyNodeRef::StmtIf(_) | AnyNodeRef::StmtFor(_) - | AnyNodeRef::StmtAsyncFor(_) | AnyNodeRef::StmtWhile(_) | AnyNodeRef::StmtWith(_) - | AnyNodeRef::StmtAsyncWith(_) | AnyNodeRef::StmtMatch(_) | AnyNodeRef::StmtFunctionDef(_) - | AnyNodeRef::StmtAsyncFunctionDef(_) | AnyNodeRef::StmtClassDef(_) | AnyNodeRef::StmtTry(_) | AnyNodeRef::StmtTryStar(_) @@ -4435,12 +4279,6 @@ impl<'a> From<&'a ast::StmtFunctionDef> for AnyNodeRef<'a> { } } -impl<'a> From<&'a ast::StmtAsyncFunctionDef> for AnyNodeRef<'a> { - fn from(node: &'a ast::StmtAsyncFunctionDef) -> Self { - AnyNodeRef::StmtAsyncFunctionDef(node) - } -} - impl<'a> From<&'a ast::StmtClassDef> for AnyNodeRef<'a> { fn from(node: &'a ast::StmtClassDef) -> Self { AnyNodeRef::StmtClassDef(node) @@ -4489,12 +4327,6 @@ impl<'a> From<&'a ast::StmtFor> for AnyNodeRef<'a> { } } -impl<'a> From<&'a ast::StmtAsyncFor> for AnyNodeRef<'a> { - fn from(node: &'a ast::StmtAsyncFor) -> Self { - AnyNodeRef::StmtAsyncFor(node) - } -} - impl<'a> From<&'a ast::StmtWhile> for AnyNodeRef<'a> { fn from(node: &'a ast::StmtWhile) -> Self { AnyNodeRef::StmtWhile(node) @@ -4519,12 +4351,6 @@ impl<'a> From<&'a ast::StmtWith> for AnyNodeRef<'a> { } } -impl<'a> From<&'a ast::StmtAsyncWith> for AnyNodeRef<'a> { - fn from(node: &'a ast::StmtAsyncWith) -> Self { - AnyNodeRef::StmtAsyncWith(node) - } -} - impl<'a> From<&'a ast::StmtMatch> for AnyNodeRef<'a> { fn from(node: &'a ast::StmtMatch) -> Self { AnyNodeRef::StmtMatch(node) @@ -4864,7 +4690,6 @@ impl<'a> From<&'a Stmt> for AnyNodeRef<'a> { fn from(stmt: &'a Stmt) -> Self { match stmt { Stmt::FunctionDef(node) => AnyNodeRef::StmtFunctionDef(node), - Stmt::AsyncFunctionDef(node) => AnyNodeRef::StmtAsyncFunctionDef(node), Stmt::ClassDef(node) => AnyNodeRef::StmtClassDef(node), Stmt::Return(node) => AnyNodeRef::StmtReturn(node), Stmt::Delete(node) => AnyNodeRef::StmtDelete(node), @@ -4873,11 +4698,9 @@ impl<'a> From<&'a Stmt> for AnyNodeRef<'a> { Stmt::AugAssign(node) => AnyNodeRef::StmtAugAssign(node), Stmt::AnnAssign(node) => AnyNodeRef::StmtAnnAssign(node), Stmt::For(node) => AnyNodeRef::StmtFor(node), - Stmt::AsyncFor(node) => AnyNodeRef::StmtAsyncFor(node), Stmt::While(node) => AnyNodeRef::StmtWhile(node), Stmt::If(node) => AnyNodeRef::StmtIf(node), Stmt::With(node) => AnyNodeRef::StmtWith(node), - Stmt::AsyncWith(node) => AnyNodeRef::StmtAsyncWith(node), Stmt::Match(node) => AnyNodeRef::StmtMatch(node), Stmt::Raise(node) => AnyNodeRef::StmtRaise(node), Stmt::Try(node) => AnyNodeRef::StmtTry(node), @@ -5027,7 +4850,6 @@ impl Ranged for AnyNodeRef<'_> { AnyNodeRef::ModModule(node) => node.range(), AnyNodeRef::ModExpression(node) => node.range(), AnyNodeRef::StmtFunctionDef(node) => node.range(), - AnyNodeRef::StmtAsyncFunctionDef(node) => node.range(), AnyNodeRef::StmtClassDef(node) => node.range(), AnyNodeRef::StmtReturn(node) => node.range(), AnyNodeRef::StmtDelete(node) => node.range(), @@ -5036,11 +4858,9 @@ impl Ranged for AnyNodeRef<'_> { AnyNodeRef::StmtAugAssign(node) => node.range(), AnyNodeRef::StmtAnnAssign(node) => node.range(), AnyNodeRef::StmtFor(node) => node.range(), - AnyNodeRef::StmtAsyncFor(node) => node.range(), AnyNodeRef::StmtWhile(node) => node.range(), AnyNodeRef::StmtIf(node) => node.range(), AnyNodeRef::StmtWith(node) => node.range(), - AnyNodeRef::StmtAsyncWith(node) => node.range(), AnyNodeRef::StmtMatch(node) => node.range(), AnyNodeRef::StmtRaise(node) => node.range(), AnyNodeRef::StmtTry(node) => node.range(), @@ -5118,7 +4938,6 @@ pub enum NodeKind { ModExpression, ModFunctionType, StmtFunctionDef, - StmtAsyncFunctionDef, StmtClassDef, StmtReturn, StmtDelete, @@ -5127,11 +4946,9 @@ pub enum NodeKind { StmtAugAssign, StmtAnnAssign, StmtFor, - StmtAsyncFor, StmtWhile, StmtIf, StmtWith, - StmtAsyncWith, StmtMatch, StmtRaise, StmtTry, diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs index d536ce8ca6..5e5239872a 100644 --- a/crates/ruff_python_ast/src/nodes.rs +++ b/crates/ruff_python_ast/src/nodes.rs @@ -45,8 +45,6 @@ impl From for Mod { pub enum Stmt { #[is(name = "function_def_stmt")] FunctionDef(StmtFunctionDef), - #[is(name = "async_function_def_stmt")] - AsyncFunctionDef(StmtAsyncFunctionDef), #[is(name = "class_def_stmt")] ClassDef(StmtClassDef), #[is(name = "return_stmt")] @@ -63,16 +61,12 @@ pub enum Stmt { TypeAlias(StmtTypeAlias), #[is(name = "for_stmt")] For(StmtFor), - #[is(name = "async_for_stmt")] - AsyncFor(StmtAsyncFor), #[is(name = "while_stmt")] While(StmtWhile), #[is(name = "if_stmt")] If(StmtIf), #[is(name = "with_stmt")] With(StmtWith), - #[is(name = "async_with_stmt")] - AsyncWith(StmtAsyncWith), #[is(name = "match_stmt")] Match(StmtMatch), #[is(name = "raise_stmt")] @@ -118,10 +112,15 @@ impl From for Stmt { } } -/// See also [FunctionDef](https://docs.python.org/3/library/ast.html#ast.FunctionDef) +/// See also [FunctionDef](https://docs.python.org/3/library/ast.html#ast.FunctionDef) and +/// [AsyncFunctionDef](https://docs.python.org/3/library/ast.html#ast.AsyncFunctionDef). +/// +/// This type differs from the original Python AST, as it collapses the +/// synchronous and asynchronous variants into a single type. #[derive(Clone, Debug, PartialEq)] pub struct StmtFunctionDef { pub range: TextRange, + pub is_async: bool, pub decorator_list: Vec, pub name: Identifier, pub type_params: Option, @@ -136,24 +135,6 @@ impl From for Stmt { } } -/// See also [AsyncFunctionDef](https://docs.python.org/3/library/ast.html#ast.AsyncFunctionDef) -#[derive(Clone, Debug, PartialEq)] -pub struct StmtAsyncFunctionDef { - pub range: TextRange, - pub decorator_list: Vec, - pub name: Identifier, - pub type_params: Option, - pub parameters: Box, - pub returns: Option>, - pub body: Vec, -} - -impl From for Stmt { - fn from(payload: StmtAsyncFunctionDef) -> Self { - Stmt::AsyncFunctionDef(payload) - } -} - /// See also [ClassDef](https://docs.python.org/3/library/ast.html#ast.ClassDef) #[derive(Clone, Debug, PartialEq)] pub struct StmtClassDef { @@ -275,10 +256,15 @@ impl From for Stmt { } } -/// See also [For](https://docs.python.org/3/library/ast.html#ast.For) +/// See also [For](https://docs.python.org/3/library/ast.html#ast.For) and +/// [AsyncFor](https://docs.python.org/3/library/ast.html#ast.AsyncFor). +/// +/// This type differs from the original Python AST, as it collapses the +/// synchronous and asynchronous variants into a single type. #[derive(Clone, Debug, PartialEq)] pub struct StmtFor { pub range: TextRange, + pub is_async: bool, pub target: Box, pub iter: Box, pub body: Vec, @@ -291,23 +277,8 @@ impl From for Stmt { } } -/// See also [AsyncFor](https://docs.python.org/3/library/ast.html#ast.AsyncFor) -#[derive(Clone, Debug, PartialEq)] -pub struct StmtAsyncFor { - pub range: TextRange, - pub target: Box, - pub iter: Box, - pub body: Vec, - pub orelse: Vec, -} - -impl From for Stmt { - fn from(payload: StmtAsyncFor) -> Self { - Stmt::AsyncFor(payload) - } -} - -/// See also [While](https://docs.python.org/3/library/ast.html#ast.While) +/// See also [While](https://docs.python.org/3/library/ast.html#ast.While) and +/// [AsyncWhile](https://docs.python.org/3/library/ast.html#ast.AsyncWhile). #[derive(Clone, Debug, PartialEq)] pub struct StmtWhile { pub range: TextRange, @@ -344,10 +315,15 @@ pub struct ElifElseClause { pub body: Vec, } -/// See also [With](https://docs.python.org/3/library/ast.html#ast.With) +/// See also [With](https://docs.python.org/3/library/ast.html#ast.With) and +/// [AsyncWith](https://docs.python.org/3/library/ast.html#ast.AsyncWith). +/// +/// This type differs from the original Python AST, as it collapses the +/// synchronous and asynchronous variants into a single type. #[derive(Clone, Debug, PartialEq)] pub struct StmtWith { pub range: TextRange, + pub is_async: bool, pub items: Vec, pub body: Vec, } @@ -358,20 +334,6 @@ impl From for Stmt { } } -/// See also [AsyncWith](https://docs.python.org/3/library/ast.html#ast.AsyncWith) -#[derive(Clone, Debug, PartialEq)] -pub struct StmtAsyncWith { - pub range: TextRange, - pub items: Vec, - pub body: Vec, -} - -impl From for Stmt { - fn from(payload: StmtAsyncWith) -> Self { - Stmt::AsyncWith(payload) - } -} - /// See also [Match](https://docs.python.org/3/library/ast.html#ast.Match) #[derive(Clone, Debug, PartialEq)] pub struct StmtMatch { @@ -2599,11 +2561,6 @@ impl Ranged for crate::nodes::StmtFunctionDef { self.range } } -impl Ranged for crate::nodes::StmtAsyncFunctionDef { - fn range(&self) -> TextRange { - self.range - } -} impl Ranged for crate::nodes::StmtClassDef { fn range(&self) -> TextRange { self.range @@ -2644,11 +2601,6 @@ impl Ranged for crate::nodes::StmtFor { self.range } } -impl Ranged for crate::nodes::StmtAsyncFor { - fn range(&self) -> TextRange { - self.range - } -} impl Ranged for crate::nodes::StmtWhile { fn range(&self) -> TextRange { self.range @@ -2669,11 +2621,6 @@ impl Ranged for crate::nodes::StmtWith { self.range } } -impl Ranged for crate::nodes::StmtAsyncWith { - fn range(&self) -> TextRange { - self.range - } -} impl Ranged for crate::nodes::StmtMatch { fn range(&self) -> TextRange { self.range @@ -2748,7 +2695,6 @@ impl Ranged for crate::Stmt { fn range(&self) -> TextRange { match self { Self::FunctionDef(node) => node.range(), - Self::AsyncFunctionDef(node) => node.range(), Self::ClassDef(node) => node.range(), Self::Return(node) => node.range(), Self::Delete(node) => node.range(), @@ -2757,11 +2703,9 @@ impl Ranged for crate::Stmt { Self::AugAssign(node) => node.range(), Self::AnnAssign(node) => node.range(), Self::For(node) => node.range(), - Self::AsyncFor(node) => node.range(), Self::While(node) => node.range(), Self::If(node) => node.range(), Self::With(node) => node.range(), - Self::AsyncWith(node) => node.range(), Self::Match(node) => node.range(), Self::Raise(node) => node.range(), Self::Try(node) => node.range(), @@ -3110,8 +3054,7 @@ mod size_assertions { use static_assertions::assert_eq_size; assert_eq_size!(Stmt, [u8; 144]); - assert_eq_size!(StmtFunctionDef, [u8; 136]); - assert_eq_size!(StmtAsyncFunctionDef, [u8; 136]); + assert_eq_size!(StmtFunctionDef, [u8; 144]); assert_eq_size!(StmtClassDef, [u8; 104]); assert_eq_size!(StmtTry, [u8; 104]); assert_eq_size!(Expr, [u8; 80]); diff --git a/crates/ruff_python_ast/src/statement_visitor.rs b/crates/ruff_python_ast/src/statement_visitor.rs index c061e0beb8..57f458d8fb 100644 --- a/crates/ruff_python_ast/src/statement_visitor.rs +++ b/crates/ruff_python_ast/src/statement_visitor.rs @@ -32,9 +32,6 @@ pub fn walk_stmt<'a, V: StatementVisitor<'a> + ?Sized>(visitor: &mut V, stmt: &' Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) => { visitor.visit_body(body); } - Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) => { - visitor.visit_body(body); - } Stmt::For(ast::StmtFor { body, orelse, .. }) => { visitor.visit_body(body); visitor.visit_body(orelse); @@ -42,10 +39,6 @@ pub fn walk_stmt<'a, V: StatementVisitor<'a> + ?Sized>(visitor: &mut V, stmt: &' Stmt::ClassDef(ast::StmtClassDef { body, .. }) => { visitor.visit_body(body); } - Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) => { - visitor.visit_body(body); - visitor.visit_body(orelse); - } Stmt::While(ast::StmtWhile { body, orelse, .. }) => { visitor.visit_body(body); visitor.visit_body(orelse); @@ -63,9 +56,6 @@ pub fn walk_stmt<'a, V: StatementVisitor<'a> + ?Sized>(visitor: &mut V, stmt: &' Stmt::With(ast::StmtWith { body, .. }) => { visitor.visit_body(body); } - Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => { - visitor.visit_body(body); - } Stmt::Match(ast::StmtMatch { cases, .. }) => { for match_case in cases { visitor.visit_match_case(match_case); diff --git a/crates/ruff_python_ast/src/traversal.rs b/crates/ruff_python_ast/src/traversal.rs index 95f88d13c9..6a732aa890 100644 --- a/crates/ruff_python_ast/src/traversal.rs +++ b/crates/ruff_python_ast/src/traversal.rs @@ -5,7 +5,6 @@ use crate::{self as ast, ExceptHandler, Stmt, Suite}; pub fn suite<'a>(stmt: &'a Stmt, parent: &'a Stmt) -> Option<&'a Suite> { match parent { Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) => Some(body), - Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) => Some(body), Stmt::ClassDef(ast::StmtClassDef { body, .. }) => Some(body), Stmt::For(ast::StmtFor { body, orelse, .. }) => { if body.contains(stmt) { @@ -16,15 +15,6 @@ pub fn suite<'a>(stmt: &'a Stmt, parent: &'a Stmt) -> Option<&'a Suite> { None } } - Stmt::AsyncFor(ast::StmtAsyncFor { body, orelse, .. }) => { - if body.contains(stmt) { - Some(body) - } else if orelse.contains(stmt) { - Some(orelse) - } else { - None - } - } Stmt::While(ast::StmtWhile { body, orelse, .. }) => { if body.contains(stmt) { Some(body) @@ -49,7 +39,6 @@ pub fn suite<'a>(stmt: &'a Stmt, parent: &'a Stmt) -> Option<&'a Suite> { } } Stmt::With(ast::StmtWith { body, .. }) => Some(body), - Stmt::AsyncWith(ast::StmtAsyncWith { body, .. }) => Some(body), Stmt::Match(ast::StmtMatch { cases, .. }) => cases .iter() .map(|case| &case.body) diff --git a/crates/ruff_python_ast/src/visitor.rs b/crates/ruff_python_ast/src/visitor.rs index b3aac478bb..be2fc8fc6d 100644 --- a/crates/ruff_python_ast/src/visitor.rs +++ b/crates/ruff_python_ast/src/visitor.rs @@ -128,26 +128,6 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) { } visitor.visit_body(body); } - Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - parameters, - body, - decorator_list, - returns, - type_params, - .. - }) => { - for decorator in decorator_list { - visitor.visit_decorator(decorator); - } - if let Some(type_params) = type_params { - visitor.visit_type_params(type_params); - } - visitor.visit_parameters(parameters); - for expr in returns { - visitor.visit_annotation(expr); - } - visitor.visit_body(body); - } Stmt::ClassDef(ast::StmtClassDef { arguments, body, @@ -228,18 +208,6 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) { visitor.visit_body(body); visitor.visit_body(orelse); } - Stmt::AsyncFor(ast::StmtAsyncFor { - target, - iter, - body, - orelse, - .. - }) => { - visitor.visit_expr(iter); - visitor.visit_expr(target); - visitor.visit_body(body); - visitor.visit_body(orelse); - } Stmt::While(ast::StmtWhile { test, body, @@ -271,12 +239,6 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) { } visitor.visit_body(body); } - Stmt::AsyncWith(ast::StmtAsyncWith { items, body, .. }) => { - for with_item in items { - visitor.visit_with_item(with_item); - } - visitor.visit_body(body); - } Stmt::Match(ast::StmtMatch { subject, cases, diff --git a/crates/ruff_python_ast/src/visitor/preorder.rs b/crates/ruff_python_ast/src/visitor/preorder.rs index 84a9e0535a..90ae53db61 100644 --- a/crates/ruff_python_ast/src/visitor/preorder.rs +++ b/crates/ruff_python_ast/src/visitor/preorder.rs @@ -145,14 +145,6 @@ where returns, type_params, .. - }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - parameters, - body, - decorator_list, - returns, - type_params, - .. }) => { for decorator in decorator_list { visitor.visit_decorator(decorator); @@ -261,13 +253,6 @@ where body, orelse, .. - }) - | Stmt::AsyncFor(ast::StmtAsyncFor { - target, - iter, - body, - orelse, - .. }) => { visitor.visit_expr(target); visitor.visit_expr(iter); @@ -302,11 +287,7 @@ where Stmt::With(ast::StmtWith { items, body, - range: _, - }) - | Stmt::AsyncWith(ast::StmtAsyncWith { - items, - body, + is_async: _, range: _, }) => { for with_item in items { diff --git a/crates/ruff_python_codegen/src/generator.rs b/crates/ruff_python_codegen/src/generator.rs index b502abad65..162f75736d 100644 --- a/crates/ruff_python_codegen/src/generator.rs +++ b/crates/ruff_python_codegen/src/generator.rs @@ -23,7 +23,6 @@ mod precedence { pub(crate) const YIELD_FROM: u8 = 7; pub(crate) const IF: u8 = 9; pub(crate) const FOR: u8 = 9; - pub(crate) const ASYNC_FOR: u8 = 9; pub(crate) const WHILE: u8 = 9; pub(crate) const RETURN: u8 = 11; pub(crate) const SLICE: u8 = 13; @@ -204,6 +203,7 @@ impl<'a> Generator<'a> { match ast { Stmt::FunctionDef(ast::StmtFunctionDef { + is_async, name, parameters, body, @@ -220,6 +220,9 @@ impl<'a> Generator<'a> { }); } statement!({ + if *is_async { + self.p("async "); + } self.p("def "); self.p_id(name); if let Some(type_params) = type_params { @@ -239,42 +242,6 @@ impl<'a> Generator<'a> { self.newlines(2); } } - Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - name, - parameters, - body, - returns, - decorator_list, - type_params, - .. - }) => { - self.newlines(if self.indent_depth == 0 { 2 } else { 1 }); - for decorator in decorator_list { - statement!({ - self.p("@"); - self.unparse_expr(&decorator.expression, precedence::MAX); - }); - } - statement!({ - self.p("async def "); - self.p_id(name); - if let Some(type_params) = type_params { - self.unparse_type_params(type_params); - } - self.p("("); - self.unparse_parameters(parameters); - self.p(")"); - if let Some(returns) = returns { - self.p(" -> "); - self.unparse_expr(returns, precedence::MAX); - } - self.p(":"); - }); - self.body(body); - if self.indent_depth == 0 { - self.newlines(2); - } - } Stmt::ClassDef(ast::StmtClassDef { name, arguments, @@ -400,6 +367,7 @@ impl<'a> Generator<'a> { }); } Stmt::For(ast::StmtFor { + is_async, target, iter, body, @@ -407,6 +375,9 @@ impl<'a> Generator<'a> { .. }) => { statement!({ + if *is_async { + self.p("async "); + } self.p("for "); self.unparse_expr(target, precedence::FOR); self.p(" in "); @@ -421,28 +392,6 @@ impl<'a> Generator<'a> { self.body(orelse); } } - Stmt::AsyncFor(ast::StmtAsyncFor { - target, - iter, - body, - orelse, - .. - }) => { - statement!({ - self.p("async for "); - self.unparse_expr(target, precedence::ASYNC_FOR); - self.p(" in "); - self.unparse_expr(iter, precedence::MAX); - self.p(":"); - }); - self.body(body); - if !orelse.is_empty() { - statement!({ - self.p("else:"); - }); - self.body(orelse); - } - } Stmt::While(ast::StmtWhile { test, body, @@ -490,21 +439,17 @@ impl<'a> Generator<'a> { self.body(&clause.body); } } - Stmt::With(ast::StmtWith { items, body, .. }) => { + Stmt::With(ast::StmtWith { + is_async, + items, + body, + .. + }) => { statement!({ - self.p("with "); - let mut first = true; - for item in items { - self.p_delim(&mut first, ", "); - self.unparse_with_item(item); + if *is_async { + self.p("async "); } - self.p(":"); - }); - self.body(body); - } - Stmt::AsyncWith(ast::StmtAsyncWith { items, body, .. }) => { - statement!({ - self.p("async with "); + self.p("with "); let mut first = true; for item in items { self.p_delim(&mut first, ", "); diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 865c770b19..728ea3e7ca 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -67,9 +67,7 @@ pub(super) fn place_comment<'a>( handle_module_level_own_line_comment_before_class_or_function_comment(comment, locator) } AnyNodeRef::WithItem(_) => handle_with_item_comment(comment, locator), - AnyNodeRef::StmtFunctionDef(_) | AnyNodeRef::StmtAsyncFunctionDef(_) => { - handle_leading_function_with_decorators_comment(comment) - } + AnyNodeRef::StmtFunctionDef(_) => handle_leading_function_with_decorators_comment(comment), AnyNodeRef::StmtClassDef(class_def) => { handle_leading_class_with_decorators_comment(comment, class_def) } @@ -178,7 +176,6 @@ fn handle_end_of_line_comment_around_body<'a>( fn is_first_statement_in_body(statement: AnyNodeRef, has_body: AnyNodeRef) -> bool { match has_body { AnyNodeRef::StmtFor(ast::StmtFor { body, orelse, .. }) - | AnyNodeRef::StmtAsyncFor(ast::StmtAsyncFor { body, orelse, .. }) | AnyNodeRef::StmtWhile(ast::StmtWhile { body, orelse, .. }) => { are_same_optional(statement, body.first()) || are_same_optional(statement, orelse.first()) @@ -208,7 +205,6 @@ fn is_first_statement_in_body(statement: AnyNodeRef, has_body: AnyNodeRef) -> bo body, .. }) | AnyNodeRef::StmtFunctionDef(ast::StmtFunctionDef { body, .. }) - | AnyNodeRef::StmtAsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) | AnyNodeRef::StmtClassDef(ast::StmtClassDef { body, .. }) => { are_same_optional(statement, body.first()) } @@ -773,9 +769,7 @@ fn handle_module_level_own_line_comment_before_class_or_function_comment<'a>( // ... where the following is a function or class statement. if !matches!( following, - AnyNodeRef::StmtAsyncFunctionDef(_) - | AnyNodeRef::StmtFunctionDef(_) - | AnyNodeRef::StmtClassDef(_) + AnyNodeRef::StmtFunctionDef(_) | AnyNodeRef::StmtClassDef(_) ) { return CommentPlacement::Default(comment); } @@ -1408,10 +1402,8 @@ where fn last_child_in_body(node: AnyNodeRef) -> Option { let body = match node { AnyNodeRef::StmtFunctionDef(ast::StmtFunctionDef { body, .. }) - | AnyNodeRef::StmtAsyncFunctionDef(ast::StmtAsyncFunctionDef { body, .. }) | AnyNodeRef::StmtClassDef(ast::StmtClassDef { body, .. }) | AnyNodeRef::StmtWith(ast::StmtWith { body, .. }) - | AnyNodeRef::StmtAsyncWith(ast::StmtAsyncWith { body, .. }) | AnyNodeRef::MatchCase(MatchCase { body, .. }) | AnyNodeRef::ExceptHandlerExceptHandler(ast::ExceptHandlerExceptHandler { body, .. @@ -1424,7 +1416,6 @@ fn last_child_in_body(node: AnyNodeRef) -> Option { }) => elif_else_clauses.last().map_or(body, |clause| &clause.body), AnyNodeRef::StmtFor(ast::StmtFor { body, orelse, .. }) - | AnyNodeRef::StmtAsyncFor(ast::StmtAsyncFor { body, orelse, .. }) | AnyNodeRef::StmtWhile(ast::StmtWhile { body, orelse, .. }) => { if orelse.is_empty() { body @@ -1477,7 +1468,6 @@ fn last_child_in_body(node: AnyNodeRef) -> Option { fn is_first_statement_in_alternate_body(statement: AnyNodeRef, has_body: AnyNodeRef) -> bool { match has_body { AnyNodeRef::StmtFor(ast::StmtFor { orelse, .. }) - | AnyNodeRef::StmtAsyncFor(ast::StmtAsyncFor { orelse, .. }) | AnyNodeRef::StmtWhile(ast::StmtWhile { orelse, .. }) => { are_same_optional(statement, orelse.first()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_named_expr.rs b/crates/ruff_python_formatter/src/expression/expr_named_expr.rs index 88bf4b2052..e0b1f674b9 100644 --- a/crates/ruff_python_formatter/src/expression/expr_named_expr.rs +++ b/crates/ruff_python_formatter/src/expression/expr_named_expr.rs @@ -46,7 +46,6 @@ impl NeedsParentheses for ExprNamedExpr { || parent.is_with_item() || parent.is_stmt_delete() || parent.is_stmt_for() - || parent.is_stmt_async_for() { OptionalParentheses::Always } else { diff --git a/crates/ruff_python_formatter/src/generated.rs b/crates/ruff_python_formatter/src/generated.rs index 1871e09bd5..5a71b2d6e9 100644 --- a/crates/ruff_python_formatter/src/generated.rs +++ b/crates/ruff_python_formatter/src/generated.rs @@ -108,42 +108,6 @@ impl<'ast> IntoFormat> for ast::StmtFunctionDef { } } -impl FormatRule> - for crate::statement::stmt_async_function_def::FormatStmtAsyncFunctionDef -{ - #[inline] - fn fmt(&self, node: &ast::StmtAsyncFunctionDef, f: &mut PyFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'ast> AsFormat> for ast::StmtAsyncFunctionDef { - type Format<'a> = FormatRefWithRule< - 'a, - ast::StmtAsyncFunctionDef, - crate::statement::stmt_async_function_def::FormatStmtAsyncFunctionDef, - PyFormatContext<'ast>, - >; - fn format(&self) -> Self::Format<'_> { - FormatRefWithRule::new( - self, - crate::statement::stmt_async_function_def::FormatStmtAsyncFunctionDef::default(), - ) - } -} -impl<'ast> IntoFormat> for ast::StmtAsyncFunctionDef { - type Format = FormatOwnedWithRule< - ast::StmtAsyncFunctionDef, - crate::statement::stmt_async_function_def::FormatStmtAsyncFunctionDef, - PyFormatContext<'ast>, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::statement::stmt_async_function_def::FormatStmtAsyncFunctionDef::default(), - ) - } -} - impl FormatRule> for crate::statement::stmt_class_def::FormatStmtClassDef { @@ -424,42 +388,6 @@ impl<'ast> IntoFormat> for ast::StmtFor { } } -impl FormatRule> - for crate::statement::stmt_async_for::FormatStmtAsyncFor -{ - #[inline] - fn fmt(&self, node: &ast::StmtAsyncFor, f: &mut PyFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'ast> AsFormat> for ast::StmtAsyncFor { - type Format<'a> = FormatRefWithRule< - 'a, - ast::StmtAsyncFor, - crate::statement::stmt_async_for::FormatStmtAsyncFor, - PyFormatContext<'ast>, - >; - fn format(&self) -> Self::Format<'_> { - FormatRefWithRule::new( - self, - crate::statement::stmt_async_for::FormatStmtAsyncFor::default(), - ) - } -} -impl<'ast> IntoFormat> for ast::StmtAsyncFor { - type Format = FormatOwnedWithRule< - ast::StmtAsyncFor, - crate::statement::stmt_async_for::FormatStmtAsyncFor, - PyFormatContext<'ast>, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::statement::stmt_async_for::FormatStmtAsyncFor::default(), - ) - } -} - impl FormatRule> for crate::statement::stmt_while::FormatStmtWhile { @@ -554,42 +482,6 @@ impl<'ast> IntoFormat> for ast::StmtWith { } } -impl FormatRule> - for crate::statement::stmt_async_with::FormatStmtAsyncWith -{ - #[inline] - fn fmt(&self, node: &ast::StmtAsyncWith, f: &mut PyFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'ast> AsFormat> for ast::StmtAsyncWith { - type Format<'a> = FormatRefWithRule< - 'a, - ast::StmtAsyncWith, - crate::statement::stmt_async_with::FormatStmtAsyncWith, - PyFormatContext<'ast>, - >; - fn format(&self) -> Self::Format<'_> { - FormatRefWithRule::new( - self, - crate::statement::stmt_async_with::FormatStmtAsyncWith::default(), - ) - } -} -impl<'ast> IntoFormat> for ast::StmtAsyncWith { - type Format = FormatOwnedWithRule< - ast::StmtAsyncWith, - crate::statement::stmt_async_with::FormatStmtAsyncWith, - PyFormatContext<'ast>, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::statement::stmt_async_with::FormatStmtAsyncWith::default(), - ) - } -} - impl FormatRule> for crate::statement::stmt_match::FormatStmtMatch { diff --git a/crates/ruff_python_formatter/src/statement/mod.rs b/crates/ruff_python_formatter/src/statement/mod.rs index 114d771528..1a92f03e39 100644 --- a/crates/ruff_python_formatter/src/statement/mod.rs +++ b/crates/ruff_python_formatter/src/statement/mod.rs @@ -5,9 +5,6 @@ use ruff_python_ast::Stmt; pub(crate) mod stmt_ann_assign; pub(crate) mod stmt_assert; pub(crate) mod stmt_assign; -pub(crate) mod stmt_async_for; -pub(crate) mod stmt_async_function_def; -pub(crate) mod stmt_async_with; pub(crate) mod stmt_aug_assign; pub(crate) mod stmt_break; pub(crate) mod stmt_class_def; @@ -40,7 +37,6 @@ impl FormatRule> for FormatStmt { fn fmt(&self, item: &Stmt, f: &mut PyFormatter) -> FormatResult<()> { match item { Stmt::FunctionDef(x) => x.format().fmt(f), - Stmt::AsyncFunctionDef(x) => x.format().fmt(f), Stmt::ClassDef(x) => x.format().fmt(f), Stmt::Return(x) => x.format().fmt(f), Stmt::Delete(x) => x.format().fmt(f), @@ -48,11 +44,9 @@ impl FormatRule> for FormatStmt { Stmt::AugAssign(x) => x.format().fmt(f), Stmt::AnnAssign(x) => x.format().fmt(f), Stmt::For(x) => x.format().fmt(f), - Stmt::AsyncFor(x) => x.format().fmt(f), Stmt::While(x) => x.format().fmt(f), Stmt::If(x) => x.format().fmt(f), Stmt::With(x) => x.format().fmt(f), - Stmt::AsyncWith(x) => x.format().fmt(f), Stmt::Match(x) => x.format().fmt(f), Stmt::Raise(x) => x.format().fmt(f), Stmt::Try(x) => x.format().fmt(f), diff --git a/crates/ruff_python_formatter/src/statement/stmt_async_for.rs b/crates/ruff_python_formatter/src/statement/stmt_async_for.rs deleted file mode 100644 index f47b3452e2..0000000000 --- a/crates/ruff_python_formatter/src/statement/stmt_async_for.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::prelude::*; -use crate::statement::stmt_for::AnyStatementFor; -use crate::{FormatNodeRule, PyFormatter}; -use ruff_formatter::FormatResult; -use ruff_python_ast::StmtAsyncFor; - -#[derive(Default)] -pub struct FormatStmtAsyncFor; - -impl FormatNodeRule for FormatStmtAsyncFor { - fn fmt_fields(&self, item: &StmtAsyncFor, f: &mut PyFormatter) -> FormatResult<()> { - AnyStatementFor::from(item).fmt(f) - } - - fn fmt_dangling_comments( - &self, - _node: &StmtAsyncFor, - _f: &mut PyFormatter, - ) -> FormatResult<()> { - // Handled in `fmt_fields` - Ok(()) - } -} diff --git a/crates/ruff_python_formatter/src/statement/stmt_async_function_def.rs b/crates/ruff_python_formatter/src/statement/stmt_async_function_def.rs deleted file mode 100644 index 1ba23722e5..0000000000 --- a/crates/ruff_python_formatter/src/statement/stmt_async_function_def.rs +++ /dev/null @@ -1,24 +0,0 @@ -use ruff_python_ast::StmtAsyncFunctionDef; - -use ruff_python_ast::function::AnyFunctionDefinition; - -use crate::prelude::*; -use crate::FormatNodeRule; - -#[derive(Default)] -pub struct FormatStmtAsyncFunctionDef; - -impl FormatNodeRule for FormatStmtAsyncFunctionDef { - fn fmt_fields(&self, item: &StmtAsyncFunctionDef, f: &mut PyFormatter) -> FormatResult<()> { - AnyFunctionDefinition::from(item).format().fmt(f) - } - - fn fmt_dangling_comments( - &self, - _node: &StmtAsyncFunctionDef, - _f: &mut PyFormatter, - ) -> FormatResult<()> { - // Handled by `AnyFunctionDef` - Ok(()) - } -} diff --git a/crates/ruff_python_formatter/src/statement/stmt_async_with.rs b/crates/ruff_python_formatter/src/statement/stmt_async_with.rs deleted file mode 100644 index fdd89fdb2f..0000000000 --- a/crates/ruff_python_formatter/src/statement/stmt_async_with.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::prelude::*; -use crate::statement::stmt_with::AnyStatementWith; -use crate::FormatNodeRule; -use ruff_python_ast::StmtAsyncWith; - -#[derive(Default)] -pub struct FormatStmtAsyncWith; - -impl FormatNodeRule for FormatStmtAsyncWith { - fn fmt_fields(&self, item: &StmtAsyncWith, f: &mut PyFormatter) -> FormatResult<()> { - AnyStatementWith::from(item).fmt(f) - } - - fn fmt_dangling_comments( - &self, - _node: &StmtAsyncWith, - _f: &mut PyFormatter, - ) -> FormatResult<()> { - // Handled in `fmt_fields` - Ok(()) - } -} diff --git a/crates/ruff_python_formatter/src/statement/stmt_for.rs b/crates/ruff_python_formatter/src/statement/stmt_for.rs index 957fd563c7..e9cac17d23 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_for.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_for.rs @@ -1,13 +1,12 @@ +use ruff_formatter::{format_args, write, Buffer, FormatResult}; +use ruff_python_ast::{Expr, Ranged, Stmt, StmtFor}; + use crate::comments::{leading_alternate_branch_comments, trailing_comments}; use crate::expression::expr_tuple::TupleParentheses; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; use crate::prelude::*; use crate::{FormatNodeRule, PyFormatter}; -use ruff_formatter::{format_args, write, Buffer, FormatResult}; -use ruff_python_ast::node::AnyNodeRef; -use ruff_python_ast::{Expr, Ranged, Stmt, StmtAsyncFor, StmtFor, Suite}; -use ruff_text_size::TextRange; #[derive(Debug)] struct ExprTupleWithoutParentheses<'a>(&'a Expr); @@ -27,85 +26,19 @@ impl Format> for ExprTupleWithoutParentheses<'_> { #[derive(Default)] pub struct FormatStmtFor; -pub(super) enum AnyStatementFor<'a> { - For(&'a StmtFor), - AsyncFor(&'a StmtAsyncFor), -} - -impl<'a> AnyStatementFor<'a> { - const fn is_async(&self) -> bool { - matches!(self, AnyStatementFor::AsyncFor(_)) - } - - fn target(&self) -> &Expr { - match self { - AnyStatementFor::For(stmt) => &stmt.target, - AnyStatementFor::AsyncFor(stmt) => &stmt.target, - } - } - - #[allow(clippy::iter_not_returning_iterator)] - fn iter(&self) -> &Expr { - match self { - AnyStatementFor::For(stmt) => &stmt.iter, - AnyStatementFor::AsyncFor(stmt) => &stmt.iter, - } - } - - fn body(&self) -> &Suite { - match self { - AnyStatementFor::For(stmt) => &stmt.body, - AnyStatementFor::AsyncFor(stmt) => &stmt.body, - } - } - - fn orelse(&self) -> &Suite { - match self { - AnyStatementFor::For(stmt) => &stmt.orelse, - AnyStatementFor::AsyncFor(stmt) => &stmt.orelse, - } - } -} - -impl Ranged for AnyStatementFor<'_> { - fn range(&self) -> TextRange { - match self { - AnyStatementFor::For(stmt) => stmt.range(), - AnyStatementFor::AsyncFor(stmt) => stmt.range(), - } - } -} - -impl<'a> From<&'a StmtFor> for AnyStatementFor<'a> { - fn from(value: &'a StmtFor) -> Self { - AnyStatementFor::For(value) - } -} - -impl<'a> From<&'a StmtAsyncFor> for AnyStatementFor<'a> { - fn from(value: &'a StmtAsyncFor) -> Self { - AnyStatementFor::AsyncFor(value) - } -} - -impl<'a> From<&AnyStatementFor<'a>> for AnyNodeRef<'a> { - fn from(value: &AnyStatementFor<'a>) -> Self { - match value { - AnyStatementFor::For(stmt) => AnyNodeRef::StmtFor(stmt), - AnyStatementFor::AsyncFor(stmt) => AnyNodeRef::StmtAsyncFor(stmt), - } - } -} - -impl Format> for AnyStatementFor<'_> { - fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { - let target = self.target(); - let iter = self.iter(); - let body = self.body(); - let orelse = self.orelse(); +impl FormatNodeRule for FormatStmtFor { + fn fmt_fields(&self, item: &StmtFor, f: &mut PyFormatter) -> FormatResult<()> { + let StmtFor { + is_async, + target, + iter, + body, + orelse, + range: _, + } = item; let comments = f.context().comments().clone(); - let dangling_comments = comments.dangling_comments(self); + let dangling_comments = comments.dangling_comments(item); let body_start = body.first().map_or(iter.end(), Stmt::start); let or_else_comments_start = dangling_comments.partition_point(|comment| comment.slice().end() < body_start); @@ -116,15 +49,14 @@ impl Format> for AnyStatementFor<'_> { write!( f, [ - self.is_async() - .then_some(format_args![text("async"), space()]), + is_async.then_some(format_args![text("async"), space()]), text("for"), space(), ExprTupleWithoutParentheses(target), space(), text("in"), space(), - maybe_parenthesize_expression(iter, self, Parenthesize::IfBreaks), + maybe_parenthesize_expression(iter, item, Parenthesize::IfBreaks), text(":"), trailing_comments(trailing_condition_comments), block_indent(&body.format()) @@ -153,12 +85,6 @@ impl Format> for AnyStatementFor<'_> { Ok(()) } -} - -impl FormatNodeRule for FormatStmtFor { - fn fmt_fields(&self, item: &StmtFor, f: &mut PyFormatter) -> FormatResult<()> { - AnyStatementFor::from(item).fmt(f) - } fn fmt_dangling_comments(&self, _node: &StmtFor, _f: &mut PyFormatter) -> FormatResult<()> { // Handled in `fmt_fields` diff --git a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs index 37100ad626..80a8da56ca 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs @@ -1,11 +1,8 @@ +use ruff_formatter::write; use ruff_python_ast::{Ranged, StmtFunctionDef}; - -use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule}; -use ruff_python_ast::function::AnyFunctionDefinition; use ruff_python_trivia::lines_after_ignoring_trivia; use crate::comments::{leading_comments, trailing_comments}; - use crate::expression::parentheses::{optional_parentheses, Parentheses}; use crate::prelude::*; use crate::statement::suite::SuiteKind; @@ -16,24 +13,6 @@ pub struct FormatStmtFunctionDef; impl FormatNodeRule for FormatStmtFunctionDef { fn fmt_fields(&self, item: &StmtFunctionDef, f: &mut PyFormatter) -> FormatResult<()> { - AnyFunctionDefinition::from(item).format().fmt(f) - } - - fn fmt_dangling_comments( - &self, - _node: &StmtFunctionDef, - _f: &mut PyFormatter, - ) -> FormatResult<()> { - // Handled by `AnyFunctionDef` - Ok(()) - } -} - -#[derive(Default)] -pub struct FormatAnyFunctionDef; - -impl FormatRule, PyFormatContext<'_>> for FormatAnyFunctionDef { - fn fmt(&self, item: &AnyFunctionDefinition<'_>, f: &mut PyFormatter) -> FormatResult<()> { let comments = f.context().comments().clone(); let dangling_comments = comments.dangling_comments(item); @@ -43,9 +22,9 @@ impl FormatRule, PyFormatContext<'_>> for FormatAnyFun let (leading_definition_comments, trailing_definition_comments) = dangling_comments.split_at(trailing_definition_comments_start); - if let Some(last_decorator) = item.decorators().last() { + if let Some(last_decorator) = item.decorator_list.last() { f.join_with(hard_line_break()) - .entries(item.decorators().iter().formatted()) + .entries(item.decorator_list.iter().formatted()) .finish()?; if leading_definition_comments.is_empty() { @@ -69,21 +48,19 @@ impl FormatRule, PyFormatContext<'_>> for FormatAnyFun } } - if item.is_async() { + if item.is_async { write!(f, [text("async"), space()])?; } - let name = item.name(); + write!(f, [text("def"), space(), item.name.format()])?; - write!(f, [text("def"), space(), name.format()])?; - - if let Some(type_params) = item.type_params() { + if let Some(type_params) = item.type_params.as_ref() { write!(f, [type_params.format()])?; } - write!(f, [item.arguments().format()])?; + write!(f, [item.parameters.format()])?; - if let Some(return_annotation) = item.returns() { + if let Some(return_annotation) = item.returns.as_ref() { write!( f, [ @@ -102,33 +79,17 @@ impl FormatRule, PyFormatContext<'_>> for FormatAnyFun [ text(":"), trailing_comments(trailing_definition_comments), - block_indent(&item.body().format().with_options(SuiteKind::Function)) + block_indent(&item.body.format().with_options(SuiteKind::Function)) ] ) } -} -impl<'def, 'ast> AsFormat> for AnyFunctionDefinition<'def> { - type Format<'a> = FormatRefWithRule< - 'a, - AnyFunctionDefinition<'def>, - FormatAnyFunctionDef, - PyFormatContext<'ast>, - > where Self: 'a; - - fn format(&self) -> Self::Format<'_> { - FormatRefWithRule::new(self, FormatAnyFunctionDef) - } -} - -impl<'def, 'ast> IntoFormat> for AnyFunctionDefinition<'def> { - type Format = FormatOwnedWithRule< - AnyFunctionDefinition<'def>, - FormatAnyFunctionDef, - PyFormatContext<'ast>, - >; - - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new(self, FormatAnyFunctionDef) + fn fmt_dangling_comments( + &self, + _node: &StmtFunctionDef, + _f: &mut PyFormatter, + ) -> FormatResult<()> { + // Handled in `fmt_fields` + Ok(()) } } diff --git a/crates/ruff_python_formatter/src/statement/stmt_with.rs b/crates/ruff_python_formatter/src/statement/stmt_with.rs index 828d0e3536..b8afb2042d 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_with.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_with.rs @@ -1,9 +1,7 @@ -use ruff_python_ast::{Ranged, StmtAsyncWith, StmtWith, Suite, WithItem}; -use ruff_text_size::TextRange; - use ruff_formatter::{format_args, write, FormatError}; -use ruff_python_ast::node::AnyNodeRef; +use ruff_python_ast::{Ranged, StmtWith}; use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer}; +use ruff_text_size::TextRange; use crate::comments::trailing_comments; use crate::expression::parentheses::{ @@ -12,81 +10,29 @@ use crate::expression::parentheses::{ use crate::prelude::*; use crate::FormatNodeRule; -pub(super) enum AnyStatementWith<'a> { - With(&'a StmtWith), - AsyncWith(&'a StmtAsyncWith), -} +#[derive(Default)] +pub struct FormatStmtWith; -impl<'a> AnyStatementWith<'a> { - const fn is_async(&self) -> bool { - matches!(self, AnyStatementWith::AsyncWith(_)) - } - - fn items(&self) -> &[WithItem] { - match self { - AnyStatementWith::With(with) => with.items.as_slice(), - AnyStatementWith::AsyncWith(with) => with.items.as_slice(), - } - } - - fn body(&self) -> &Suite { - match self { - AnyStatementWith::With(with) => &with.body, - AnyStatementWith::AsyncWith(with) => &with.body, - } - } -} - -impl Ranged for AnyStatementWith<'_> { - fn range(&self) -> TextRange { - match self { - AnyStatementWith::With(with) => with.range(), - AnyStatementWith::AsyncWith(with) => with.range(), - } - } -} - -impl<'a> From<&'a StmtWith> for AnyStatementWith<'a> { - fn from(value: &'a StmtWith) -> Self { - AnyStatementWith::With(value) - } -} - -impl<'a> From<&'a StmtAsyncWith> for AnyStatementWith<'a> { - fn from(value: &'a StmtAsyncWith) -> Self { - AnyStatementWith::AsyncWith(value) - } -} - -impl<'a> From<&AnyStatementWith<'a>> for AnyNodeRef<'a> { - fn from(value: &AnyStatementWith<'a>) -> Self { - match value { - AnyStatementWith::With(with) => AnyNodeRef::StmtWith(with), - AnyStatementWith::AsyncWith(with) => AnyNodeRef::StmtAsyncWith(with), - } - } -} - -impl Format> for AnyStatementWith<'_> { - fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { +impl FormatNodeRule for FormatStmtWith { + fn fmt_fields(&self, item: &StmtWith, f: &mut PyFormatter) -> FormatResult<()> { let comments = f.context().comments().clone(); - let dangling_comments = comments.dangling_comments(self); + let dangling_comments = comments.dangling_comments(item); write!( f, [ - self.is_async() + item.is_async .then_some(format_args![text("async"), space()]), text("with"), space() ] )?; - if are_with_items_parenthesized(self, f.context())? { + if are_with_items_parenthesized(item, f.context())? { optional_parentheses(&format_with(|f| { - let mut joiner = f.join_comma_separated(self.body().first().unwrap().start()); + let mut joiner = f.join_comma_separated(item.body.first().unwrap().start()); - for item in self.items() { + for item in &item.items { joiner.entry_with_line_separator( item, &item.format(), @@ -98,7 +44,7 @@ impl Format> for AnyStatementWith<'_> { .fmt(f)?; } else { f.join_with(format_args![text(","), space()]) - .entries(self.items().iter().formatted()) + .entries(item.items.iter().formatted()) .finish()?; } @@ -107,18 +53,20 @@ impl Format> for AnyStatementWith<'_> { [ text(":"), trailing_comments(dangling_comments), - block_indent(&self.body().format()) + block_indent(&item.body.format()) ] ) } + + fn fmt_dangling_comments(&self, _node: &StmtWith, _f: &mut PyFormatter) -> FormatResult<()> { + // Handled in `fmt_fields` + Ok(()) + } } -fn are_with_items_parenthesized( - with: &AnyStatementWith, - context: &PyFormatContext, -) -> FormatResult { +fn are_with_items_parenthesized(with: &StmtWith, context: &PyFormatContext) -> FormatResult { let first_with_item = with - .items() + .items .first() .ok_or(FormatError::syntax_error("Expected at least one with item"))?; let before_first_with_item = TextRange::new(with.start(), first_with_item.start()); @@ -145,17 +93,3 @@ fn are_with_items_parenthesized( None => Ok(false), } } - -#[derive(Default)] -pub struct FormatStmtWith; - -impl FormatNodeRule for FormatStmtWith { - fn fmt_fields(&self, item: &StmtWith, f: &mut PyFormatter) -> FormatResult<()> { - AnyStatementWith::from(item).fmt(f) - } - - fn fmt_dangling_comments(&self, _node: &StmtWith, _f: &mut PyFormatter) -> FormatResult<()> { - // Handled in `fmt_fields` - Ok(()) - } -} diff --git a/crates/ruff_python_formatter/src/statement/suite.rs b/crates/ruff_python_formatter/src/statement/suite.rs index 771ad26036..ad3da3c927 100644 --- a/crates/ruff_python_formatter/src/statement/suite.rs +++ b/crates/ruff_python_formatter/src/statement/suite.rs @@ -210,10 +210,7 @@ impl FormatRule> for FormatSuite { /// Returns `true` if a [`Stmt`] is a class or function definition. const fn is_class_or_function_definition(stmt: &Stmt) -> bool { - matches!( - stmt, - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) - ) + matches!(stmt, Stmt::FunctionDef(_) | Stmt::ClassDef(_)) } /// Returns `true` if a [`Stmt`] is an import. diff --git a/crates/ruff_python_parser/src/python.lalrpop b/crates/ruff_python_parser/src/python.lalrpop index fb75124ea0..3416ab6c09 100644 --- a/crates/ruff_python_parser/src/python.lalrpop +++ b/crates/ruff_python_parser/src/python.lalrpop @@ -858,11 +858,7 @@ ForStatement: ast::Stmt = { .end(); let target = Box::new(set_context(target, ast::ExprContext::Store)); let iter = Box::new(iter); - if is_async.is_some() { - ast::Stmt::AsyncFor(ast::StmtAsyncFor { target, iter, body, orelse, range: (location..end_location).into() }) - } else { - ast::Stmt::For(ast::StmtFor { target, iter, body, orelse, range: (location..end_location).into() }) - } + ast::Stmt::For(ast::StmtFor { target, iter, body, orelse, is_async: is_async.is_some(), range: (location..end_location).into() }) }, }; @@ -975,11 +971,7 @@ ExceptClause: ast::ExceptHandler = { WithStatement: ast::Stmt = { "with" ":" => { let end_location = body.last().unwrap().end(); - if is_async.is_some() { - ast::StmtAsyncWith { items, body, range: (location..end_location).into() }.into() - } else { - ast::StmtWith { items, body, range: (location..end_location).into() }.into() - } + ast::StmtWith { items, body, is_async: is_async.is_some(), range: (location..end_location).into() }.into() }, }; @@ -1014,11 +1006,7 @@ FuncDef: ast::Stmt = { let args = Box::new(args); let returns = r.map(Box::new); let end_location = body.last().unwrap().end(); - if is_async.is_some() { - ast::StmtAsyncFunctionDef { name, parameters:args, body, decorator_list, returns, type_params, range: (location..end_location).into() }.into() - } else { - ast::StmtFunctionDef { name, parameters:args, body, decorator_list, returns, type_params, range: (location..end_location).into() }.into() - } + ast::StmtFunctionDef { name, parameters:args, body, decorator_list, returns, type_params, is_async: is_async.is_some(), range: (location..end_location).into() }.into() }, }; diff --git a/crates/ruff_python_parser/src/python.rs b/crates/ruff_python_parser/src/python.rs index 8577cb525b..4ca7af8dfe 100644 --- a/crates/ruff_python_parser/src/python.rs +++ b/crates/ruff_python_parser/src/python.rs @@ -1,5 +1,5 @@ // auto-generated: "lalrpop 0.20.0" -// sha3: f99d8cb29227bfbe1fa07719f655304a9a93fd4715726687ef40c091adbdbad5 +// sha3: d713a7771107f8c20353ce5e890fba004b3c5491f513d28e9348a49cd510c59b use num_bigint::BigInt; use ruff_text_size::TextSize; use ruff_python_ast::{self as ast, Ranged, MagicKind}; @@ -33081,11 +33081,7 @@ fn __action147< .end(); let target = Box::new(set_context(target, ast::ExprContext::Store)); let iter = Box::new(iter); - if is_async.is_some() { - ast::Stmt::AsyncFor(ast::StmtAsyncFor { target, iter, body, orelse, range: (location..end_location).into() }) - } else { - ast::Stmt::For(ast::StmtFor { target, iter, body, orelse, range: (location..end_location).into() }) - } + ast::Stmt::For(ast::StmtFor { target, iter, body, orelse, is_async: is_async.is_some(), range: (location..end_location).into() }) } } @@ -33306,11 +33302,7 @@ fn __action155< { { let end_location = body.last().unwrap().end(); - if is_async.is_some() { - ast::StmtAsyncWith { items, body, range: (location..end_location).into() }.into() - } else { - ast::StmtWith { items, body, range: (location..end_location).into() }.into() - } + ast::StmtWith { items, body, is_async: is_async.is_some(), range: (location..end_location).into() }.into() } } @@ -33407,11 +33399,7 @@ fn __action161< let args = Box::new(args); let returns = r.map(Box::new); let end_location = body.last().unwrap().end(); - if is_async.is_some() { - ast::StmtAsyncFunctionDef { name, parameters:args, body, decorator_list, returns, type_params, range: (location..end_location).into() }.into() - } else { - ast::StmtFunctionDef { name, parameters:args, body, decorator_list, returns, type_params, range: (location..end_location).into() }.into() - } + ast::StmtFunctionDef { name, parameters:args, body, decorator_list, returns, type_params, is_async: is_async.is_some(), range: (location..end_location).into() }.into() } } diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_for.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_for.snap index fb74fe3e48..2d4bf6ba9b 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_for.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_for.snap @@ -6,6 +6,7 @@ expression: parse_ast For( StmtFor { range: 0..24, + is_async: false, target: Name( ExprName { range: 4..5, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_with.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_with.snap index c77adbe5f3..f977b37549 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_with.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__context__tests__assign_with.snap @@ -6,6 +6,7 @@ expression: parse_ast With( StmtWith { range: 0..17, + is_async: false, items: [ WithItem { range: 5..11, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args.snap index 4e6cabe7e1..ad7dbadf9a 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..23, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args_with_defaults.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args_with_defaults.snap index 2008962778..33a05a02ec 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args_with_defaults.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_kw_only_args_with_defaults.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..29, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args.snap index 2c5ceaf090..4e2121628d 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..13, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args_with_ranges.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args_with_ranges.snap index 2c5ceaf090..4e2121628d 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args_with_ranges.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_no_args_with_ranges.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..13, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args.snap index 5e32c2421e..cd12db1311 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..32, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults.snap index fe9ac3afcf..4276b8915b 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..38, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs.snap index 8944370563..ba1ece7a57 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..42, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs_and_kwargs.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs_and_kwargs.snap index e5ef63795f..dc2888c7bd 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs_and_kwargs.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_and_kw_only_args_with_defaults_and_varargs_and_kwargs.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..52, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args.snap index 8a969a82e6..788b1b7a49 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..20, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_defaults.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_defaults.snap index 4f369f862b..7c0459ab6c 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_defaults.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_defaults.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..26, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_ranges.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_ranges.snap index 8a969a82e6..788b1b7a49 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_ranges.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__function__tests__function_pos_args_with_ranges.snap @@ -7,6 +7,7 @@ Ok( FunctionDef( StmtFunctionDef { range: 0..20, + is_async: false, decorator_list: [], name: Identifier { id: "f", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__decorator_ranges.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__decorator_ranges.snap index b976725751..160699606e 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__decorator_ranges.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__decorator_ranges.snap @@ -6,6 +6,7 @@ expression: parse_ast FunctionDef( StmtFunctionDef { range: 0..34, + is_async: false, decorator_list: [ Decorator { range: 0..13, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap index 895867df6e..ba9adb4a07 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap @@ -125,6 +125,7 @@ Module( FunctionDef( StmtFunctionDef { range: 566..626, + is_async: false, decorator_list: [], name: Identifier { id: "foo", @@ -199,6 +200,7 @@ Module( For( StmtFor { range: 701..727, + is_async: false, target: Name( ExprName { range: 705..706, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap index 9ac6469514..601df87ff8 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap @@ -38,6 +38,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 18..44, + is_async: false, decorator_list: [], name: Identifier { id: "__init__", @@ -78,6 +79,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 46..98, + is_async: false, decorator_list: [], name: Identifier { id: "method_with_default", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_function_definition.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_function_definition.snap index 1c03ac6610..cf0f7df886 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_function_definition.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_function_definition.snap @@ -6,6 +6,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 0..20, + is_async: false, decorator_list: [], name: Identifier { id: "func", @@ -53,6 +54,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 22..53, + is_async: false, decorator_list: [], name: Identifier { id: "func", @@ -132,6 +134,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 55..91, + is_async: false, decorator_list: [], name: Identifier { id: "func", @@ -219,6 +222,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 93..138, + is_async: false, decorator_list: [], name: Identifier { id: "func", @@ -321,6 +325,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 140..171, + is_async: false, decorator_list: [], name: Identifier { id: "func", @@ -393,6 +398,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 173..230, + is_async: false, decorator_list: [], name: Identifier { id: "func", @@ -496,6 +502,7 @@ expression: "parse_suite(source, \"\").unwrap()" FunctionDef( StmtFunctionDef { range: 232..273, + is_async: false, decorator_list: [], name: Identifier { id: "func", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__variadic_generics.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__variadic_generics.snap index ec38d5c16b..891e02d914 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__variadic_generics.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__variadic_generics.snap @@ -6,6 +6,7 @@ expression: parse_ast FunctionDef( StmtFunctionDef { range: 1..49, + is_async: false, decorator_list: [], name: Identifier { id: "args_to_tuple", diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__with_statement.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__with_statement.snap index 668b5381fe..abae0fb4bc 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__with_statement.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__with_statement.snap @@ -1,11 +1,12 @@ --- source: crates/ruff_python_parser/src/parser.rs -expression: "ast::Suite::parse(source, \"\").unwrap()" +expression: "parse_suite(source, \"\").unwrap()" --- [ With( StmtWith { range: 0..12, + is_async: false, items: [ WithItem { range: 5..6, @@ -33,6 +34,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 13..30, + is_async: false, items: [ WithItem { range: 18..24, @@ -68,6 +70,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 31..46, + is_async: false, items: [ WithItem { range: 36..37, @@ -108,6 +111,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 47..72, + is_async: false, items: [ WithItem { range: 52..58, @@ -164,6 +168,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 73..97, + is_async: false, items: [ WithItem { range: 78..91, @@ -214,6 +219,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 98..127, + is_async: false, items: [ WithItem { range: 103..121, @@ -272,6 +278,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 128..141, + is_async: false, items: [ WithItem { range: 133..135, @@ -297,6 +304,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 142..160, + is_async: false, items: [ WithItem { range: 147..154, @@ -330,6 +338,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 161..175, + is_async: false, items: [ WithItem { range: 167..168, @@ -357,6 +366,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 176..195, + is_async: false, items: [ WithItem { range: 181..189, @@ -392,6 +402,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 196..211, + is_async: false, items: [ WithItem { range: 202..203, @@ -419,6 +430,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 212..232, + is_async: false, items: [ WithItem { range: 217..226, @@ -462,6 +474,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 233..250, + is_async: false, items: [ WithItem { range: 239..243, @@ -502,6 +515,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 251..273, + is_async: false, items: [ WithItem { range: 256..267, @@ -554,6 +568,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 274..290, + is_async: false, items: [ WithItem { range: 279..284, @@ -593,6 +608,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 291..312, + is_async: false, items: [ WithItem { range: 296..306, @@ -640,6 +656,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 313..331, + is_async: false, items: [ WithItem { range: 318..325, @@ -688,6 +705,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 332..355, + is_async: false, items: [ WithItem { range: 337..349, @@ -744,6 +762,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 356..375, + is_async: false, items: [ WithItem { range: 361..369, @@ -783,6 +802,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 376..400, + is_async: false, items: [ WithItem { range: 381..394, @@ -830,6 +850,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 401..428, + is_async: false, items: [ WithItem { range: 406..422, @@ -898,6 +919,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 429..461, + is_async: false, items: [ WithItem { range: 434..455, @@ -974,6 +996,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 462..481, + is_async: false, items: [ WithItem { range: 468..474, @@ -1009,6 +1032,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 482..502, + is_async: false, items: [ WithItem { range: 488..494, @@ -1044,6 +1068,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 503..530, + is_async: false, items: [ WithItem { range: 509..515, @@ -1100,6 +1125,7 @@ expression: "ast::Suite::parse(source, \"\").unwrap()" With( StmtWith { range: 531..559, + is_async: false, items: [ WithItem { range: 537..543, diff --git a/crates/ruff_python_semantic/src/analyze/visibility.rs b/crates/ruff_python_semantic/src/analyze/visibility.rs index bc2d536938..846e41fa67 100644 --- a/crates/ruff_python_semantic/src/analyze/visibility.rs +++ b/crates/ruff_python_semantic/src/analyze/visibility.rs @@ -178,8 +178,7 @@ impl ModuleSource<'_> { pub(crate) fn function_visibility(stmt: &Stmt) -> Visibility { match stmt { - Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { name, .. }) => { + Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) => { if name.starts_with('_') { Visibility::Private } else { @@ -191,52 +190,45 @@ pub(crate) fn function_visibility(stmt: &Stmt) -> Visibility { } pub(crate) fn method_visibility(stmt: &Stmt) -> Visibility { - match stmt { - Stmt::FunctionDef(ast::StmtFunctionDef { - name, - decorator_list, - .. + let Stmt::FunctionDef(ast::StmtFunctionDef { + name, + decorator_list, + .. + }) = stmt + else { + panic!("Found non-FunctionDef in method_visibility") + }; + + // Is this a setter or deleter? + if decorator_list.iter().any(|decorator| { + collect_call_path(&decorator.expression).is_some_and(|call_path| { + call_path.as_slice() == [name, "setter"] || call_path.as_slice() == [name, "deleter"] }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { - name, - decorator_list, - .. - }) => { - // Is this a setter or deleter? - if decorator_list.iter().any(|decorator| { - collect_call_path(&decorator.expression).is_some_and(|call_path| { - call_path.as_slice() == [name, "setter"] - || call_path.as_slice() == [name, "deleter"] - }) - }) { - return Visibility::Private; - } - - // Is the method non-private? - if !name.starts_with('_') { - return Visibility::Public; - } - - // Is this a magic method? - if name.starts_with("__") && name.ends_with("__") { - return Visibility::Public; - } - - Visibility::Private - } - _ => panic!("Found non-FunctionDef in method_visibility"), + }) { + return Visibility::Private; } + + // Is the method non-private? + if !name.starts_with('_') { + return Visibility::Public; + } + + // Is this a magic method? + if name.starts_with("__") && name.ends_with("__") { + return Visibility::Public; + } + + Visibility::Private } pub(crate) fn class_visibility(stmt: &Stmt) -> Visibility { - match stmt { - Stmt::ClassDef(ast::StmtClassDef { name, .. }) => { - if name.starts_with('_') { - Visibility::Private - } else { - Visibility::Public - } - } - _ => panic!("Found non-ClassDef in function_visibility"), + let Stmt::ClassDef(ast::StmtClassDef { name, .. }) = stmt else { + panic!("Found non-ClassDef in class_visibility") + }; + + if name.starts_with('_') { + Visibility::Private + } else { + Visibility::Public } } diff --git a/crates/ruff_python_semantic/src/definition.rs b/crates/ruff_python_semantic/src/definition.rs index aec18d62f5..e3a5bfd649 100644 --- a/crates/ruff_python_semantic/src/definition.rs +++ b/crates/ruff_python_semantic/src/definition.rs @@ -84,7 +84,6 @@ impl<'a> Member<'a> { pub fn name(&self) -> Option<&'a str> { match &self.stmt { Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) - | Stmt::AsyncFunctionDef(ast::StmtAsyncFunctionDef { name, .. }) | Stmt::ClassDef(ast::StmtClassDef { name, .. }) => Some(name), _ => None, } diff --git a/crates/ruff_python_semantic/src/globals.rs b/crates/ruff_python_semantic/src/globals.rs index a17b79b6f8..ffaf1b16f9 100644 --- a/crates/ruff_python_semantic/src/globals.rs +++ b/crates/ruff_python_semantic/src/globals.rs @@ -80,7 +80,7 @@ impl<'a> StatementVisitor<'a> for GlobalsVisitor<'a> { self.0.insert(name.as_str(), *range); } } - Stmt::FunctionDef(_) | Stmt::AsyncFunctionDef(_) | Stmt::ClassDef(_) => { + Stmt::FunctionDef(_) | Stmt::ClassDef(_) => { // Don't recurse. } _ => walk_stmt(self, stmt), diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index 2dc7e6e69b..3ae1b06bb2 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -478,7 +478,7 @@ impl<'a> SemanticModel<'a> { } } - seen_function |= scope.kind.is_any_function(); + seen_function |= scope.kind.is_function(); import_starred = import_starred || scope.uses_star_imports(); } @@ -540,7 +540,7 @@ impl<'a> SemanticModel<'a> { } } - seen_function |= scope.kind.is_any_function(); + seen_function |= scope.kind.is_function(); } None @@ -1015,11 +1015,8 @@ impl<'a> SemanticModel<'a> { /// Return `true` if the model is in an async context. pub fn in_async_context(&self) -> bool { for scope in self.current_scopes() { - if scope.kind.is_async_function() { - return true; - } - if scope.kind.is_function() { - return false; + if let ScopeKind::Function(ast::StmtFunctionDef { is_async, .. }) = scope.kind { + return *is_async; } } false diff --git a/crates/ruff_python_semantic/src/scope.rs b/crates/ruff_python_semantic/src/scope.rs index b80d612784..3de3b058f9 100644 --- a/crates/ruff_python_semantic/src/scope.rs +++ b/crates/ruff_python_semantic/src/scope.rs @@ -178,19 +178,12 @@ bitflags! { pub enum ScopeKind<'a> { Class(&'a ast::StmtClassDef), Function(&'a ast::StmtFunctionDef), - AsyncFunction(&'a ast::StmtAsyncFunctionDef), Generator, Module, Type, Lambda(&'a ast::ExprLambda), } -impl ScopeKind<'_> { - pub const fn is_any_function(&self) -> bool { - matches!(self, ScopeKind::Function(_) | ScopeKind::AsyncFunction(_)) - } -} - /// Id uniquely identifying a scope in a program. /// /// Using a `u32` is sufficient because Ruff only supports parsing documents with a size of max `u32::max` From c439435615eecff03e26f1d72aa3adefe67cc454 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 13:17:58 -0400 Subject: [PATCH 014/155] Use dedicated AST nodes on `MemberKind` (#6374) ## Summary This PR leverages the unified function definition node to add precise AST node types to `MemberKind`, which is used to power our docstring definition tracking (e.g., classes and functions, whether they're methods or functions or nested functions and so on, whether they have a docstring, etc.). It was painful to do this in the past because the function variants needed to support a union anyway, but storing precise nodes removes like a dozen panics. No behavior changes -- purely a refactor. ## Test Plan `cargo test` --- .../checkers/ast/analyze/deferred_scopes.rs | 24 ++-- crates/ruff/src/checkers/ast/mod.rs | 24 ++-- crates/ruff/src/docstrings/extraction.rs | 47 +++---- .../src/rules/flake8_annotations/fixes.rs | 12 +- .../src/rules/flake8_annotations/helpers.rs | 61 ++------- .../flake8_annotations/rules/definition.rs | 82 ++++++------ .../rules/iter_method_return_iterable.rs | 30 ++--- crates/ruff/src/rules/pydocstyle/helpers.rs | 31 ++--- .../rules/blank_before_after_class.rs | 17 +-- .../rules/blank_before_after_function.rs | 18 +-- .../src/rules/pydocstyle/rules/capitalized.rs | 14 +- .../src/rules/pydocstyle/rules/if_needed.rs | 19 +-- .../rules/multi_line_summary_start.rs | 8 +- .../rules/pydocstyle/rules/no_signature.rs | 17 +-- .../pydocstyle/rules/non_imperative_mood.rs | 15 +-- .../src/rules/pydocstyle/rules/not_missing.rs | 62 +++++---- .../src/rules/pydocstyle/rules/sections.rs | 32 ++--- .../pyflakes/rules/yield_outside_function.rs | 2 +- crates/ruff_python_ast/src/cast.rs | 15 --- crates/ruff_python_ast/src/identifier.rs | 30 ++++- crates/ruff_python_ast/src/lib.rs | 1 - .../src/analyze/visibility.rs | 45 ++----- crates/ruff_python_semantic/src/definition.rs | 124 ++++++++++++------ 23 files changed, 316 insertions(+), 414 deletions(-) delete mode 100644 crates/ruff_python_ast/src/cast.rs diff --git a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs index 6ab4f74d30..779b8d3ffe 100644 --- a/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs +++ b/crates/ruff/src/checkers/ast/analyze/deferred_scopes.rs @@ -1,5 +1,4 @@ use ruff_diagnostics::Diagnostic; -use ruff_python_ast::cast; use ruff_python_semantic::analyze::{branch_detection, visibility}; use ruff_python_semantic::{Binding, BindingKind, ScopeKind}; @@ -172,18 +171,25 @@ pub(crate) fn deferred_scopes(checker: &mut Checker) { continue; } - let Some(source) = shadowed.source else { + let Some(statement_id) = shadowed.source else { continue; }; // If this is an overloaded function, abort. - if shadowed.kind.is_function_definition() - && visibility::is_overload( - cast::decorator_list(checker.semantic.statement(source)), - &checker.semantic, - ) - { - continue; + if shadowed.kind.is_function_definition() { + if checker + .semantic + .statement(statement_id) + .as_function_def_stmt() + .is_some_and(|function| { + visibility::is_overload( + &function.decorator_list, + &checker.semantic, + ) + }) + { + continue; + } } } else { // Only enforce cross-scope shadowing for imports. diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs index 030ea33af9..fbfe51ff9c 100644 --- a/crates/ruff/src/checkers/ast/mod.rs +++ b/crates/ruff/src/checkers/ast/mod.rs @@ -455,14 +455,16 @@ where // Step 2: Traversal match stmt { - Stmt::FunctionDef(ast::StmtFunctionDef { - body, - parameters, - decorator_list, - returns, - type_params, - .. - }) => { + Stmt::FunctionDef( + function_def @ ast::StmtFunctionDef { + body, + parameters, + decorator_list, + returns, + type_params, + .. + }, + ) => { // Visit the decorators and arguments, but avoid the body, which will be // deferred. for decorator in decorator_list { @@ -523,8 +525,7 @@ where } let definition = docstrings::extraction::extract_definition( - ExtractionTarget::Function, - stmt, + ExtractionTarget::Function(function_def), self.semantic.definition_id, &self.semantic.definitions, ); @@ -566,8 +567,7 @@ where } let definition = docstrings::extraction::extract_definition( - ExtractionTarget::Class, - stmt, + ExtractionTarget::Class(class_def), self.semantic.definition_id, &self.semantic.definitions, ); diff --git a/crates/ruff/src/docstrings/extraction.rs b/crates/ruff/src/docstrings/extraction.rs index 84cdba07e2..c642b75271 100644 --- a/crates/ruff/src/docstrings/extraction.rs +++ b/crates/ruff/src/docstrings/extraction.rs @@ -1,7 +1,6 @@ //! Extract docstrings from an AST. use ruff_python_ast::{self as ast, Constant, Expr, Stmt}; - use ruff_python_semantic::{Definition, DefinitionId, Definitions, Member, MemberKind}; /// Extract a docstring from a function or class body. @@ -28,62 +27,48 @@ pub(crate) fn docstring_from(suite: &[Stmt]) -> Option<&Expr> { pub(crate) fn extract_docstring<'a>(definition: &'a Definition<'a>) -> Option<&'a Expr> { match definition { Definition::Module(module) => docstring_from(module.python_ast), - Definition::Member(member) => { - if let Stmt::ClassDef(ast::StmtClassDef { body, .. }) - | Stmt::FunctionDef(ast::StmtFunctionDef { body, .. }) = &member.stmt - { - docstring_from(body) - } else { - None - } - } + Definition::Member(member) => docstring_from(member.body()), } } #[derive(Copy, Clone)] -pub(crate) enum ExtractionTarget { - Class, - Function, +pub(crate) enum ExtractionTarget<'a> { + Class(&'a ast::StmtClassDef), + Function(&'a ast::StmtFunctionDef), } /// Extract a `Definition` from the AST node defined by a `Stmt`. pub(crate) fn extract_definition<'a>( - target: ExtractionTarget, - stmt: &'a Stmt, + target: ExtractionTarget<'a>, parent: DefinitionId, definitions: &Definitions<'a>, ) -> Member<'a> { match target { - ExtractionTarget::Function => match &definitions[parent] { + ExtractionTarget::Function(function) => match &definitions[parent] { Definition::Module(..) => Member { parent, - kind: MemberKind::Function, - stmt, + kind: MemberKind::Function(function), }, Definition::Member(Member { - kind: MemberKind::Class | MemberKind::NestedClass, + kind: MemberKind::Class(_) | MemberKind::NestedClass(_), .. }) => Member { parent, - kind: MemberKind::Method, - stmt, + kind: MemberKind::Method(function), }, - Definition::Member(..) => Member { + Definition::Member(_) => Member { parent, - kind: MemberKind::NestedFunction, - stmt, + kind: MemberKind::NestedFunction(function), }, }, - ExtractionTarget::Class => match &definitions[parent] { - Definition::Module(..) => Member { + ExtractionTarget::Class(class) => match &definitions[parent] { + Definition::Module(_) => Member { parent, - kind: MemberKind::Class, - stmt, + kind: MemberKind::Class(class), }, - Definition::Member(..) => Member { + Definition::Member(_) => Member { parent, - kind: MemberKind::NestedClass, - stmt, + kind: MemberKind::NestedClass(class), }, }, } diff --git a/crates/ruff/src/rules/flake8_annotations/fixes.rs b/crates/ruff/src/rules/flake8_annotations/fixes.rs index 82074eb89a..1608732475 100644 --- a/crates/ruff/src/rules/flake8_annotations/fixes.rs +++ b/crates/ruff/src/rules/flake8_annotations/fixes.rs @@ -1,25 +1,25 @@ use anyhow::{bail, Result}; -use ruff_python_ast::{PySourceType, Ranged, Stmt}; +use ruff_python_ast::{PySourceType, Ranged}; use ruff_python_parser::{lexer, AsMode, Tok}; use ruff_diagnostics::Edit; use ruff_source_file::Locator; /// ANN204 -pub(crate) fn add_return_annotation( - locator: &Locator, - stmt: &Stmt, +pub(crate) fn add_return_annotation( + statement: &T, annotation: &str, source_type: PySourceType, + locator: &Locator, ) -> Result { - let contents = &locator.contents()[stmt.range()]; + let contents = &locator.contents()[statement.range()]; // Find the colon (following the `def` keyword). let mut seen_lpar = false; let mut seen_rpar = false; let mut count = 0u32; for (tok, range) in - lexer::lex_starts_at(contents, source_type.as_mode(), stmt.start()).flatten() + lexer::lex_starts_at(contents, source_type.as_mode(), statement.start()).flatten() { if seen_lpar && seen_rpar { if matches!(tok, Tok::Colon) { diff --git a/crates/ruff/src/rules/flake8_annotations/helpers.rs b/crates/ruff/src/rules/flake8_annotations/helpers.rs index 04ecc41290..42d1373564 100644 --- a/crates/ruff/src/rules/flake8_annotations/helpers.rs +++ b/crates/ruff/src/rules/flake8_annotations/helpers.rs @@ -1,45 +1,11 @@ -use ruff_python_ast::{self as ast, Expr, Parameters, Stmt}; - -use ruff_python_ast::cast; use ruff_python_semantic::analyze::visibility; -use ruff_python_semantic::{Definition, Member, MemberKind, SemanticModel}; - -pub(super) fn match_function_def( - stmt: &Stmt, -) -> (&str, &Parameters, Option<&Expr>, &[Stmt], &[ast::Decorator]) { - match stmt { - Stmt::FunctionDef(ast::StmtFunctionDef { - name, - parameters, - returns, - body, - decorator_list, - .. - }) => ( - name, - parameters, - returns.as_ref().map(AsRef::as_ref), - body, - decorator_list, - ), - _ => panic!("Found non-FunctionDef in match_function_def"), - } -} +use ruff_python_semantic::{Definition, SemanticModel}; /// Return the name of the function, if it's overloaded. pub(crate) fn overloaded_name(definition: &Definition, semantic: &SemanticModel) -> Option { - if let Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - stmt, - .. - }) = definition - { - if visibility::is_overload(cast::decorator_list(stmt), semantic) { - let (name, ..) = match_function_def(stmt); - Some(name.to_string()) - } else { - None - } + let function = definition.as_function_def()?; + if visibility::is_overload(&function.decorator_list, semantic) { + Some(function.name.to_string()) } else { None } @@ -52,19 +18,12 @@ pub(crate) fn is_overload_impl( overloaded_name: &str, semantic: &SemanticModel, ) -> bool { - if let Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - stmt, - .. - }) = definition - { - if visibility::is_overload(cast::decorator_list(stmt), semantic) { - false - } else { - let (name, ..) = match_function_def(stmt); - name == overloaded_name - } - } else { + let Some(function) = definition.as_function_def() else { + return false; + }; + if visibility::is_overload(&function.decorator_list, semantic) { false + } else { + function.name.as_str() == overloaded_name } } diff --git a/crates/ruff/src/rules/flake8_annotations/rules/definition.rs b/crates/ruff/src/rules/flake8_annotations/rules/definition.rs index 01895a874d..ae750a3f23 100644 --- a/crates/ruff/src/rules/flake8_annotations/rules/definition.rs +++ b/crates/ruff/src/rules/flake8_annotations/rules/definition.rs @@ -1,23 +1,19 @@ -use ruff_python_ast::{self as ast, Constant, Expr, ParameterWithDefault, Ranged, Stmt}; - use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::cast; use ruff_python_ast::helpers::ReturnStatementVisitor; use ruff_python_ast::identifier::Identifier; use ruff_python_ast::statement_visitor::StatementVisitor; +use ruff_python_ast::{self as ast, Constant, Expr, ParameterWithDefault, Ranged, Stmt}; use ruff_python_parser::typing::parse_type_annotation; use ruff_python_semantic::analyze::visibility; -use ruff_python_semantic::{Definition, Member, MemberKind}; +use ruff_python_semantic::Definition; use ruff_python_stdlib::typing::simple_magic_return_type; use crate::checkers::ast::Checker; use crate::registry::{AsRule, Rule}; +use crate::rules::flake8_annotations::fixes; use crate::rules::ruff::typing::type_hint_resolves_to_any; -use super::super::fixes; -use super::super::helpers::match_function_def; - /// ## What it does /// Checks that function arguments have type annotations. /// @@ -498,20 +494,23 @@ pub(crate) fn definition( definition: &Definition, visibility: visibility::Visibility, ) -> Vec { - // TODO(charlie): Consider using the AST directly here rather than `Definition`. - // We could adhere more closely to `flake8-annotations` by defining public - // vs. secret vs. protected. - let Definition::Member(Member { kind, stmt, .. }) = definition else { + let Some(function) = definition.as_function_def() else { return vec![]; }; - let is_method = match kind { - MemberKind::Method => true, - MemberKind::Function | MemberKind::NestedFunction => false, - _ => return vec![], - }; + let ast::StmtFunctionDef { + range: _, + is_async: _, + decorator_list, + name, + type_params: _, + parameters, + returns, + body, + } = function; + + let is_method = definition.is_method(); - let (name, arguments, returns, body, decorator_list) = match_function_def(stmt); // Keep track of whether we've seen any typed arguments or return values. let mut has_any_typed_arg = false; // Any argument has been typed? let mut has_typed_return = false; // Return value has been typed? @@ -528,20 +527,19 @@ pub(crate) fn definition( parameter, default: _, range: _, - } in arguments + } in parameters .posonlyargs .iter() - .chain(&arguments.args) - .chain(&arguments.kwonlyargs) + .chain(¶meters.args) + .chain(¶meters.kwonlyargs) .skip( // If this is a non-static method, skip `cls` or `self`. usize::from( - is_method - && !visibility::is_staticmethod(cast::decorator_list(stmt), checker.semantic()), + is_method && !visibility::is_staticmethod(decorator_list, checker.semantic()), ), ) { - // ANN401 for dynamically typed arguments + // ANN401 for dynamically typed parameters if let Some(annotation) = ¶meter.annotation { has_any_typed_arg = true; if checker.enabled(Rule::AnyType) && !is_overridden { @@ -572,7 +570,7 @@ pub(crate) fn definition( } // ANN002, ANN401 - if let Some(arg) = &arguments.vararg { + if let Some(arg) = ¶meters.vararg { if let Some(expr) = &arg.annotation { has_any_typed_arg = true; if !checker.settings.flake8_annotations.allow_star_arg_any { @@ -598,7 +596,7 @@ pub(crate) fn definition( } // ANN003, ANN401 - if let Some(arg) = &arguments.kwarg { + if let Some(arg) = ¶meters.kwarg { if let Some(expr) = &arg.annotation { has_any_typed_arg = true; if !checker.settings.flake8_annotations.allow_star_arg_any { @@ -629,18 +627,18 @@ pub(crate) fn definition( } // ANN101, ANN102 - if is_method && !visibility::is_staticmethod(cast::decorator_list(stmt), checker.semantic()) { + if is_method && !visibility::is_staticmethod(decorator_list, checker.semantic()) { if let Some(ParameterWithDefault { parameter, default: _, range: _, - }) = arguments + }) = parameters .posonlyargs .first() - .or_else(|| arguments.args.first()) + .or_else(|| parameters.args.first()) { if parameter.annotation.is_none() { - if visibility::is_classmethod(cast::decorator_list(stmt), checker.semantic()) { + if visibility::is_classmethod(decorator_list, checker.semantic()) { if checker.enabled(Rule::MissingTypeCls) { diagnostics.push(Diagnostic::new( MissingTypeCls { @@ -676,24 +674,22 @@ pub(crate) fn definition( // (explicitly or implicitly). checker.settings.flake8_annotations.suppress_none_returning && is_none_returning(body) ) { - if is_method && visibility::is_classmethod(cast::decorator_list(stmt), checker.semantic()) { + if is_method && visibility::is_classmethod(decorator_list, checker.semantic()) { if checker.enabled(Rule::MissingReturnTypeClassMethod) { diagnostics.push(Diagnostic::new( MissingReturnTypeClassMethod { name: name.to_string(), }, - stmt.identifier(), + function.identifier(), )); } - } else if is_method - && visibility::is_staticmethod(cast::decorator_list(stmt), checker.semantic()) - { + } else if is_method && visibility::is_staticmethod(decorator_list, checker.semantic()) { if checker.enabled(Rule::MissingReturnTypeStaticMethod) { diagnostics.push(Diagnostic::new( MissingReturnTypeStaticMethod { name: name.to_string(), }, - stmt.identifier(), + function.identifier(), )); } } else if is_method && visibility::is_init(name) { @@ -705,15 +701,15 @@ pub(crate) fn definition( MissingReturnTypeSpecialMethod { name: name.to_string(), }, - stmt.identifier(), + function.identifier(), ); if checker.patch(diagnostic.kind.rule()) { diagnostic.try_set_fix(|| { fixes::add_return_annotation( - checker.locator(), - stmt, + function, "None", checker.source_type, + checker.locator(), ) .map(Fix::suggested) }); @@ -727,16 +723,16 @@ pub(crate) fn definition( MissingReturnTypeSpecialMethod { name: name.to_string(), }, - stmt.identifier(), + function.identifier(), ); if checker.patch(diagnostic.kind.rule()) { if let Some(return_type) = simple_magic_return_type(name) { diagnostic.try_set_fix(|| { fixes::add_return_annotation( - checker.locator(), - stmt, + function, return_type, checker.source_type, + checker.locator(), ) .map(Fix::suggested) }); @@ -752,7 +748,7 @@ pub(crate) fn definition( MissingReturnTypeUndocumentedPublicFunction { name: name.to_string(), }, - stmt.identifier(), + function.identifier(), )); } } @@ -762,7 +758,7 @@ pub(crate) fn definition( MissingReturnTypePrivateFunction { name: name.to_string(), }, - stmt.identifier(), + function.identifier(), )); } } diff --git a/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs b/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs index 1be0eec92f..a183b409b4 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs @@ -1,9 +1,9 @@ -use ruff_python_ast as ast; -use ruff_python_ast::{Ranged, Stmt}; +use ruff_python_ast::Ranged; use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::Expr; +use ruff_python_ast::helpers::map_subscript; + use ruff_python_semantic::{Definition, Member, MemberKind}; use crate::checkers::ast::Checker; @@ -67,39 +67,29 @@ impl Violation for IterMethodReturnIterable { /// PYI045 pub(crate) fn iter_method_return_iterable(checker: &mut Checker, definition: &Definition) { let Definition::Member(Member { - kind: MemberKind::Method, - stmt, + kind: MemberKind::Method(function), .. }) = definition else { return; }; - let Stmt::FunctionDef(ast::StmtFunctionDef { name, returns, .. }) = stmt else { + let Some(returns) = function.returns.as_ref() else { return; }; - let Some(returns) = returns else { - return; - }; - - let annotation = if let Expr::Subscript(ast::ExprSubscript { value, .. }) = returns.as_ref() { - // Ex) `Iterable[T]` - value - } else { - // Ex) `Iterable`, `typing.Iterable` - returns - }; - - let is_async = match name.as_str() { + let is_async = match function.name.as_str() { "__iter__" => false, "__aiter__" => true, _ => return, }; + // Support both `Iterable` and `Iterable[T]`. + let annotation = map_subscript(returns); + if checker .semantic() - .resolve_call_path(annotation) + .resolve_call_path(map_subscript(annotation)) .is_some_and(|call_path| { if is_async { matches!( diff --git a/crates/ruff/src/rules/pydocstyle/helpers.rs b/crates/ruff/src/rules/pydocstyle/helpers.rs index 17aab82f78..9c21fa40ab 100644 --- a/crates/ruff/src/rules/pydocstyle/helpers.rs +++ b/crates/ruff/src/rules/pydocstyle/helpers.rs @@ -1,10 +1,9 @@ use std::collections::BTreeSet; use ruff_python_ast::call_path::from_qualified_name; -use ruff_python_ast::cast; use ruff_python_ast::helpers::map_callable; use ruff_python_ast::str::is_implicit_concatenation; -use ruff_python_semantic::{Definition, Member, MemberKind, SemanticModel}; +use ruff_python_semantic::{Definition, SemanticModel}; use ruff_source_file::UniversalNewlines; /// Return the index of the first logical line in a string. @@ -48,25 +47,19 @@ pub(crate) fn should_ignore_definition( return false; } - if let Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - stmt, - .. - }) = definition - { - for decorator in cast::decorator_list(stmt) { - if let Some(call_path) = semantic.resolve_call_path(map_callable(&decorator.expression)) - { - if ignore_decorators + let Some(function) = definition.as_function_def() else { + return false; + }; + + function.decorator_list.iter().any(|decorator| { + semantic + .resolve_call_path(map_callable(&decorator.expression)) + .is_some_and(|call_path| { + ignore_decorators .iter() .any(|decorator| from_qualified_name(decorator) == call_path) - { - return true; - } - } - } - } - false + }) + }) } /// Check if a docstring should be ignored. diff --git a/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_class.rs b/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_class.rs index 556f1624bc..3b97c4f80c 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_class.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_class.rs @@ -1,11 +1,9 @@ -use ruff_python_ast::Ranged; -use ruff_text_size::{TextLen, TextRange}; - use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::{Definition, Member, MemberKind}; +use ruff_python_ast::Ranged; use ruff_python_trivia::PythonWhitespace; use ruff_source_file::{UniversalNewlineIterator, UniversalNewlines}; +use ruff_text_size::{TextLen, TextRange}; use crate::checkers::ast::Checker; use crate::docstrings::Docstring; @@ -155,12 +153,7 @@ impl AlwaysAutofixableViolation for BlankLineBeforeClass { /// D203, D204, D211 pub(crate) fn blank_before_after_class(checker: &mut Checker, docstring: &Docstring) { - let Definition::Member(Member { - kind: MemberKind::Class | MemberKind::NestedClass, - stmt, - .. - }) = docstring.definition - else { + let Some(class) = docstring.definition.as_class_def() else { return; }; @@ -168,7 +161,7 @@ pub(crate) fn blank_before_after_class(checker: &mut Checker, docstring: &Docstr // ```python // class PhotoMetadata: """Metadata about a photo.""" // ``` - let between_range = TextRange::new(stmt.start(), docstring.start()); + let between_range = TextRange::new(class.start(), docstring.start()); if !checker.locator().contains_line_break(between_range) { return; } @@ -223,7 +216,7 @@ pub(crate) fn blank_before_after_class(checker: &mut Checker, docstring: &Docstr } if checker.enabled(Rule::OneBlankLineAfterClass) { - let after_range = TextRange::new(docstring.end(), stmt.end()); + let after_range = TextRange::new(docstring.end(), class.end()); let after = checker.locator().slice(after_range); diff --git a/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_function.rs b/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_function.rs index 6d32259bc5..8ae76d0538 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_function.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/blank_before_after_function.rs @@ -1,13 +1,12 @@ use once_cell::sync::Lazy; use regex::Regex; -use ruff_python_ast::Ranged; -use ruff_text_size::{TextLen, TextRange}; use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::{Definition, Member, MemberKind}; +use ruff_python_ast::Ranged; use ruff_python_trivia::PythonWhitespace; use ruff_source_file::{UniversalNewlineIterator, UniversalNewlines}; +use ruff_text_size::{TextLen, TextRange}; use crate::checkers::ast::Checker; use crate::docstrings::Docstring; @@ -104,21 +103,16 @@ static INNER_FUNCTION_OR_CLASS_REGEX: Lazy = /// D201, D202 pub(crate) fn blank_before_after_function(checker: &mut Checker, docstring: &Docstring) { - let Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - stmt, - .. - }) = docstring.definition - else { + let Some(function) = docstring.definition.as_function_def() else { return; }; if checker.enabled(Rule::NoBlankLineBeforeFunction) { let before = checker .locator() - .slice(TextRange::new(stmt.start(), docstring.start())); + .slice(TextRange::new(function.start(), docstring.start())); - let mut lines = UniversalNewlineIterator::with_offset(before, stmt.start()).rev(); + let mut lines = UniversalNewlineIterator::with_offset(before, function.start()).rev(); let mut blank_lines_before = 0usize; let mut blank_lines_start = lines.next().map(|l| l.end()).unwrap_or_default(); @@ -152,7 +146,7 @@ pub(crate) fn blank_before_after_function(checker: &mut Checker, docstring: &Doc if checker.enabled(Rule::NoBlankLineAfterFunction) { let after = checker .locator() - .slice(TextRange::new(docstring.end(), stmt.end())); + .slice(TextRange::new(docstring.end(), function.end())); // If the docstring is only followed by blank and commented lines, abort. let all_blank_after = after.universal_newlines().skip(1).all(|line| { diff --git a/crates/ruff/src/rules/pydocstyle/rules/capitalized.rs b/crates/ruff/src/rules/pydocstyle/rules/capitalized.rs index 918a5d2c32..f329672405 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/capitalized.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/capitalized.rs @@ -1,9 +1,7 @@ -use ruff_python_ast::Ranged; -use ruff_text_size::{TextLen, TextRange}; - use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::{Definition, Member, MemberKind}; +use ruff_python_ast::Ranged; +use ruff_text_size::{TextLen, TextRange}; use crate::checkers::ast::Checker; use crate::docstrings::Docstring; @@ -57,13 +55,7 @@ impl AlwaysAutofixableViolation for FirstLineCapitalized { /// D403 pub(crate) fn capitalized(checker: &mut Checker, docstring: &Docstring) { - if !matches!( - docstring.definition, - Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - .. - }) - ) { + if docstring.definition.as_function_def().is_none() { return; } diff --git a/crates/ruff/src/rules/pydocstyle/rules/if_needed.rs b/crates/ruff/src/rules/pydocstyle/rules/if_needed.rs index ee9e2364ea..e4880a609d 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/if_needed.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/if_needed.rs @@ -1,9 +1,7 @@ use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::cast; use ruff_python_ast::identifier::Identifier; use ruff_python_semantic::analyze::visibility::is_overload; -use ruff_python_semantic::{Definition, Member, MemberKind}; use crate::checkers::ast::Checker; use crate::docstrings::Docstring; @@ -80,18 +78,13 @@ impl Violation for OverloadWithDocstring { /// D418 pub(crate) fn if_needed(checker: &mut Checker, docstring: &Docstring) { - let Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - stmt, - .. - }) = docstring.definition - else { + let Some(function) = docstring.definition.as_function_def() else { return; }; - if !is_overload(cast::decorator_list(stmt), checker.semantic()) { - return; + if is_overload(&function.decorator_list, checker.semantic()) { + checker.diagnostics.push(Diagnostic::new( + OverloadWithDocstring, + function.identifier(), + )); } - checker - .diagnostics - .push(Diagnostic::new(OverloadWithDocstring, stmt.identifier())); } diff --git a/crates/ruff/src/rules/pydocstyle/rules/multi_line_summary_start.rs b/crates/ruff/src/rules/pydocstyle/rules/multi_line_summary_start.rs index 46d3f6eed3..1d58abeb56 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/multi_line_summary_start.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/multi_line_summary_start.rs @@ -4,7 +4,7 @@ use ruff_text_size::{TextRange, TextSize}; use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::str::{is_triple_quote, leading_quote}; -use ruff_python_semantic::{Definition, Member}; +use ruff_python_semantic::Definition; use ruff_source_file::{NewlineWithTrailingNewline, UniversalNewlineIterator}; use crate::checkers::ast::Checker; @@ -164,11 +164,11 @@ pub(crate) fn multi_line_summary_start(checker: &mut Checker, docstring: &Docstr // If the docstring isn't on its own line, look at the statement indentation, // and add the default indentation to get the "right" level. - if let Definition::Member(Member { stmt, .. }) = &docstring.definition { - let stmt_line_start = checker.locator().line_start(stmt.start()); + if let Definition::Member(member) = &docstring.definition { + let stmt_line_start = checker.locator().line_start(member.start()); let stmt_indentation = checker .locator() - .slice(TextRange::new(stmt_line_start, stmt.start())); + .slice(TextRange::new(stmt_line_start, member.start())); if stmt_indentation.chars().all(char::is_whitespace) { indentation.clear(); diff --git a/crates/ruff/src/rules/pydocstyle/rules/no_signature.rs b/crates/ruff/src/rules/pydocstyle/rules/no_signature.rs index 34ae382a3c..e5a5a9d167 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/no_signature.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/no_signature.rs @@ -1,8 +1,5 @@ -use ruff_python_ast::{self as ast, Stmt}; - use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::{Definition, Member, MemberKind}; use ruff_source_file::UniversalNewlines; use crate::checkers::ast::Checker; @@ -54,15 +51,7 @@ impl Violation for NoSignature { /// D402 pub(crate) fn no_signature(checker: &mut Checker, docstring: &Docstring) { - let Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - stmt, - .. - }) = docstring.definition - else { - return; - }; - let Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) = stmt else { + let Some(function) = docstring.definition.as_function_def() else { return; }; @@ -75,8 +64,8 @@ pub(crate) fn no_signature(checker: &mut Checker, docstring: &Docstring) { // Search for occurrences of the function name followed by an open parenthesis (e.g., `foo(` for // a function named `foo`). if first_line - .match_indices(name.as_str()) - .any(|(index, _)| first_line[index + name.len()..].starts_with('(')) + .match_indices(function.name.as_str()) + .any(|(index, _)| first_line[index + function.name.len()..].starts_with('(')) { checker .diagnostics diff --git a/crates/ruff/src/rules/pydocstyle/rules/non_imperative_mood.rs b/crates/ruff/src/rules/pydocstyle/rules/non_imperative_mood.rs index 39d72e7dba..2f2c0b02d1 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/non_imperative_mood.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/non_imperative_mood.rs @@ -6,9 +6,7 @@ use once_cell::sync::Lazy; use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::call_path::{from_qualified_name, CallPath}; -use ruff_python_ast::cast; use ruff_python_semantic::analyze::visibility::{is_property, is_test}; -use ruff_python_semantic::{Definition, Member, MemberKind}; use ruff_source_file::UniversalNewlines; use crate::checkers::ast::Checker; @@ -69,25 +67,18 @@ pub(crate) fn non_imperative_mood( docstring: &Docstring, property_decorators: &BTreeSet, ) { - let Definition::Member(Member { kind, stmt, .. }) = &docstring.definition else { + let Some(function) = docstring.definition.as_function_def() else { return; }; - if !matches!( - kind, - MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - ) { - return; - } - let property_decorators = property_decorators .iter() .map(|decorator| from_qualified_name(decorator)) .collect::>(); - if is_test(cast::name(stmt)) + if is_test(&function.name) || is_property( - cast::decorator_list(stmt), + &function.decorator_list, &property_decorators, checker.semantic(), ) diff --git a/crates/ruff/src/rules/pydocstyle/rules/not_missing.rs b/crates/ruff/src/rules/pydocstyle/rules/not_missing.rs index 00ec74d836..9288f3ff37 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/not_missing.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/not_missing.rs @@ -1,13 +1,11 @@ -use ruff_text_size::TextRange; - use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::cast; use ruff_python_ast::identifier::Identifier; use ruff_python_semantic::analyze::visibility::{ is_call, is_init, is_magic, is_new, is_overload, is_override, Visibility, }; use ruff_python_semantic::{Definition, Member, MemberKind, Module, ModuleKind}; +use ruff_text_size::TextRange; use crate::checkers::ast::Checker; use crate::registry::Rule; @@ -557,82 +555,82 @@ pub(crate) fn not_missing( false } Definition::Member(Member { - kind: MemberKind::Class, - stmt, + kind: MemberKind::Class(class), .. }) => { if checker.enabled(Rule::UndocumentedPublicClass) { checker .diagnostics - .push(Diagnostic::new(UndocumentedPublicClass, stmt.identifier())); + .push(Diagnostic::new(UndocumentedPublicClass, class.identifier())); } false } Definition::Member(Member { - kind: MemberKind::NestedClass, - stmt, + kind: MemberKind::NestedClass(function), .. }) => { if checker.enabled(Rule::UndocumentedPublicNestedClass) { checker.diagnostics.push(Diagnostic::new( UndocumentedPublicNestedClass, - stmt.identifier(), + function.identifier(), )); } false } Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction, - stmt, + kind: MemberKind::Function(function) | MemberKind::NestedFunction(function), .. }) => { - if is_overload(cast::decorator_list(stmt), checker.semantic()) { + if is_overload(&function.decorator_list, checker.semantic()) { true } else { if checker.enabled(Rule::UndocumentedPublicFunction) { checker.diagnostics.push(Diagnostic::new( UndocumentedPublicFunction, - stmt.identifier(), + function.identifier(), )); } false } } Definition::Member(Member { - kind: MemberKind::Method, - stmt, + kind: MemberKind::Method(function), .. }) => { - if is_overload(cast::decorator_list(stmt), checker.semantic()) - || is_override(cast::decorator_list(stmt), checker.semantic()) + if is_overload(&function.decorator_list, checker.semantic()) + || is_override(&function.decorator_list, checker.semantic()) { true - } else if is_init(cast::name(stmt)) { + } else if is_init(&function.name) { if checker.enabled(Rule::UndocumentedPublicInit) { - checker - .diagnostics - .push(Diagnostic::new(UndocumentedPublicInit, stmt.identifier())); + checker.diagnostics.push(Diagnostic::new( + UndocumentedPublicInit, + function.identifier(), + )); } true - } else if is_new(cast::name(stmt)) || is_call(cast::name(stmt)) { + } else if is_new(&function.name) || is_call(&function.name) { if checker.enabled(Rule::UndocumentedPublicMethod) { - checker - .diagnostics - .push(Diagnostic::new(UndocumentedPublicMethod, stmt.identifier())); + checker.diagnostics.push(Diagnostic::new( + UndocumentedPublicMethod, + function.identifier(), + )); } true - } else if is_magic(cast::name(stmt)) { + } else if is_magic(&function.name) { if checker.enabled(Rule::UndocumentedMagicMethod) { - checker - .diagnostics - .push(Diagnostic::new(UndocumentedMagicMethod, stmt.identifier())); + checker.diagnostics.push(Diagnostic::new( + UndocumentedMagicMethod, + function.identifier(), + )); } true } else { if checker.enabled(Rule::UndocumentedPublicMethod) { - checker - .diagnostics - .push(Diagnostic::new(UndocumentedPublicMethod, stmt.identifier())); + checker.diagnostics.push(Diagnostic::new( + UndocumentedPublicMethod, + function.identifier(), + )); } true } diff --git a/crates/ruff/src/rules/pydocstyle/rules/sections.rs b/crates/ruff/src/rules/pydocstyle/rules/sections.rs index 38f49dbdfe..da87a98256 100644 --- a/crates/ruff/src/rules/pydocstyle/rules/sections.rs +++ b/crates/ruff/src/rules/pydocstyle/rules/sections.rs @@ -1,20 +1,18 @@ use itertools::Itertools; use once_cell::sync::Lazy; use regex::Regex; -use ruff_python_ast::{self as ast, ParameterWithDefault, Stmt}; -use ruff_text_size::{TextLen, TextRange, TextSize}; use rustc_hash::FxHashSet; use ruff_diagnostics::{AlwaysAutofixableViolation, Violation}; use ruff_diagnostics::{Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::cast; use ruff_python_ast::docstrings::{clean_space, leading_space}; use ruff_python_ast::identifier::Identifier; +use ruff_python_ast::ParameterWithDefault; use ruff_python_semantic::analyze::visibility::is_staticmethod; -use ruff_python_semantic::{Definition, Member, MemberKind}; use ruff_python_trivia::{textwrap::dedent, PythonWhitespace}; use ruff_source_file::NewlineWithTrailingNewline; +use ruff_text_size::{TextLen, TextRange, TextSize}; use crate::checkers::ast::Checker; use crate::docstrings::sections::{SectionContext, SectionContexts, SectionKind}; @@ -1717,16 +1715,7 @@ fn common_section( } fn missing_args(checker: &mut Checker, docstring: &Docstring, docstrings_args: &FxHashSet) { - let Definition::Member(Member { - kind: MemberKind::Function | MemberKind::NestedFunction | MemberKind::Method, - stmt, - .. - }) = docstring.definition - else { - return; - }; - - let Stmt::FunctionDef(ast::StmtFunctionDef { parameters, .. }) = stmt else { + let Some(function) = docstring.definition.as_function_def() else { return; }; @@ -1736,16 +1725,17 @@ fn missing_args(checker: &mut Checker, docstring: &Docstring, docstrings_args: & parameter, default: _, range: _, - } in parameters + } in function + .parameters .posonlyargs .iter() - .chain(¶meters.args) - .chain(¶meters.kwonlyargs) + .chain(&function.parameters.args) + .chain(&function.parameters.kwonlyargs) .skip( // If this is a non-static method, skip `cls` or `self`. usize::from( docstring.definition.is_method() - && !is_staticmethod(cast::decorator_list(stmt), checker.semantic()), + && !is_staticmethod(&function.decorator_list, checker.semantic()), ), ) { @@ -1757,7 +1747,7 @@ fn missing_args(checker: &mut Checker, docstring: &Docstring, docstrings_args: & // Check specifically for `vararg` and `kwarg`, which can be prefixed with a // single or double star, respectively. - if let Some(arg) = ¶meters.vararg { + if let Some(arg) = function.parameters.vararg.as_ref() { let arg_name = arg.name.as_str(); let starred_arg_name = format!("*{arg_name}"); if !arg_name.starts_with('_') @@ -1767,7 +1757,7 @@ fn missing_args(checker: &mut Checker, docstring: &Docstring, docstrings_args: & missing_arg_names.insert(starred_arg_name); } } - if let Some(arg) = ¶meters.kwarg { + if let Some(arg) = function.parameters.kwarg.as_ref() { let arg_name = arg.name.as_str(); let starred_arg_name = format!("**{arg_name}"); if !arg_name.starts_with('_') @@ -1786,7 +1776,7 @@ fn missing_args(checker: &mut Checker, docstring: &Docstring, docstrings_args: & definition: definition.to_string(), names, }, - stmt.identifier(), + function.identifier(), )); } } diff --git a/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs b/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs index 355610adc2..1aed996b7e 100644 --- a/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs +++ b/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs @@ -62,7 +62,7 @@ pub(crate) fn yield_outside_function(checker: &mut Checker, expr: &Expr) { Expr::Yield(_) => DeferralKeyword::Yield, Expr::YieldFrom(_) => DeferralKeyword::YieldFrom, Expr::Await(_) => DeferralKeyword::Await, - _ => panic!("Expected Expr::Yield | Expr::YieldFrom | Expr::Await"), + _ => return, }; checker.diagnostics.push(Diagnostic::new( YieldOutsideFunction { keyword }, diff --git a/crates/ruff_python_ast/src/cast.rs b/crates/ruff_python_ast/src/cast.rs deleted file mode 100644 index 6246442ed7..0000000000 --- a/crates/ruff_python_ast/src/cast.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::{nodes, Decorator, Stmt}; - -pub fn name(stmt: &Stmt) -> &str { - let Stmt::FunctionDef(nodes::StmtFunctionDef { name, .. }) = stmt else { - panic!("Expected Stmt::FunctionDef") - }; - name.as_str() -} - -pub fn decorator_list(stmt: &Stmt) -> &[Decorator] { - let Stmt::FunctionDef(nodes::StmtFunctionDef { decorator_list, .. }) = stmt else { - panic!("Expected Stmt::FunctionDef") - }; - decorator_list -} diff --git a/crates/ruff_python_ast/src/identifier.rs b/crates/ruff_python_ast/src/identifier.rs index 38a014ef14..2ff690ebc8 100644 --- a/crates/ruff_python_ast/src/identifier.rs +++ b/crates/ruff_python_ast/src/identifier.rs @@ -20,6 +20,32 @@ pub trait Identifier { fn identifier(&self) -> TextRange; } +impl Identifier for ast::StmtFunctionDef { + /// Return the [`TextRange`] of the identifier in the given function definition. + /// + /// For example, return the range of `f` in: + /// ```python + /// def f(): + /// ... + /// ``` + fn identifier(&self) -> TextRange { + self.name.range() + } +} + +impl Identifier for ast::StmtClassDef { + /// Return the [`TextRange`] of the identifier in the given class definition. + /// + /// For example, return the range of `C` in: + /// ```python + /// class C(): + /// ... + /// ``` + fn identifier(&self) -> TextRange { + self.name.range() + } +} + impl Identifier for Stmt { /// Return the [`TextRange`] of the identifier in the given statement. /// @@ -30,8 +56,8 @@ impl Identifier for Stmt { /// ``` fn identifier(&self) -> TextRange { match self { - Stmt::ClassDef(ast::StmtClassDef { name, .. }) - | Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) => name.range(), + Stmt::ClassDef(class) => class.identifier(), + Stmt::FunctionDef(function) => function.identifier(), _ => self.range(), } } diff --git a/crates/ruff_python_ast/src/lib.rs b/crates/ruff_python_ast/src/lib.rs index 25ebbc0329..3fb4c5f170 100644 --- a/crates/ruff_python_ast/src/lib.rs +++ b/crates/ruff_python_ast/src/lib.rs @@ -3,7 +3,6 @@ use std::path::Path; pub mod all; pub mod call_path; -pub mod cast; pub mod comparable; pub mod docstrings; pub mod hashable; diff --git a/crates/ruff_python_semantic/src/analyze/visibility.rs b/crates/ruff_python_semantic/src/analyze/visibility.rs index 846e41fa67..28dae7c0c6 100644 --- a/crates/ruff_python_semantic/src/analyze/visibility.rs +++ b/crates/ruff_python_semantic/src/analyze/visibility.rs @@ -1,6 +1,6 @@ use std::path::Path; -use ruff_python_ast::{self as ast, Decorator, Stmt}; +use ruff_python_ast::{self as ast, Decorator}; use ruff_python_ast::call_path::{collect_call_path, CallPath}; use ruff_python_ast::helpers::map_callable; @@ -176,57 +176,40 @@ impl ModuleSource<'_> { } } -pub(crate) fn function_visibility(stmt: &Stmt) -> Visibility { - match stmt { - Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) => { - if name.starts_with('_') { - Visibility::Private - } else { - Visibility::Public - } - } - _ => panic!("Found non-FunctionDef in function_visibility"), +pub(crate) fn function_visibility(function: &ast::StmtFunctionDef) -> Visibility { + if function.name.starts_with('_') { + Visibility::Private + } else { + Visibility::Public } } -pub(crate) fn method_visibility(stmt: &Stmt) -> Visibility { - let Stmt::FunctionDef(ast::StmtFunctionDef { - name, - decorator_list, - .. - }) = stmt - else { - panic!("Found non-FunctionDef in method_visibility") - }; - +pub(crate) fn method_visibility(function: &ast::StmtFunctionDef) -> Visibility { // Is this a setter or deleter? - if decorator_list.iter().any(|decorator| { + if function.decorator_list.iter().any(|decorator| { collect_call_path(&decorator.expression).is_some_and(|call_path| { - call_path.as_slice() == [name, "setter"] || call_path.as_slice() == [name, "deleter"] + call_path.as_slice() == [function.name.as_str(), "setter"] + || call_path.as_slice() == [function.name.as_str(), "deleter"] }) }) { return Visibility::Private; } // Is the method non-private? - if !name.starts_with('_') { + if !function.name.starts_with('_') { return Visibility::Public; } // Is this a magic method? - if name.starts_with("__") && name.ends_with("__") { + if function.name.starts_with("__") && function.name.ends_with("__") { return Visibility::Public; } Visibility::Private } -pub(crate) fn class_visibility(stmt: &Stmt) -> Visibility { - let Stmt::ClassDef(ast::StmtClassDef { name, .. }) = stmt else { - panic!("Found non-ClassDef in class_visibility") - }; - - if name.starts_with('_') { +pub(crate) fn class_visibility(class: &ast::StmtClassDef) -> Visibility { + if class.name.starts_with('_') { Visibility::Private } else { Visibility::Public diff --git a/crates/ruff_python_semantic/src/definition.rs b/crates/ruff_python_semantic/src/definition.rs index e3a5bfd649..9c0a202971 100644 --- a/crates/ruff_python_semantic/src/definition.rs +++ b/crates/ruff_python_semantic/src/definition.rs @@ -5,7 +5,8 @@ use std::fmt::Debug; use std::ops::Deref; use ruff_index::{newtype_index, IndexSlice, IndexVec}; -use ruff_python_ast::{self as ast, Stmt}; +use ruff_python_ast::{self as ast, Ranged, Stmt}; +use ruff_text_size::TextRange; use crate::analyze::visibility::{ class_visibility, function_visibility, method_visibility, ModuleSource, Visibility, @@ -23,7 +24,7 @@ impl DefinitionId { } } -#[derive(Debug)] +#[derive(Debug, is_macro::Is)] pub enum ModuleKind { /// A Python file that represents a module within a package. Module, @@ -57,35 +58,60 @@ impl<'a> Module<'a> { } } -#[derive(Debug, Copy, Clone)] -pub enum MemberKind { +#[derive(Debug, Copy, Clone, is_macro::Is)] +pub enum MemberKind<'a> { /// A class definition within a program. - Class, + Class(&'a ast::StmtClassDef), /// A nested class definition within a program. - NestedClass, + NestedClass(&'a ast::StmtClassDef), /// A function definition within a program. - Function, + Function(&'a ast::StmtFunctionDef), /// A nested function definition within a program. - NestedFunction, + NestedFunction(&'a ast::StmtFunctionDef), /// A method definition within a program. - Method, + Method(&'a ast::StmtFunctionDef), } /// A member of a Python module. #[derive(Debug)] pub struct Member<'a> { - pub kind: MemberKind, + pub kind: MemberKind<'a>, pub parent: DefinitionId, - pub stmt: &'a Stmt, } impl<'a> Member<'a> { /// Return the name of the member. - pub fn name(&self) -> Option<&'a str> { - match &self.stmt { - Stmt::FunctionDef(ast::StmtFunctionDef { name, .. }) - | Stmt::ClassDef(ast::StmtClassDef { name, .. }) => Some(name), - _ => None, + pub fn name(&self) -> &str { + match self.kind { + MemberKind::Class(class) => &class.name, + MemberKind::NestedClass(class) => &class.name, + MemberKind::Function(function) => &function.name, + MemberKind::NestedFunction(function) => &function.name, + MemberKind::Method(method) => &method.name, + } + } + + /// Return the body of the member. + pub fn body(&self) -> &[Stmt] { + match self.kind { + MemberKind::Class(class) => &class.body, + MemberKind::NestedClass(class) => &class.body, + MemberKind::Function(function) => &function.body, + MemberKind::NestedFunction(function) => &function.body, + MemberKind::Method(method) => &method.body, + } + } +} + +impl Ranged for Member<'_> { + /// Return the range of the member. + fn range(&self) -> TextRange { + match self.kind { + MemberKind::Class(class) => class.range(), + MemberKind::NestedClass(class) => class.range(), + MemberKind::Function(function) => function.range(), + MemberKind::NestedFunction(function) => function.range(), + MemberKind::Method(method) => method.range(), } } } @@ -103,16 +129,42 @@ impl Definition<'_> { matches!( self, Definition::Member(Member { - kind: MemberKind::Method, + kind: MemberKind::Method(_), .. }) ) } + /// Return the name of the definition. pub fn name(&self) -> Option<&str> { match self { Definition::Module(module) => module.name(), - Definition::Member(member) => member.name(), + Definition::Member(member) => Some(member.name()), + } + } + + /// Return the [`ast::StmtFunctionDef`] of the definition, if it's a function definition. + pub fn as_function_def(&self) -> Option<&ast::StmtFunctionDef> { + match self { + Definition::Member(Member { + kind: + MemberKind::Function(function) + | MemberKind::NestedFunction(function) + | MemberKind::Method(function), + .. + }) => Some(function), + _ => None, + } + } + + /// Return the [`ast::StmtClassDef`] of the definition, if it's a class definition. + pub fn as_class_def(&self) -> Option<&ast::StmtClassDef> { + match self { + Definition::Member(Member { + kind: MemberKind::Class(class) | MemberKind::NestedClass(class), + .. + }) => Some(class), + _ => None, } } } @@ -146,55 +198,43 @@ impl<'a> Definitions<'a> { match &definition { Definition::Module(module) => module.source.to_visibility(), Definition::Member(member) => match member.kind { - MemberKind::Class => { + MemberKind::Class(class) => { let parent = &definitions[member.parent]; if parent.visibility.is_private() - || exports.is_some_and(|exports| { - member.name().is_some_and(|name| !exports.contains(&name)) - }) + || exports.is_some_and(|exports| !exports.contains(&member.name())) { Visibility::Private } else { - class_visibility(member.stmt) + class_visibility(class) } } - MemberKind::NestedClass => { + MemberKind::NestedClass(class) => { let parent = &definitions[member.parent]; if parent.visibility.is_private() - || matches!( - parent.definition, - Definition::Member(Member { - kind: MemberKind::Function - | MemberKind::NestedFunction - | MemberKind::Method, - .. - }) - ) + || parent.definition.as_function_def().is_some() { Visibility::Private } else { - class_visibility(member.stmt) + class_visibility(class) } } - MemberKind::Function => { + MemberKind::Function(function) => { let parent = &definitions[member.parent]; if parent.visibility.is_private() - || exports.is_some_and(|exports| { - member.name().is_some_and(|name| !exports.contains(&name)) - }) + || exports.is_some_and(|exports| !exports.contains(&member.name())) { Visibility::Private } else { - function_visibility(member.stmt) + function_visibility(function) } } - MemberKind::NestedFunction => Visibility::Private, - MemberKind::Method => { + MemberKind::NestedFunction(_) => Visibility::Private, + MemberKind::Method(function) => { let parent = &definitions[member.parent]; if parent.visibility.is_private() { Visibility::Private } else { - method_visibility(member.stmt) + method_visibility(function) } } }, From 63ffadf0b801db9a5877f5e467afe069ae7f6425 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 13:18:58 -0400 Subject: [PATCH 015/155] Avoid omitting parentheses for trailing attributes on call expressions (#6322) ## Summary This PR modifies our `can_omit_optional_parentheses` rules to ensure that if we see a call followed by an attribute, we treat that as an attribute access rather than a splittable call expression. This in turn ensures that we wrap like: ```python ct_match = aaaaaaaaaaact_id == self.get_content_type( obj=rel_obj, using=instance._state.db ) ``` For calls, but: ```python ct_match = ( aaaaaaaaaaact_id == self.get_content_type(obj=rel_obj, using=instance._state.db).id ) ``` For calls with trailing attribute accesses. Closes https://github.com/astral-sh/ruff/issues/6065. ## Test Plan Similarity index before: - `zulip`: 0.99436 - `django`: 0.99779 - `warehouse`: 0.99504 - `transformers`: 0.99403 - `cpython`: 0.75912 - `typeshed`: 0.72293 And after: - `zulip`: 0.99436 - `django`: 0.99780 - `warehouse`: 0.99504 - `transformers`: 0.99404 - `cpython`: 0.75913 - `typeshed`: 0.72293 --- .../test/fixtures/ruff/expression/compare.py | 52 +++++++++ .../src/expression/mod.rs | 6 +- .../format@expression__compare.py.snap | 106 ++++++++++++++++++ 3 files changed, 162 insertions(+), 2 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/compare.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/compare.py index 906d5710aa..88b6da20bd 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/compare.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/compare.py @@ -59,3 +59,55 @@ return 1 == 2 and ( >= c ) ] + +def f(): + return ( + unicodedata.normalize("NFKC", s1).casefold() + == unicodedata.normalize("NFKC", s2).casefold() + ) + +# Call expressions with trailing attributes. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type(obj=rel_obj, using=instance._state.db).id +) + +ct_match = ( + {aaaaaaaaaaaaaaaa} == self.get_content_type(obj=rel_obj, using=instance._state.db).id +) + +ct_match = ( + (aaaaaaaaaaaaaaaa) == self.get_content_type(obj=rel_obj, using=instance._state.db).id +) + +ct_match = aaaaaaaaaaact_id == self.get_content_type( + obj=rel_obj, using=instance._state.db +) + +# Call expressions with trailing subscripts. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] +) + +ct_match = ( + {aaaaaaaaaaaaaaaa} == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] +) + +ct_match = ( + (aaaaaaaaaaaaaaaa) == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] +) + +# Subscripts expressions with trailing attributes. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type[obj, rel_obj, using, instance._state.db].id +) + +ct_match = ( + {aaaaaaaaaaaaaaaa} == self.get_content_type[obj, rel_obj, using, instance._state.db].id +) + +ct_match = ( + (aaaaaaaaaaaaaaaa) == self.get_content_type[obj, rel_obj, using, instance._state.db].id +) diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index f11b2a1f0d..971dc0898e 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -178,10 +178,9 @@ impl Format> for MaybeParenthesizeExpression<'_> { Parenthesize::Optional | Parenthesize::IfBreaks => needs_parentheses, }; - let can_omit_optional_parentheses = can_omit_optional_parentheses(expression, f.context()); match needs_parentheses { OptionalParentheses::Multiline if *parenthesize != Parenthesize::IfRequired => { - if can_omit_optional_parentheses { + if can_omit_optional_parentheses(expression, f.context()) { optional_parentheses(&expression.format().with_options(Parentheses::Never)) .fmt(f) } else { @@ -407,9 +406,12 @@ impl<'input> CanOmitOptionalParenthesesVisitor<'input> { attr: _, ctx: _, }) => { + self.visit_expr(value); if has_parentheses(value, self.source) { self.update_max_priority(OperatorPriority::Attribute); } + self.last = Some(expr); + return; } Expr::NamedExpr(_) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap index f62138f5d9..91690dd6de 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap @@ -65,6 +65,58 @@ return 1 == 2 and ( >= c ) ] + +def f(): + return ( + unicodedata.normalize("NFKC", s1).casefold() + == unicodedata.normalize("NFKC", s2).casefold() + ) + +# Call expressions with trailing attributes. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type(obj=rel_obj, using=instance._state.db).id +) + +ct_match = ( + {aaaaaaaaaaaaaaaa} == self.get_content_type(obj=rel_obj, using=instance._state.db).id +) + +ct_match = ( + (aaaaaaaaaaaaaaaa) == self.get_content_type(obj=rel_obj, using=instance._state.db).id +) + +ct_match = aaaaaaaaaaact_id == self.get_content_type( + obj=rel_obj, using=instance._state.db +) + +# Call expressions with trailing subscripts. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] +) + +ct_match = ( + {aaaaaaaaaaaaaaaa} == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] +) + +ct_match = ( + (aaaaaaaaaaaaaaaa) == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] +) + +# Subscripts expressions with trailing attributes. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type[obj, rel_obj, using, instance._state.db].id +) + +ct_match = ( + {aaaaaaaaaaaaaaaa} == self.get_content_type[obj, rel_obj, using, instance._state.db].id +) + +ct_match = ( + (aaaaaaaaaaaaaaaa) == self.get_content_type[obj, rel_obj, using, instance._state.db].id +) ``` ## Output @@ -171,6 +223,60 @@ return 1 == 2 and ( >= c ) ] + + +def f(): + return unicodedata.normalize("NFKC", s1).casefold() == unicodedata.normalize( + "NFKC", s2 + ).casefold() + + +# Call expressions with trailing attributes. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type(obj=rel_obj, using=instance._state.db).id +) + +ct_match = {aaaaaaaaaaaaaaaa} == self.get_content_type( + obj=rel_obj, using=instance._state.db +).id + +ct_match = (aaaaaaaaaaaaaaaa) == self.get_content_type( + obj=rel_obj, using=instance._state.db +).id + +ct_match = aaaaaaaaaaact_id == self.get_content_type( + obj=rel_obj, using=instance._state.db +) + +# Call expressions with trailing subscripts. + +ct_match = ( + aaaaaaaaaaact_id == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] +) + +ct_match = { + aaaaaaaaaaaaaaaa +} == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] + +ct_match = ( + aaaaaaaaaaaaaaaa +) == self.get_content_type(obj=rel_obj, using=instance._state.db)[id] + +# Subscripts expressions with trailing attributes. + +ct_match = ( + aaaaaaaaaaact_id + == self.get_content_type[obj, rel_obj, using, instance._state.db].id +) + +ct_match = { + aaaaaaaaaaaaaaaa +} == self.get_content_type[obj, rel_obj, using, instance._state.db].id + +ct_match = ( + aaaaaaaaaaaaaaaa +) == self.get_content_type[obj, rel_obj, using, instance._state.db].id ``` From 999d88e77371d9a8637a2cf0319d12b75ab3d132 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 7 Aug 2023 12:22:33 -0500 Subject: [PATCH 016/155] Fix formatting of chained boolean operations (#6394) Closes https://github.com/astral-sh/ruff/issues/6068 These commits are kind of a mess as I did some stumbling around here. Unrolls formatting of chained boolean operations to prevent nested grouping which gives us Black-compatible formatting where each boolean operation is on a new line. --- .../ruff/expression/boolean_operation.py | 32 +++++++ .../src/expression/expr_bool_op.rs | 64 ++++++++++---- .../src/expression/mod.rs | 10 ++- ...expression__binary_implicit_string.py.snap | 3 +- ...rmat@expression__boolean_operation.py.snap | 84 +++++++++++++++++++ 5 files changed, 177 insertions(+), 16 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/boolean_operation.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/boolean_operation.py index f976491cd1..16391cdf50 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/boolean_operation.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/boolean_operation.py @@ -62,3 +62,35 @@ if ( and [dddddddddddddd, eeeeeeeeee, fffffffffffffff] ): pass + +# Regression test for https://github.com/astral-sh/ruff/issues/6068 +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) or numpy and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) and numpy or isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) or xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) and xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy or isinstance(ccccccccccc, dddddd) +): + pass + + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) or (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy) and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) and (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy) or isinstance(ccccccccccc, dddddd) +): + pass diff --git a/crates/ruff_python_formatter/src/expression/expr_bool_op.rs b/crates/ruff_python_formatter/src/expression/expr_bool_op.rs index e57953371b..1717bdc262 100644 --- a/crates/ruff_python_formatter/src/expression/expr_bool_op.rs +++ b/crates/ruff_python_formatter/src/expression/expr_bool_op.rs @@ -5,18 +5,27 @@ use crate::expression::parentheses::{ }; use crate::prelude::*; use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions}; -use ruff_python_ast::node::AnyNodeRef; -use ruff_python_ast::{BoolOp, ExprBoolOp}; +use ruff_python_ast::node::{AnyNodeRef, AstNode}; +use ruff_python_ast::{BoolOp, Expr, ExprBoolOp}; + +use super::parentheses::is_expression_parenthesized; #[derive(Default)] pub struct FormatExprBoolOp { parentheses: Option, + chained: bool, +} + +pub struct BoolOpLayout { + pub(crate) parentheses: Option, + pub(crate) chained: bool, } impl FormatRuleWithOptions> for FormatExprBoolOp { - type Options = Option; + type Options = BoolOpLayout; fn with_options(mut self, options: Self::Options) -> Self { - self.parentheses = options; + self.parentheses = options.parentheses; + self.chained = options.chained; self } } @@ -37,7 +46,7 @@ impl FormatNodeRule for FormatExprBoolOp { return Ok(()); }; - write!(f, [in_parentheses_only_group(&first.format())])?; + FormatValue { value: first }.fmt(f)?; for value in values { let leading_value_comments = comments.leading_comments(value); @@ -51,20 +60,20 @@ impl FormatNodeRule for FormatExprBoolOp { )?; } - write!( - f, - [ - op.format(), - space(), - in_parentheses_only_group(&value.format()) - ] - )?; + write!(f, [op.format(), space(),])?; + + FormatValue { value }.fmt(f)?; } Ok(()) }); - in_parentheses_only_group(&inner).fmt(f) + if self.chained { + // Chained boolean operations should not be given a new group + inner.fmt(f) + } else { + in_parentheses_only_group(&inner).fmt(f) + } } } @@ -78,6 +87,33 @@ impl NeedsParentheses for ExprBoolOp { } } +struct FormatValue<'a> { + value: &'a Expr, +} + +impl Format> for FormatValue<'_> { + fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { + match self.value { + Expr::BoolOp(bool_op) + if !is_expression_parenthesized( + bool_op.as_any_node_ref(), + f.context().source(), + ) => + { + // Mark chained boolean operations e.g. `x and y or z` and avoid creating a new group + write!( + f, + [bool_op.format().with_options(BoolOpLayout { + parentheses: None, + chained: true, + })] + ) + } + _ => write!(f, [in_parentheses_only_group(&self.value.format())]), + } + } +} + #[derive(Copy, Clone)] pub struct FormatBoolOp; diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index 971dc0898e..94f4029a4d 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -16,6 +16,8 @@ use crate::expression::parentheses::{ }; use crate::prelude::*; +use self::expr_bool_op::BoolOpLayout; + pub(crate) mod expr_attribute; pub(crate) mod expr_await; pub(crate) mod expr_bin_op; @@ -67,7 +69,13 @@ impl FormatRule> for FormatExpr { let parentheses = self.parentheses; let format_expr = format_with(|f| match expression { - Expr::BoolOp(expr) => expr.format().with_options(Some(parentheses)).fmt(f), + Expr::BoolOp(expr) => expr + .format() + .with_options(BoolOpLayout { + parentheses: Some(parentheses), + chained: false, + }) + .fmt(f), Expr::NamedExpr(expr) => expr.format().fmt(f), Expr::BinOp(expr) => expr.format().fmt(f), Expr::UnaryOp(expr) => expr.format().fmt(f), diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__binary_implicit_string.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__binary_implicit_string.py.snap index 8176cc6fdf..a87ae3d9d8 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__binary_implicit_string.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__binary_implicit_string.py.snap @@ -180,7 +180,8 @@ def test(): ", %s unmodified" % unmodified_count if collected["unmodified"] else "" ), "post_processed": ( - collected["post_processed"] and ", %s post-processed" % post_processed_count + collected["post_processed"] + and ", %s post-processed" % post_processed_count or "" ), } diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__boolean_operation.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__boolean_operation.py.snap index 979f6fb805..01ae09af34 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__boolean_operation.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__boolean_operation.py.snap @@ -68,6 +68,38 @@ if ( and [dddddddddddddd, eeeeeeeeee, fffffffffffffff] ): pass + +# Regression test for https://github.com/astral-sh/ruff/issues/6068 +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) or numpy and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) and numpy or isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) or xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) and xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy or isinstance(ccccccccccc, dddddd) +): + pass + + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) or (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy) and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) and (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy) or isinstance(ccccccccccc, dddddd) +): + pass ``` ## Output @@ -136,6 +168,58 @@ if ( and [dddddddddddddd, eeeeeeeeee, fffffffffffffff] ): pass + +# Regression test for https://github.com/astral-sh/ruff/issues/6068 +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) + or numpy + and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) + and numpy + or isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) + or xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy + and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) + and xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy + or isinstance(ccccccccccc, dddddd) +): + pass + + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) + or ( + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy + ) + and isinstance(ccccccccccc, dddddd) +): + pass + +if not ( + isinstance(aaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb) + and ( + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy + ) + or isinstance(ccccccccccc, dddddd) +): + pass ``` From 3f0eea6d8760946bd33af76684d3c217efae4a3c Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 13:33:17 -0400 Subject: [PATCH 017/155] Rename `JoinedStr` to `FString` in the AST (#6379) ## Summary Per the proposal in https://github.com/astral-sh/ruff/discussions/6183, this PR renames the `JoinedStr` node to `FString`. --- .../src/checkers/ast/analyze/expression.rs | 2 +- crates/ruff/src/checkers/ast/mod.rs | 4 +- .../rules/hardcoded_sql_expression.rs | 2 +- .../rules/f_string_docstring.rs | 2 +- .../rules/useless_expression.rs | 2 +- .../rules/string_in_exception.rs | 2 +- .../rules/f_string_in_gettext_func_call.rs | 2 +- .../rules/explicit.rs | 4 +- .../rules/logging_call.rs | 2 +- .../flake8_pytest_style/rules/helpers.rs | 2 +- crates/ruff/src/rules/flynt/helpers.rs | 6 +- .../flynt/rules/static_join_to_fstring.rs | 6 +- .../rules/f_string_missing_placeholders.rs | 2 +- .../src/rules/pyflakes/rules/repeated_keys.rs | 2 +- .../pylint/rules/assert_on_string_literal.rs | 2 +- .../pylint/rules/invalid_envvar_default.rs | 2 +- .../pylint/rules/invalid_envvar_value.rs | 2 +- .../rules/pylint/rules/single_string_slots.rs | 4 +- .../rules/pyupgrade/rules/native_literals.rs | 2 +- .../rules/printf_string_formatting.rs | 2 +- .../rules/unnecessary_encode_utf8.rs | 2 +- .../rules/ruff/rules/invalid_index_type.rs | 8 +-- .../ruff/src/rules/ruff/rules/unreachable.rs | 2 +- .../tryceratops/rules/raise_vanilla_args.rs | 2 +- crates/ruff_python_ast/src/comparable.rs | 8 +-- crates/ruff_python_ast/src/helpers.rs | 8 +-- crates/ruff_python_ast/src/node.rs | 58 +++++++++---------- crates/ruff_python_ast/src/nodes.rs | 16 ++--- crates/ruff_python_ast/src/relocate.rs | 2 +- crates/ruff_python_ast/src/visitor.rs | 2 +- .../ruff_python_ast/src/visitor/preorder.rs | 2 +- crates/ruff_python_codegen/src/generator.rs | 26 ++++----- .../{expr_joined_str.rs => expr_f_string.rs} | 12 ++-- .../src/expression/mod.rs | 8 +-- .../src/expression/string.rs | 12 ++-- crates/ruff_python_formatter/src/generated.rs | 24 ++++---- ...parser__parser__tests__parse_f_string.snap | 4 +- ...uff_python_parser__parser__tests__try.snap | 8 +-- ...ython_parser__parser__tests__try_star.snap | 8 +-- ...string__tests__fstring_constant_range.snap | 4 +- ...ing__tests__fstring_escaped_character.snap | 4 +- ...tring__tests__fstring_escaped_newline.snap | 4 +- ...ing__tests__fstring_line_continuation.snap | 4 +- ...fstring_parse_self_documenting_format.snap | 4 +- ...ing__tests__fstring_unescaped_newline.snap | 4 +- ...tring__tests__parse_f_string_concat_1.snap | 4 +- ...tring__tests__parse_f_string_concat_2.snap | 4 +- ...tring__tests__parse_f_string_concat_3.snap | 4 +- ...ing__tests__parse_fstring_nested_spec.snap | 4 +- ..._tests__parse_fstring_not_nested_spec.snap | 4 +- ...ing__tests__parse_u_f_string_concat_1.snap | 4 +- ...ing__tests__parse_u_f_string_concat_2.snap | 4 +- ...on_parser__string__tests__raw_fstring.snap | 4 +- ...ing__tests__triple_quoted_raw_fstring.snap | 4 +- crates/ruff_python_parser/src/string.rs | 4 +- .../src/analyze/type_inference.rs | 2 +- 56 files changed, 166 insertions(+), 166 deletions(-) rename crates/ruff_python_formatter/src/expression/{expr_joined_str.rs => expr_f_string.rs} (61%) diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index 038ded69c7..ae29ce56f5 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -923,7 +923,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { pylint::rules::await_outside_async(checker, expr); } } - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { if checker.enabled(Rule::FStringMissingPlaceholders) { pyflakes::rules::f_string_missing_placeholders(expr, values, checker); } diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs index fbfe51ff9c..ee0a17fee4 100644 --- a/crates/ruff/src/checkers/ast/mod.rs +++ b/crates/ruff/src/checkers/ast/mod.rs @@ -1197,7 +1197,7 @@ where )); } } - Expr::JoinedStr(_) => { + Expr::FString(_) => { self.semantic.flags |= SemanticModelFlags::F_STRING; visitor::walk_expr(self, expr); } @@ -1276,7 +1276,7 @@ where fn visit_format_spec(&mut self, format_spec: &'b Expr) { match format_spec { - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { for value in values { self.visit_expr(value); } diff --git a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs index 2c7da19db0..467a0676cd 100644 --- a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs +++ b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs @@ -80,7 +80,7 @@ fn matches_string_format_expression(expr: &Expr, model: &SemanticModel) -> bool attr == "format" && string_literal(value).is_some() } // f"select * from table where val = {val}" - Expr::JoinedStr(_) => true, + Expr::FString(_) => true, _ => false, } } diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/f_string_docstring.rs b/crates/ruff/src/rules/flake8_bugbear/rules/f_string_docstring.rs index 2deb444d37..7441f8a9eb 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/f_string_docstring.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/f_string_docstring.rs @@ -50,7 +50,7 @@ pub(crate) fn f_string_docstring(checker: &mut Checker, body: &[Stmt]) { let Stmt::Expr(ast::StmtExpr { value, range: _ }) = stmt else { return; }; - if !value.is_joined_str_expr() { + if !value.is_f_string_expr() { return; } checker diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/useless_expression.rs b/crates/ruff/src/rules/flake8_bugbear/rules/useless_expression.rs index e71e87c8c0..cdef77fcd6 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/useless_expression.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/useless_expression.rs @@ -54,7 +54,7 @@ pub(crate) fn useless_expression(checker: &mut Checker, value: &Expr) { // Ignore strings, to avoid false positives with docstrings. if matches!( value, - Expr::JoinedStr(_) + Expr::FString(_) | Expr::Constant(ast::ExprConstant { value: Constant::Str(..) | Constant::Ellipsis, .. diff --git a/crates/ruff/src/rules/flake8_errmsg/rules/string_in_exception.rs b/crates/ruff/src/rules/flake8_errmsg/rules/string_in_exception.rs index a4d0cf0cf8..928d6eb873 100644 --- a/crates/ruff/src/rules/flake8_errmsg/rules/string_in_exception.rs +++ b/crates/ruff/src/rules/flake8_errmsg/rules/string_in_exception.rs @@ -210,7 +210,7 @@ pub(crate) fn string_in_exception(checker: &mut Checker, stmt: &Stmt, exc: &Expr } } // Check for f-strings. - Expr::JoinedStr(_) => { + Expr::FString(_) => { if checker.enabled(Rule::FStringInException) { let mut diagnostic = Diagnostic::new(FStringInException, first.range()); if checker.patch(diagnostic.kind.rule()) { diff --git a/crates/ruff/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs b/crates/ruff/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs index ed781aeb12..2b38343ad7 100644 --- a/crates/ruff/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs +++ b/crates/ruff/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs @@ -52,7 +52,7 @@ impl Violation for FStringInGetTextFuncCall { /// INT001 pub(crate) fn f_string_in_gettext_func_call(checker: &mut Checker, args: &[Expr]) { if let Some(first) = args.first() { - if first.is_joined_str_expr() { + if first.is_f_string_expr() { checker .diagnostics .push(Diagnostic::new(FStringInGetTextFuncCall {}, first.range())); diff --git a/crates/ruff/src/rules/flake8_implicit_str_concat/rules/explicit.rs b/crates/ruff/src/rules/flake8_implicit_str_concat/rules/explicit.rs index 54629f288d..f34fb79fa7 100644 --- a/crates/ruff/src/rules/flake8_implicit_str_concat/rules/explicit.rs +++ b/crates/ruff/src/rules/flake8_implicit_str_concat/rules/explicit.rs @@ -50,14 +50,14 @@ pub(crate) fn explicit(expr: &Expr, locator: &Locator) -> Option { if matches!(op, Operator::Add) { if matches!( left.as_ref(), - Expr::JoinedStr(_) + Expr::FString(_) | Expr::Constant(ast::ExprConstant { value: Constant::Str(..) | Constant::Bytes(..), .. }) ) && matches!( right.as_ref(), - Expr::JoinedStr(_) + Expr::FString(_) | Expr::Constant(ast::ExprConstant { value: Constant::Str(..) | Constant::Bytes(..), .. diff --git a/crates/ruff/src/rules/flake8_logging_format/rules/logging_call.rs b/crates/ruff/src/rules/flake8_logging_format/rules/logging_call.rs index df3bb720c8..0a9cc72ecc 100644 --- a/crates/ruff/src/rules/flake8_logging_format/rules/logging_call.rs +++ b/crates/ruff/src/rules/flake8_logging_format/rules/logging_call.rs @@ -62,7 +62,7 @@ fn check_msg(checker: &mut Checker, msg: &Expr) { _ => {} }, // Check for f-strings. - Expr::JoinedStr(_) => { + Expr::FString(_) => { if checker.enabled(Rule::LoggingFString) { checker .diagnostics diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs index bd32a61725..df35d5a44f 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs @@ -63,7 +63,7 @@ pub(super) fn is_empty_or_null_string(expr: &Expr) -> bool { .. }) => string.is_empty(), Expr::Constant(constant) if constant.value.is_none() => true, - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { values.iter().all(is_empty_or_null_string) } _ => false, diff --git a/crates/ruff/src/rules/flynt/helpers.rs b/crates/ruff/src/rules/flynt/helpers.rs index cc93e9b46b..31368a0fd9 100644 --- a/crates/ruff/src/rules/flynt/helpers.rs +++ b/crates/ruff/src/rules/flynt/helpers.rs @@ -52,14 +52,14 @@ fn is_simple_callee(func: &Expr) -> bool { } /// Convert an expression to a f-string element (if it looks like a good idea). -pub(super) fn to_fstring_elem(expr: &Expr) -> Option { +pub(super) fn to_f_string_element(expr: &Expr) -> Option { match expr { - // These are directly handled by `unparse_fstring_elem`: + // These are directly handled by `unparse_f_string_element`: Expr::Constant(ast::ExprConstant { value: Constant::Str(_), .. }) - | Expr::JoinedStr(_) + | Expr::FString(_) | Expr::FormattedValue(_) => Some(expr.clone()), // These should be pretty safe to wrap in a formatted value. Expr::Constant(ast::ExprConstant { diff --git a/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs b/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs index 62a9bbb3f6..f1290ee8be 100644 --- a/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs +++ b/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs @@ -87,7 +87,7 @@ fn build_fstring(joiner: &str, joinees: &[Expr]) -> Option { let mut first = true; for expr in joinees { - if expr.is_joined_str_expr() { + if expr.is_f_string_expr() { // Oops, already an f-string. We don't know how to handle those // gracefully right now. return None; @@ -95,10 +95,10 @@ fn build_fstring(joiner: &str, joinees: &[Expr]) -> Option { if !std::mem::take(&mut first) { fstring_elems.push(helpers::to_constant_string(joiner)); } - fstring_elems.push(helpers::to_fstring_elem(expr)?); + fstring_elems.push(helpers::to_f_string_element(expr)?); } - let node = ast::ExprJoinedStr { + let node = ast::ExprFString { values: fstring_elems, range: TextRange::default(), }; diff --git a/crates/ruff/src/rules/pyflakes/rules/f_string_missing_placeholders.rs b/crates/ruff/src/rules/pyflakes/rules/f_string_missing_placeholders.rs index 4de5016a3a..fd2982c11a 100644 --- a/crates/ruff/src/rules/pyflakes/rules/f_string_missing_placeholders.rs +++ b/crates/ruff/src/rules/pyflakes/rules/f_string_missing_placeholders.rs @@ -48,7 +48,7 @@ impl AlwaysAutofixableViolation for FStringMissingPlaceholders { } } -/// Find f-strings that don't contain any formatted values in a `JoinedStr`. +/// Find f-strings that don't contain any formatted values in an [`FString`]. fn find_useless_f_strings<'a>( expr: &'a Expr, locator: &'a Locator, diff --git a/crates/ruff/src/rules/pyflakes/rules/repeated_keys.rs b/crates/ruff/src/rules/pyflakes/rules/repeated_keys.rs index 1876b65c05..7fe38263ef 100644 --- a/crates/ruff/src/rules/pyflakes/rules/repeated_keys.rs +++ b/crates/ruff/src/rules/pyflakes/rules/repeated_keys.rs @@ -130,7 +130,7 @@ pub(crate) fn repeated_keys(checker: &mut Checker, keys: &[Option], values }; match key { - Expr::Constant(_) | Expr::Tuple(_) | Expr::JoinedStr(_) => { + Expr::Constant(_) | Expr::Tuple(_) | Expr::FString(_) => { if checker.enabled(Rule::MultiValueRepeatedKeyLiteral) { let mut diagnostic = Diagnostic::new( MultiValueRepeatedKeyLiteral { diff --git a/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs b/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs index 46bbf2e86a..0dcde075d1 100644 --- a/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs +++ b/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs @@ -71,7 +71,7 @@ pub(crate) fn assert_on_string_literal(checker: &mut Checker, test: &Expr) { } _ => {} }, - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { checker.diagnostics.push(Diagnostic::new( AssertOnStringLiteral { kind: if values.iter().all(|value| match value { diff --git a/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs b/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs index bbe2e40581..549311f8ab 100644 --- a/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs +++ b/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs @@ -71,7 +71,7 @@ fn is_valid_default(expr: &Expr) -> bool { Expr::Constant(ast::ExprConstant { value: Constant::Str { .. } | Constant::None { .. }, .. - }) | Expr::JoinedStr(_) + }) | Expr::FString(_) ) } diff --git a/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs b/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs index eccbd4077f..03f2894832 100644 --- a/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs +++ b/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs @@ -68,7 +68,7 @@ fn is_valid_key(expr: &Expr) -> bool { Expr::Constant(ast::ExprConstant { value: Constant::Str { .. }, .. - }) | Expr::JoinedStr(_) + }) | Expr::FString(_) ) } diff --git a/crates/ruff/src/rules/pylint/rules/single_string_slots.rs b/crates/ruff/src/rules/pylint/rules/single_string_slots.rs index e4b51fd9cd..82ba8bbbc9 100644 --- a/crates/ruff/src/rules/pylint/rules/single_string_slots.rs +++ b/crates/ruff/src/rules/pylint/rules/single_string_slots.rs @@ -70,7 +70,7 @@ pub(crate) fn single_string_slots(checker: &mut Checker, class: &StmtClassDef) { Expr::Constant(ast::ExprConstant { value: Constant::Str(_), .. - }) | Expr::JoinedStr(_) + }) | Expr::FString(_) ) { checker .diagnostics @@ -92,7 +92,7 @@ pub(crate) fn single_string_slots(checker: &mut Checker, class: &StmtClassDef) { Expr::Constant(ast::ExprConstant { value: Constant::Str(_), .. - }) | Expr::JoinedStr(_) + }) | Expr::FString(_) ) { checker .diagnostics diff --git a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs index 07dde88bcb..31b918f100 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs @@ -150,7 +150,7 @@ pub(crate) fn native_literals( if checker .semantic() .current_expressions() - .filter(|expr| expr.is_joined_str_expr()) + .filter(|expr| expr.is_f_string_expr()) .count() > 1 { diff --git a/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs b/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs index d60ef54eab..a170e20f05 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs @@ -400,7 +400,7 @@ pub(crate) fn printf_string_formatting( // Parse the parameters. let params_string = match right { - Expr::Constant(_) | Expr::JoinedStr(_) => { + Expr::Constant(_) | Expr::FString(_) => { format!("({})", checker.locator().slice(right.range())) } Expr::Name(_) | Expr::Attribute(_) | Expr::Subscript(_) | Expr::Call(_) => { diff --git a/crates/ruff/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs b/crates/ruff/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs index 8e9dae557e..d6e3aa5e36 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs @@ -226,7 +226,7 @@ pub(crate) fn unnecessary_encode_utf8(checker: &mut Checker, call: &ast::ExprCal } } // Ex) `f"foo{bar}".encode("utf-8")` - Expr::JoinedStr(_) => { + Expr::FString(_) => { if let Some(encoding_arg) = match_encoding_arg(&call.arguments) { if let EncodingArg::Keyword(kwarg) = encoding_arg { // Ex) Convert `f"unicode text©".encode(encoding="utf-8")` to diff --git a/crates/ruff/src/rules/ruff/rules/invalid_index_type.rs b/crates/ruff/src/rules/ruff/rules/invalid_index_type.rs index 87b30117ab..74be4ac75b 100644 --- a/crates/ruff/src/rules/ruff/rules/invalid_index_type.rs +++ b/crates/ruff/src/rules/ruff/rules/invalid_index_type.rs @@ -63,7 +63,7 @@ pub(crate) fn invalid_index_type(checker: &mut Checker, expr: &ExprSubscript) { Expr::List(_) | Expr::ListComp(_) | Expr::Tuple(_) - | Expr::JoinedStr(_) + | Expr::FString(_) | Expr::Constant(ExprConstant { value: Constant::Str(_) | Constant::Bytes(_), .. @@ -156,7 +156,7 @@ pub(crate) fn invalid_index_type(checker: &mut Checker, expr: &ExprSubscript) { #[derive(Debug)] enum CheckableExprType<'a> { Constant(&'a Constant), - JoinedStr, + FString, List, ListComp, SetComp, @@ -171,7 +171,7 @@ impl fmt::Display for CheckableExprType<'_> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Self::Constant(constant) => f.write_str(constant_type_name(constant)), - Self::JoinedStr => f.write_str("str"), + Self::FString => f.write_str("str"), Self::List => f.write_str("list"), Self::SetComp => f.write_str("set comprehension"), Self::ListComp => f.write_str("list comprehension"), @@ -188,7 +188,7 @@ impl<'a> CheckableExprType<'a> { fn try_from(expr: &'a Expr) -> Option { match expr { Expr::Constant(ExprConstant { value, .. }) => Some(Self::Constant(value)), - Expr::JoinedStr(_) => Some(Self::JoinedStr), + Expr::FString(_) => Some(Self::FString), Expr::List(_) => Some(Self::List), Expr::ListComp(_) => Some(Self::ListComp), Expr::SetComp(_) => Some(Self::SetComp), diff --git a/crates/ruff/src/rules/ruff/rules/unreachable.rs b/crates/ruff/src/rules/ruff/rules/unreachable.rs index b803fce617..300110fe6f 100644 --- a/crates/ruff/src/rules/ruff/rules/unreachable.rs +++ b/crates/ruff/src/rules/ruff/rules/unreachable.rs @@ -633,7 +633,7 @@ impl<'stmt> BasicBlocksBuilder<'stmt> { | Expr::Compare(_) | Expr::Call(_) | Expr::FormattedValue(_) - | Expr::JoinedStr(_) + | Expr::FString(_) | Expr::Constant(_) | Expr::Attribute(_) | Expr::Subscript(_) diff --git a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs index 8850aea86f..ad2efa5ba5 100644 --- a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs +++ b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs @@ -54,7 +54,7 @@ where F: (Fn(&str) -> bool) + Copy, { match expr { - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { for value in values { if any_string(value, predicate) { return true; diff --git a/crates/ruff_python_ast/src/comparable.rs b/crates/ruff_python_ast/src/comparable.rs index 71b546a342..f042fe3707 100644 --- a/crates/ruff_python_ast/src/comparable.rs +++ b/crates/ruff_python_ast/src/comparable.rs @@ -616,7 +616,7 @@ pub struct ExprFormattedValue<'a> { } #[derive(Debug, PartialEq, Eq, Hash)] -pub struct ExprJoinedStr<'a> { +pub struct ExprFString<'a> { values: Vec>, } @@ -697,7 +697,7 @@ pub enum ComparableExpr<'a> { Compare(ExprCompare<'a>), Call(ExprCall<'a>), FormattedValue(ExprFormattedValue<'a>), - JoinedStr(ExprJoinedStr<'a>), + FString(ExprFString<'a>), Constant(ExprConstant<'a>), Attribute(ExprAttribute<'a>), Subscript(ExprSubscript<'a>), @@ -865,8 +865,8 @@ impl<'a> From<&'a ast::Expr> for ComparableExpr<'a> { debug_text: debug_text.as_ref(), format_spec: format_spec.as_ref().map(Into::into), }), - ast::Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { - Self::JoinedStr(ExprJoinedStr { + ast::Expr::FString(ast::ExprFString { values, range: _ }) => { + Self::FString(ExprFString { values: values.iter().map(Into::into).collect(), }) } diff --git a/crates/ruff_python_ast/src/helpers.rs b/crates/ruff_python_ast/src/helpers.rs index a7994a3b49..f5fa0a5c48 100644 --- a/crates/ruff_python_ast/src/helpers.rs +++ b/crates/ruff_python_ast/src/helpers.rs @@ -68,7 +68,7 @@ where if !matches!( left.as_ref(), Expr::Constant(_) - | Expr::JoinedStr(_) + | Expr::FString(_) | Expr::List(_) | Expr::Tuple(_) | Expr::Set(_) @@ -82,7 +82,7 @@ where if !matches!( right.as_ref(), Expr::Constant(_) - | Expr::JoinedStr(_) + | Expr::FString(_) | Expr::List(_) | Expr::Tuple(_) | Expr::Set(_) @@ -126,7 +126,7 @@ where Expr::BoolOp(ast::ExprBoolOp { values, range: _, .. }) - | Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + | Expr::FString(ast::ExprFString { values, range: _ }) => { values.iter().any(|expr| any_over_expr(expr, func)) } Expr::NamedExpr(ast::ExprNamedExpr { @@ -1094,7 +1094,7 @@ impl Truthiness { Constant::Complex { real, imag } => Some(*real != 0.0 || *imag != 0.0), Constant::Ellipsis => Some(true), }, - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { if values.is_empty() { Some(false) } else if values.iter().any(|value| { diff --git a/crates/ruff_python_ast/src/node.rs b/crates/ruff_python_ast/src/node.rs index ec2c6075c0..cc3748d62a 100644 --- a/crates/ruff_python_ast/src/node.rs +++ b/crates/ruff_python_ast/src/node.rs @@ -67,7 +67,7 @@ pub enum AnyNode { ExprCompare(ast::ExprCompare), ExprCall(ast::ExprCall), ExprFormattedValue(ast::ExprFormattedValue), - ExprJoinedStr(ast::ExprJoinedStr), + ExprFString(ast::ExprFString), ExprConstant(ast::ExprConstant), ExprAttribute(ast::ExprAttribute), ExprSubscript(ast::ExprSubscript), @@ -153,7 +153,7 @@ impl AnyNode { | AnyNode::ExprCompare(_) | AnyNode::ExprCall(_) | AnyNode::ExprFormattedValue(_) - | AnyNode::ExprJoinedStr(_) + | AnyNode::ExprFString(_) | AnyNode::ExprConstant(_) | AnyNode::ExprAttribute(_) | AnyNode::ExprSubscript(_) @@ -210,7 +210,7 @@ impl AnyNode { AnyNode::ExprCompare(node) => Some(Expr::Compare(node)), AnyNode::ExprCall(node) => Some(Expr::Call(node)), AnyNode::ExprFormattedValue(node) => Some(Expr::FormattedValue(node)), - AnyNode::ExprJoinedStr(node) => Some(Expr::JoinedStr(node)), + AnyNode::ExprFString(node) => Some(Expr::FString(node)), AnyNode::ExprConstant(node) => Some(Expr::Constant(node)), AnyNode::ExprAttribute(node) => Some(Expr::Attribute(node)), AnyNode::ExprSubscript(node) => Some(Expr::Subscript(node)), @@ -325,7 +325,7 @@ impl AnyNode { | AnyNode::ExprCompare(_) | AnyNode::ExprCall(_) | AnyNode::ExprFormattedValue(_) - | AnyNode::ExprJoinedStr(_) + | AnyNode::ExprFString(_) | AnyNode::ExprConstant(_) | AnyNode::ExprAttribute(_) | AnyNode::ExprSubscript(_) @@ -419,7 +419,7 @@ impl AnyNode { | AnyNode::ExprCompare(_) | AnyNode::ExprCall(_) | AnyNode::ExprFormattedValue(_) - | AnyNode::ExprJoinedStr(_) + | AnyNode::ExprFString(_) | AnyNode::ExprConstant(_) | AnyNode::ExprAttribute(_) | AnyNode::ExprSubscript(_) @@ -498,7 +498,7 @@ impl AnyNode { | AnyNode::ExprCompare(_) | AnyNode::ExprCall(_) | AnyNode::ExprFormattedValue(_) - | AnyNode::ExprJoinedStr(_) + | AnyNode::ExprFString(_) | AnyNode::ExprConstant(_) | AnyNode::ExprAttribute(_) | AnyNode::ExprSubscript(_) @@ -602,7 +602,7 @@ impl AnyNode { Self::ExprCompare(node) => AnyNodeRef::ExprCompare(node), Self::ExprCall(node) => AnyNodeRef::ExprCall(node), Self::ExprFormattedValue(node) => AnyNodeRef::ExprFormattedValue(node), - Self::ExprJoinedStr(node) => AnyNodeRef::ExprJoinedStr(node), + Self::ExprFString(node) => AnyNodeRef::ExprFString(node), Self::ExprConstant(node) => AnyNodeRef::ExprConstant(node), Self::ExprAttribute(node) => AnyNodeRef::ExprAttribute(node), Self::ExprSubscript(node) => AnyNodeRef::ExprSubscript(node), @@ -1961,12 +1961,12 @@ impl AstNode for ast::ExprFormattedValue { AnyNode::from(self) } } -impl AstNode for ast::ExprJoinedStr { +impl AstNode for ast::ExprFString { fn cast(kind: AnyNode) -> Option where Self: Sized, { - if let AnyNode::ExprJoinedStr(node) = kind { + if let AnyNode::ExprFString(node) = kind { Some(node) } else { None @@ -1974,7 +1974,7 @@ impl AstNode for ast::ExprJoinedStr { } fn cast_ref(kind: AnyNodeRef) -> Option<&Self> { - if let AnyNodeRef::ExprJoinedStr(node) = kind { + if let AnyNodeRef::ExprFString(node) = kind { Some(node) } else { None @@ -2941,7 +2941,7 @@ impl From for AnyNode { Expr::Compare(node) => AnyNode::ExprCompare(node), Expr::Call(node) => AnyNode::ExprCall(node), Expr::FormattedValue(node) => AnyNode::ExprFormattedValue(node), - Expr::JoinedStr(node) => AnyNode::ExprJoinedStr(node), + Expr::FString(node) => AnyNode::ExprFString(node), Expr::Constant(node) => AnyNode::ExprConstant(node), Expr::Attribute(node) => AnyNode::ExprAttribute(node), Expr::Subscript(node) => AnyNode::ExprSubscript(node), @@ -3269,9 +3269,9 @@ impl From for AnyNode { } } -impl From for AnyNode { - fn from(node: ast::ExprJoinedStr) -> Self { - AnyNode::ExprJoinedStr(node) +impl From for AnyNode { + fn from(node: ast::ExprFString) -> Self { + AnyNode::ExprFString(node) } } @@ -3505,7 +3505,7 @@ impl Ranged for AnyNode { AnyNode::ExprCompare(node) => node.range(), AnyNode::ExprCall(node) => node.range(), AnyNode::ExprFormattedValue(node) => node.range(), - AnyNode::ExprJoinedStr(node) => node.range(), + AnyNode::ExprFString(node) => node.range(), AnyNode::ExprConstant(node) => node.range(), AnyNode::ExprAttribute(node) => node.range(), AnyNode::ExprSubscript(node) => node.range(), @@ -3591,7 +3591,7 @@ pub enum AnyNodeRef<'a> { ExprCompare(&'a ast::ExprCompare), ExprCall(&'a ast::ExprCall), ExprFormattedValue(&'a ast::ExprFormattedValue), - ExprJoinedStr(&'a ast::ExprJoinedStr), + ExprFString(&'a ast::ExprFString), ExprConstant(&'a ast::ExprConstant), ExprAttribute(&'a ast::ExprAttribute), ExprSubscript(&'a ast::ExprSubscript), @@ -3676,7 +3676,7 @@ impl AnyNodeRef<'_> { AnyNodeRef::ExprCompare(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprCall(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprFormattedValue(node) => NonNull::from(*node).cast(), - AnyNodeRef::ExprJoinedStr(node) => NonNull::from(*node).cast(), + AnyNodeRef::ExprFString(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprConstant(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprAttribute(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprSubscript(node) => NonNull::from(*node).cast(), @@ -3767,7 +3767,7 @@ impl AnyNodeRef<'_> { AnyNodeRef::ExprCompare(_) => NodeKind::ExprCompare, AnyNodeRef::ExprCall(_) => NodeKind::ExprCall, AnyNodeRef::ExprFormattedValue(_) => NodeKind::ExprFormattedValue, - AnyNodeRef::ExprJoinedStr(_) => NodeKind::ExprJoinedStr, + AnyNodeRef::ExprFString(_) => NodeKind::ExprFString, AnyNodeRef::ExprConstant(_) => NodeKind::ExprConstant, AnyNodeRef::ExprAttribute(_) => NodeKind::ExprAttribute, AnyNodeRef::ExprSubscript(_) => NodeKind::ExprSubscript, @@ -3853,7 +3853,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprCompare(_) | AnyNodeRef::ExprCall(_) | AnyNodeRef::ExprFormattedValue(_) - | AnyNodeRef::ExprJoinedStr(_) + | AnyNodeRef::ExprFString(_) | AnyNodeRef::ExprConstant(_) | AnyNodeRef::ExprAttribute(_) | AnyNodeRef::ExprSubscript(_) @@ -3910,7 +3910,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprCompare(_) | AnyNodeRef::ExprCall(_) | AnyNodeRef::ExprFormattedValue(_) - | AnyNodeRef::ExprJoinedStr(_) + | AnyNodeRef::ExprFString(_) | AnyNodeRef::ExprConstant(_) | AnyNodeRef::ExprAttribute(_) | AnyNodeRef::ExprSubscript(_) @@ -4024,7 +4024,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprCompare(_) | AnyNodeRef::ExprCall(_) | AnyNodeRef::ExprFormattedValue(_) - | AnyNodeRef::ExprJoinedStr(_) + | AnyNodeRef::ExprFString(_) | AnyNodeRef::ExprConstant(_) | AnyNodeRef::ExprAttribute(_) | AnyNodeRef::ExprSubscript(_) @@ -4118,7 +4118,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprCompare(_) | AnyNodeRef::ExprCall(_) | AnyNodeRef::ExprFormattedValue(_) - | AnyNodeRef::ExprJoinedStr(_) + | AnyNodeRef::ExprFString(_) | AnyNodeRef::ExprConstant(_) | AnyNodeRef::ExprAttribute(_) | AnyNodeRef::ExprSubscript(_) @@ -4197,7 +4197,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprCompare(_) | AnyNodeRef::ExprCall(_) | AnyNodeRef::ExprFormattedValue(_) - | AnyNodeRef::ExprJoinedStr(_) + | AnyNodeRef::ExprFString(_) | AnyNodeRef::ExprConstant(_) | AnyNodeRef::ExprAttribute(_) | AnyNodeRef::ExprSubscript(_) @@ -4543,9 +4543,9 @@ impl<'a> From<&'a ast::ExprFormattedValue> for AnyNodeRef<'a> { } } -impl<'a> From<&'a ast::ExprJoinedStr> for AnyNodeRef<'a> { - fn from(node: &'a ast::ExprJoinedStr) -> Self { - AnyNodeRef::ExprJoinedStr(node) +impl<'a> From<&'a ast::ExprFString> for AnyNodeRef<'a> { + fn from(node: &'a ast::ExprFString) -> Self { + AnyNodeRef::ExprFString(node) } } @@ -4740,7 +4740,7 @@ impl<'a> From<&'a Expr> for AnyNodeRef<'a> { Expr::Compare(node) => AnyNodeRef::ExprCompare(node), Expr::Call(node) => AnyNodeRef::ExprCall(node), Expr::FormattedValue(node) => AnyNodeRef::ExprFormattedValue(node), - Expr::JoinedStr(node) => AnyNodeRef::ExprJoinedStr(node), + Expr::FString(node) => AnyNodeRef::ExprFString(node), Expr::Constant(node) => AnyNodeRef::ExprConstant(node), Expr::Attribute(node) => AnyNodeRef::ExprAttribute(node), Expr::Subscript(node) => AnyNodeRef::ExprSubscript(node), @@ -4893,7 +4893,7 @@ impl Ranged for AnyNodeRef<'_> { AnyNodeRef::ExprCompare(node) => node.range(), AnyNodeRef::ExprCall(node) => node.range(), AnyNodeRef::ExprFormattedValue(node) => node.range(), - AnyNodeRef::ExprJoinedStr(node) => node.range(), + AnyNodeRef::ExprFString(node) => node.range(), AnyNodeRef::ExprConstant(node) => node.range(), AnyNodeRef::ExprAttribute(node) => node.range(), AnyNodeRef::ExprSubscript(node) => node.range(), @@ -4981,7 +4981,7 @@ pub enum NodeKind { ExprCompare, ExprCall, ExprFormattedValue, - ExprJoinedStr, + ExprFString, ExprConstant, ExprAttribute, ExprSubscript, diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs index 5e5239872a..94c93c82b1 100644 --- a/crates/ruff_python_ast/src/nodes.rs +++ b/crates/ruff_python_ast/src/nodes.rs @@ -550,8 +550,8 @@ pub enum Expr { Call(ExprCall), #[is(name = "formatted_value_expr")] FormattedValue(ExprFormattedValue), - #[is(name = "joined_str_expr")] - JoinedStr(ExprJoinedStr), + #[is(name = "f_string_expr")] + FString(ExprFString), #[is(name = "constant_expr")] Constant(ExprConstant), #[is(name = "attribute_expr")] @@ -878,14 +878,14 @@ pub struct DebugText { /// See also [JoinedStr](https://docs.python.org/3/library/ast.html#ast.JoinedStr) #[derive(Clone, Debug, PartialEq)] -pub struct ExprJoinedStr { +pub struct ExprFString { pub range: TextRange, pub values: Vec, } -impl From for Expr { - fn from(payload: ExprJoinedStr) -> Self { - Expr::JoinedStr(payload) +impl From for Expr { + fn from(payload: ExprFString) -> Self { + Expr::FString(payload) } } @@ -2814,7 +2814,7 @@ impl Ranged for crate::nodes::ExprFormattedValue { self.range } } -impl Ranged for crate::nodes::ExprJoinedStr { +impl Ranged for crate::nodes::ExprFString { fn range(&self) -> TextRange { self.range } @@ -2885,7 +2885,7 @@ impl Ranged for crate::Expr { Self::Compare(node) => node.range(), Self::Call(node) => node.range(), Self::FormattedValue(node) => node.range(), - Self::JoinedStr(node) => node.range(), + Self::FString(node) => node.range(), Self::Constant(node) => node.range(), Self::Attribute(node) => node.range(), Self::Subscript(node) => node.range(), diff --git a/crates/ruff_python_ast/src/relocate.rs b/crates/ruff_python_ast/src/relocate.rs index 2ba2f82006..daf02214b0 100644 --- a/crates/ruff_python_ast/src/relocate.rs +++ b/crates/ruff_python_ast/src/relocate.rs @@ -140,7 +140,7 @@ pub fn relocate_expr(expr: &mut Expr, location: TextRange) { relocate_expr(expr, location); } } - Expr::JoinedStr(nodes::ExprJoinedStr { values, range }) => { + Expr::FString(nodes::ExprFString { values, range }) => { *range = location; for expr in values { relocate_expr(expr, location); diff --git a/crates/ruff_python_ast/src/visitor.rs b/crates/ruff_python_ast/src/visitor.rs index be2fc8fc6d..527c7e187a 100644 --- a/crates/ruff_python_ast/src/visitor.rs +++ b/crates/ruff_python_ast/src/visitor.rs @@ -476,7 +476,7 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) { visitor.visit_format_spec(expr); } } - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { for expr in values { visitor.visit_expr(expr); } diff --git a/crates/ruff_python_ast/src/visitor/preorder.rs b/crates/ruff_python_ast/src/visitor/preorder.rs index 90ae53db61..6d3c5334da 100644 --- a/crates/ruff_python_ast/src/visitor/preorder.rs +++ b/crates/ruff_python_ast/src/visitor/preorder.rs @@ -570,7 +570,7 @@ where } } - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { + Expr::FString(ast::ExprFString { values, range: _ }) => { for expr in values { visitor.visit_expr(expr); } diff --git a/crates/ruff_python_codegen/src/generator.rs b/crates/ruff_python_codegen/src/generator.rs index 162f75736d..e67b76d2d7 100644 --- a/crates/ruff_python_codegen/src/generator.rs +++ b/crates/ruff_python_codegen/src/generator.rs @@ -1104,8 +1104,8 @@ impl<'a> Generator<'a> { *conversion, format_spec.as_deref(), ), - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { - self.unparse_joinedstr(values, false); + Expr::FString(ast::ExprFString { values, range: _ }) => { + self.unparse_f_string(values, false); } Expr::Constant(ast::ExprConstant { value, @@ -1289,9 +1289,9 @@ impl<'a> Generator<'a> { } } - fn unparse_fstring_body(&mut self, values: &[Expr], is_spec: bool) { + fn unparse_f_string_body(&mut self, values: &[Expr], is_spec: bool) { for value in values { - self.unparse_fstring_elem(value, is_spec); + self.unparse_f_string_elem(value, is_spec); } } @@ -1330,23 +1330,23 @@ impl<'a> Generator<'a> { if let Some(spec) = spec { self.p(":"); - self.unparse_fstring_elem(spec, true); + self.unparse_f_string_elem(spec, true); } self.p("}"); } - fn unparse_fstring_elem(&mut self, expr: &Expr, is_spec: bool) { + fn unparse_f_string_elem(&mut self, expr: &Expr, is_spec: bool) { match expr { Expr::Constant(ast::ExprConstant { value, .. }) => { if let Constant::Str(s) = value { - self.unparse_fstring_str(s); + self.unparse_f_string_literal(s); } else { unreachable!() } } - Expr::JoinedStr(ast::ExprJoinedStr { values, range: _ }) => { - self.unparse_joinedstr(values, is_spec); + Expr::FString(ast::ExprFString { values, range: _ }) => { + self.unparse_f_string(values, is_spec); } Expr::FormattedValue(ast::ExprFormattedValue { value, @@ -1364,14 +1364,14 @@ impl<'a> Generator<'a> { } } - fn unparse_fstring_str(&mut self, s: &str) { + fn unparse_f_string_literal(&mut self, s: &str) { let s = s.replace('{', "{{").replace('}', "}}"); self.p(&s); } - fn unparse_joinedstr(&mut self, values: &[Expr], is_spec: bool) { + fn unparse_f_string(&mut self, values: &[Expr], is_spec: bool) { if is_spec { - self.unparse_fstring_body(values, is_spec); + self.unparse_f_string_body(values, is_spec); } else { self.p("f"); let mut generator = Generator::new( @@ -1382,7 +1382,7 @@ impl<'a> Generator<'a> { }, self.line_ending, ); - generator.unparse_fstring_body(values, is_spec); + generator.unparse_f_string_body(values, is_spec); let body = &generator.buffer; self.p_str_repr(body); } diff --git a/crates/ruff_python_formatter/src/expression/expr_joined_str.rs b/crates/ruff_python_formatter/src/expression/expr_f_string.rs similarity index 61% rename from crates/ruff_python_formatter/src/expression/expr_joined_str.rs rename to crates/ruff_python_formatter/src/expression/expr_f_string.rs index e857ea0b30..0c0165dd3f 100644 --- a/crates/ruff_python_formatter/src/expression/expr_joined_str.rs +++ b/crates/ruff_python_formatter/src/expression/expr_f_string.rs @@ -5,18 +5,18 @@ use crate::prelude::*; use crate::{FormatNodeRule, PyFormatter}; use ruff_formatter::FormatResult; use ruff_python_ast::node::AnyNodeRef; -use ruff_python_ast::ExprJoinedStr; +use ruff_python_ast::ExprFString; #[derive(Default)] -pub struct FormatExprJoinedStr; +pub struct FormatExprFString; -impl FormatNodeRule for FormatExprJoinedStr { - fn fmt_fields(&self, item: &ExprJoinedStr, f: &mut PyFormatter) -> FormatResult<()> { - FormatString::new(&AnyString::JoinedStr(item)).fmt(f) +impl FormatNodeRule for FormatExprFString { + fn fmt_fields(&self, item: &ExprFString, f: &mut PyFormatter) -> FormatResult<()> { + FormatString::new(&AnyString::FString(item)).fmt(f) } } -impl NeedsParentheses for ExprJoinedStr { +impl NeedsParentheses for ExprFString { fn needs_parentheses( &self, _parent: AnyNodeRef, diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index 94f4029a4d..8fc5fe6a04 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -27,10 +27,10 @@ pub(crate) mod expr_compare; pub(crate) mod expr_constant; pub(crate) mod expr_dict; pub(crate) mod expr_dict_comp; +pub(crate) mod expr_f_string; pub(crate) mod expr_formatted_value; pub(crate) mod expr_generator_exp; pub(crate) mod expr_if_exp; -pub(crate) mod expr_joined_str; pub(crate) mod expr_lambda; pub(crate) mod expr_line_magic; pub(crate) mod expr_list; @@ -93,7 +93,7 @@ impl FormatRule> for FormatExpr { Expr::Compare(expr) => expr.format().with_options(Some(parentheses)).fmt(f), Expr::Call(expr) => expr.format().fmt(f), Expr::FormattedValue(expr) => expr.format().fmt(f), - Expr::JoinedStr(expr) => expr.format().fmt(f), + Expr::FString(expr) => expr.format().fmt(f), Expr::Constant(expr) => expr.format().fmt(f), Expr::Attribute(expr) => expr.format().fmt(f), Expr::Subscript(expr) => expr.format().fmt(f), @@ -231,7 +231,7 @@ impl NeedsParentheses for Expr { Expr::Compare(expr) => expr.needs_parentheses(parent, context), Expr::Call(expr) => expr.needs_parentheses(parent, context), Expr::FormattedValue(expr) => expr.needs_parentheses(parent, context), - Expr::JoinedStr(expr) => expr.needs_parentheses(parent, context), + Expr::FString(expr) => expr.needs_parentheses(parent, context), Expr::Constant(expr) => expr.needs_parentheses(parent, context), Expr::Attribute(expr) => expr.needs_parentheses(parent, context), Expr::Subscript(expr) => expr.needs_parentheses(parent, context), @@ -429,7 +429,7 @@ impl<'input> CanOmitOptionalParenthesesVisitor<'input> { | Expr::Yield(_) | Expr::YieldFrom(_) | Expr::FormattedValue(_) - | Expr::JoinedStr(_) + | Expr::FString(_) | Expr::Constant(_) | Expr::Starred(_) | Expr::Name(_) diff --git a/crates/ruff_python_formatter/src/expression/string.rs b/crates/ruff_python_formatter/src/expression/string.rs index cd52d5a0c5..e147eb8cd5 100644 --- a/crates/ruff_python_formatter/src/expression/string.rs +++ b/crates/ruff_python_formatter/src/expression/string.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; use bitflags::bitflags; use ruff_python_ast::node::AnyNodeRef; -use ruff_python_ast::{self as ast, ExprConstant, ExprJoinedStr, Ranged}; +use ruff_python_ast::{self as ast, ExprConstant, ExprFString, Ranged}; use ruff_python_parser::lexer::{lex_starts_at, LexicalError, LexicalErrorType}; use ruff_python_parser::{Mode, Tok}; use ruff_source_file::Locator; @@ -27,15 +27,15 @@ enum Quoting { pub(super) enum AnyString<'a> { Constant(&'a ExprConstant), - JoinedStr(&'a ExprJoinedStr), + FString(&'a ExprFString), } impl<'a> AnyString<'a> { fn quoting(&self, locator: &Locator) -> Quoting { match self { Self::Constant(_) => Quoting::CanChange, - Self::JoinedStr(joined_str) => { - if joined_str.values.iter().any(|value| match value { + Self::FString(f_string) => { + if f_string.values.iter().any(|value| match value { Expr::FormattedValue(ast::ExprFormattedValue { range, .. }) => { let string_content = locator.slice(*range); string_content.contains(['"', '\'']) @@ -55,7 +55,7 @@ impl Ranged for AnyString<'_> { fn range(&self) -> TextRange { match self { Self::Constant(expr) => expr.range(), - Self::JoinedStr(expr) => expr.range(), + Self::FString(expr) => expr.range(), } } } @@ -64,7 +64,7 @@ impl<'a> From<&AnyString<'a>> for AnyNodeRef<'a> { fn from(value: &AnyString<'a>) -> Self { match value { AnyString::Constant(expr) => AnyNodeRef::ExprConstant(expr), - AnyString::JoinedStr(expr) => AnyNodeRef::ExprJoinedStr(expr), + AnyString::FString(expr) => AnyNodeRef::ExprFString(expr), } } } diff --git a/crates/ruff_python_formatter/src/generated.rs b/crates/ruff_python_formatter/src/generated.rs index 5a71b2d6e9..b5c3e08042 100644 --- a/crates/ruff_python_formatter/src/generated.rs +++ b/crates/ruff_python_formatter/src/generated.rs @@ -1606,38 +1606,38 @@ impl<'ast> IntoFormat> for ast::ExprFormattedValue { } } -impl FormatRule> - for crate::expression::expr_joined_str::FormatExprJoinedStr +impl FormatRule> + for crate::expression::expr_f_string::FormatExprFString { #[inline] - fn fmt(&self, node: &ast::ExprJoinedStr, f: &mut PyFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) + fn fmt(&self, node: &ast::ExprFString, f: &mut PyFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) } } -impl<'ast> AsFormat> for ast::ExprJoinedStr { +impl<'ast> AsFormat> for ast::ExprFString { type Format<'a> = FormatRefWithRule< 'a, - ast::ExprJoinedStr, - crate::expression::expr_joined_str::FormatExprJoinedStr, + ast::ExprFString, + crate::expression::expr_f_string::FormatExprFString, PyFormatContext<'ast>, >; fn format(&self) -> Self::Format<'_> { FormatRefWithRule::new( self, - crate::expression::expr_joined_str::FormatExprJoinedStr::default(), + crate::expression::expr_f_string::FormatExprFString::default(), ) } } -impl<'ast> IntoFormat> for ast::ExprJoinedStr { +impl<'ast> IntoFormat> for ast::ExprFString { type Format = FormatOwnedWithRule< - ast::ExprJoinedStr, - crate::expression::expr_joined_str::FormatExprJoinedStr, + ast::ExprFString, + crate::expression::expr_f_string::FormatExprFString, PyFormatContext<'ast>, >; fn into_format(self) -> Self::Format { FormatOwnedWithRule::new( self, - crate::expression::expr_joined_str::FormatExprJoinedStr::default(), + crate::expression::expr_f_string::FormatExprFString::default(), ) } } diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap index cc110c3f27..939230b0bd 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..14, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..14, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap index 3b349a0b60..7d4e1e0186 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap @@ -79,8 +79,8 @@ expression: parse_ast arguments: Arguments { range: 61..82, args: [ - JoinedStr( - ExprJoinedStr { + FString( + ExprFString { range: 62..81, values: [ Constant( @@ -173,8 +173,8 @@ expression: parse_ast arguments: Arguments { range: 113..134, args: [ - JoinedStr( - ExprJoinedStr { + FString( + ExprFString { range: 114..133, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap index f11ce2f994..089d473452 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap @@ -195,8 +195,8 @@ expression: parse_ast arguments: Arguments { range: 132..180, args: [ - JoinedStr( - ExprJoinedStr { + FString( + ExprFString { range: 133..179, values: [ Constant( @@ -323,8 +323,8 @@ expression: parse_ast arguments: Arguments { range: 212..260, args: [ - JoinedStr( - ExprJoinedStr { + FString( + ExprFString { range: 213..259, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap index 102e64ae26..942f50d6e8 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..22, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..22, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap index 0e906d3f0b..fbaabcce46 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..8, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..8, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap index ff4ea50d1c..4264a83d77 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..8, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..8, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap index 934f1939f6..b88ac0d2e9 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..9, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..9, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap index 5363ceac88..2327df5fcb 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap @@ -21,8 +21,8 @@ expression: parse_ast ), conversion: None, format_spec: Some( - JoinedStr( - ExprJoinedStr { + FString( + ExprFString { range: 9..12, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap index 4f176ac117..dccc5db5fc 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..11, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..11, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap index 5212d6292e..dada3b5a60 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..17, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..17, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap index 5212d6292e..dada3b5a60 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..17, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..17, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap index f634b86a19..a955540697 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..22, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..22, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap index b88ece7331..7d8b5d0f97 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap @@ -16,8 +16,8 @@ expression: parse_ast debug_text: None, conversion: None, format_spec: Some( - JoinedStr( - ExprJoinedStr { + FString( + ExprFString { range: 7..13, values: [ FormattedValue( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap index 98f2635d01..138ba6b187 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap @@ -16,8 +16,8 @@ expression: parse_ast debug_text: None, conversion: None, format_spec: Some( - JoinedStr( - ExprJoinedStr { + FString( + ExprFString { range: 7..11, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap index 51f75d9b69..db31dbe42c 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..18, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..18, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap index 30f7c37ff0..f2cf90b6b6 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..22, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..22, values: [ Constant( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap index 6fcffbfb92..9c98593743 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..7, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..7, values: [ FormattedValue( diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap index 410327f969..8f95a922aa 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap @@ -6,8 +6,8 @@ expression: parse_ast Expr( StmtExpr { range: 0..11, - value: JoinedStr( - ExprJoinedStr { + value: FString( + ExprFString { range: 0..11, values: [ FormattedValue( diff --git a/crates/ruff_python_parser/src/string.rs b/crates/ruff_python_parser/src/string.rs index b6aea76f5d..4c99e64995 100644 --- a/crates/ruff_python_parser/src/string.rs +++ b/crates/ruff_python_parser/src/string.rs @@ -243,7 +243,7 @@ impl<'a> StringParser<'a> { let start_location = self.get_pos(); let parsed_spec = self.parse_spec(nested)?; - spec = Some(Box::new(Expr::from(ast::ExprJoinedStr { + spec = Some(Box::new(Expr::from(ast::ExprFString { values: parsed_spec, range: self.range(start_location), }))); @@ -671,7 +671,7 @@ pub(crate) fn parse_strings( deduped.push(take_current(&mut current, current_start, current_end)); } - Ok(Expr::JoinedStr(ast::ExprJoinedStr { + Ok(Expr::FString(ast::ExprFString { values: deduped, range: TextRange::new(initial_start, last_end), })) diff --git a/crates/ruff_python_semantic/src/analyze/type_inference.rs b/crates/ruff_python_semantic/src/analyze/type_inference.rs index d65b544b2a..225aa71612 100644 --- a/crates/ruff_python_semantic/src/analyze/type_inference.rs +++ b/crates/ruff_python_semantic/src/analyze/type_inference.rs @@ -54,7 +54,7 @@ impl From<&Expr> for PythonType { Expr::ListComp(_) => PythonType::List, Expr::Tuple(_) => PythonType::Tuple, Expr::GeneratorExp(_) => PythonType::Generator, - Expr::JoinedStr(_) => PythonType::String, + Expr::FString(_) => PythonType::String, Expr::BinOp(ast::ExprBinOp { left, op, .. }) => { // Ex) "a" % "b" if op.is_mod() { From a637b8b3a35ac708e7d5abad813671382254c338 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 14:04:56 -0400 Subject: [PATCH 018/155] Fixup comment handling on opening parenthesis in function definition (#6381) ## Summary I noticed some deviations in how we treat dangling comments that hug the opening parenthesis for function definitions. For example, given: ```python def f( # first # second ): # third ... ``` We currently format as: ```python def f( # first # second ): # third ... ``` This PR adds the proper opening-parenthesis dangling comment handling for function parameters. Specifically, as with all other parenthesized nodes, we now detect that dangling comment in `placement.rs` and handle it in `parameters.rs`. We have to take some care in that file, since we have multiple "kinds" of dangling comments, but I added a bunch of test cases that we now format identically to Black. ## Test Plan `cargo test` Before: - `zulip`: 0.99388 - `django`: 0.99784 - `warehouse`: 0.99504 - `transformers`: 0.99404 - `cpython`: 0.75913 - `typeshed`: 0.74364 After: - `zulip`: 0.99386 - `django`: 0.99784 - `warehouse`: 0.99504 - `transformers`: 0.99404 - `cpython`: 0.75913 - `typeshed`: 0.74409 Meaningful improvement on `typeshed`, minor decrease on `zulip`. --- .../test/fixtures/ruff/statement/function.py | 76 +++++++++ .../src/comments/placement.rs | 1 + .../src/other/parameters.rs | 83 ++++++++-- .../format@statement__function.py.snap | 149 ++++++++++++++++++ 4 files changed, 294 insertions(+), 15 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py index 95573170b1..42e643032c 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py @@ -295,3 +295,79 @@ def f(*args, b, **kwds, ): pass def f(*, b, **kwds, ): pass def f(a, *args, b, **kwds, ): pass def f(a, *, b, **kwds, ): pass + +# Handle comments on open parenthesis. +def f( + # first + # second +): + ... + + +def f( # first + # second +): # third + ... + + +def f( # first +): # second + ... + + +def f( + a, + /, + # first + b + # second +): + ... + + +def f( # first + *, + # second + b + # third +): + ... + + +def f( # first + # second + *, + # third + b + # fourth +): + ... + + +def f( # first + a, + # second +): # third + ... + + +def f( # first + a +): # second + ... + + +def f( # first + a + # second +): # third + ... + + +def f( # first + a, + / # second + , + # third +): + ... diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 728ea3e7ca..79c56ca277 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -32,6 +32,7 @@ pub(super) fn place_comment<'a>( comment.or_else(|comment| match comment.enclosing_node() { AnyNodeRef::Parameters(arguments) => { handle_parameters_separator_comment(comment, arguments, locator) + .or_else(|comment| handle_bracketed_end_of_line_comment(comment, locator)) } AnyNodeRef::Arguments(_) | AnyNodeRef::TypeParams(_) => { handle_bracketed_end_of_line_comment(comment, locator) diff --git a/crates/ruff_python_formatter/src/other/parameters.rs b/crates/ruff_python_formatter/src/other/parameters.rs index 950f6dcaf9..b9daee7721 100644 --- a/crates/ruff_python_formatter/src/other/parameters.rs +++ b/crates/ruff_python_formatter/src/other/parameters.rs @@ -1,18 +1,17 @@ use std::usize; -use ruff_python_ast::{Parameters, Ranged}; -use ruff_text_size::{TextRange, TextSize}; - use ruff_formatter::{format_args, write, FormatRuleWithOptions}; use ruff_python_ast::node::{AnyNodeRef, AstNode}; +use ruff_python_ast::{Parameters, Ranged}; use ruff_python_trivia::{SimpleToken, SimpleTokenKind, SimpleTokenizer}; +use ruff_text_size::{TextRange, TextSize}; +use crate::builders::empty_parenthesized_with_dangling_comments; use crate::comments::{ - dangling_comments, leading_comments, leading_node_comments, trailing_comments, - CommentLinePosition, SourceComment, + leading_comments, leading_node_comments, trailing_comments, CommentLinePosition, SourceComment, }; use crate::context::{NodeLevel, WithNodeLevel}; -use crate::expression::parentheses::parenthesized; +use crate::expression::parentheses::parenthesized_with_dangling_comments; use crate::prelude::*; use crate::FormatNodeRule; @@ -61,9 +60,47 @@ impl FormatNodeRule for FormatParameters { kwarg, } = item; + let (slash, star) = find_argument_separators(f.context().source(), item); + let comments = f.context().comments().clone(); let dangling = comments.dangling_comments(item); - let (slash, star) = find_argument_separators(f.context().source(), item); + + // First dangling comment: trailing the opening parenthesis, e.g.: + // ```python + // def f( # comment + // x, + // y, + // z, + // ): ... + // TODO(charlie): We already identified this comment as such in placement.rs. Consider + // labeling it as such. See: https://github.com/astral-sh/ruff/issues/5247. + let parenthesis_comments_end = usize::from(dangling.first().is_some_and(|comment| { + if comment.line_position().is_end_of_line() { + // Ensure that there are no tokens between the open bracket and the comment. + let mut lexer = SimpleTokenizer::new( + f.context().source(), + TextRange::new(item.start(), comment.start()), + ) + .skip_trivia() + .skip_while(|t| { + matches!( + t.kind(), + SimpleTokenKind::LParen + | SimpleTokenKind::LBrace + | SimpleTokenKind::LBracket + ) + }); + if lexer.next().is_none() { + return true; + } + } + false + })); + + // Separate into (dangling comments on the open parenthesis) and (dangling comments on the + // argument separators, e.g., `*` or `/`). + let (parenthesis_dangling, parameters_dangling) = + dangling.split_at(parenthesis_comments_end); let format_inner = format_with(|f: &mut PyFormatter| { let separator = format_with(|f| write!(f, [text(","), soft_line_break_or_space()])); @@ -76,10 +113,18 @@ impl FormatNodeRule for FormatParameters { last_node = Some(parameter_with_default.into()); } + // Second dangling comment: trailing the slash, e.g.: + // ```python + // def f( + // x, + // /, # comment + // y, + // z, + // ): ... let slash_comments_end = if posonlyargs.is_empty() { 0 } else { - let slash_comments_end = dangling.partition_point(|comment| { + let slash_comments_end = parameters_dangling.partition_point(|comment| { let assignment = assign_argument_separator_comment_placement( slash.as_ref(), star.as_ref(), @@ -95,7 +140,7 @@ impl FormatNodeRule for FormatParameters { }); joiner.entry(&CommentsAroundText { text: "/", - comments: &dangling[..slash_comments_end], + comments: ¶meters_dangling[..slash_comments_end], }); slash_comments_end }; @@ -135,7 +180,7 @@ impl FormatNodeRule for FormatParameters { // ``` joiner.entry(&CommentsAroundText { text: "*", - comments: &dangling[slash_comments_end..], + comments: ¶meters_dangling[slash_comments_end..], }); } @@ -202,14 +247,22 @@ impl FormatNodeRule for FormatParameters { // No parameters, format any dangling comments between `()` write!( f, - [ + [empty_parenthesized_with_dangling_comments( text("("), - block_indent(&dangling_comments(dangling)), - text(")") - ] + dangling, + text(")"), + )] ) } else { - write!(f, [parenthesized("(", &group(&format_inner), ")")]) + write!( + f, + [parenthesized_with_dangling_comments( + "(", + parenthesis_dangling, + &group(&format_inner), + ")" + )] + ) } } diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index 9b0021e5ad..8a7676fce9 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -301,6 +301,82 @@ def f(*args, b, **kwds, ): pass def f(*, b, **kwds, ): pass def f(a, *args, b, **kwds, ): pass def f(a, *, b, **kwds, ): pass + +# Handle comments on open parenthesis. +def f( + # first + # second +): + ... + + +def f( # first + # second +): # third + ... + + +def f( # first +): # second + ... + + +def f( + a, + /, + # first + b + # second +): + ... + + +def f( # first + *, + # second + b + # third +): + ... + + +def f( # first + # second + *, + # third + b + # fourth +): + ... + + +def f( # first + a, + # second +): # third + ... + + +def f( # first + a +): # second + ... + + +def f( # first + a + # second +): # third + ... + + +def f( # first + a, + / # second + , + # third +): + ... ``` ## Output @@ -753,6 +829,79 @@ def f( **kwds, ): pass + + +# Handle comments on open parenthesis. +def f( + # first + # second +): + ... + + +def f( # first + # second +): # third + ... + + +def f(): # first # second + ... + + +def f( + a, + /, + # first + b, + # second +): + ... + + +def f( # first + *, + # second + b, + # third +): + ... + + +def f( # first + # second + *, + # third + b, + # fourth +): + ... + + +def f( # first + a, + # second +): # third + ... + + +def f(a): # first # second + ... + + +def f( # first + a, + # second +): # third + ... + + +def f( # first + a, + # third + /, # second +): + ... ``` From df1591b3c2e26d61364b95226a4bb86778020bb9 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 14:33:18 -0400 Subject: [PATCH 019/155] Remove outdated TODO (#6400) See: https://github.com/astral-sh/ruff/pull/6376#discussion_r1285539278. --- crates/ruff_python_formatter/src/other/arguments.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/ruff_python_formatter/src/other/arguments.rs b/crates/ruff_python_formatter/src/other/arguments.rs index 05dfa5e347..fb19204624 100644 --- a/crates/ruff_python_formatter/src/other/arguments.rs +++ b/crates/ruff_python_formatter/src/other/arguments.rs @@ -85,7 +85,7 @@ impl FormatNodeRule for FormatArguments { write!( f, [ - // The outer group is for things like + // The outer group is for things like: // ```python // get_collection( // hey_this_is_a_very_long_call, @@ -100,7 +100,6 @@ impl FormatNodeRule for FormatArguments { // hey_this_is_a_very_long_call, it_has_funny_attributes_asdf_asdf, really=True // ) // ``` - // TODO(konstin): Doesn't work see wrongly formatted test parenthesized_with_dangling_comments( "(", dangling_comments, From bb96647d66cca43836dad8298b0cf5491990f734 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 7 Aug 2023 13:48:06 -0500 Subject: [PATCH 020/155] Assume Python 3.8 instead of 3.10 for target version (#6397) The target version should be the oldest supported version instead of an arbitary version. Since 3.7 is EOL, we should use 3.8. I would like to follow this up with more comprehensive default detection based on the environment. --- BREAKING_CHANGES.md | 8 ++++++++ README.md | 4 ++-- docs/configuration.md | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/BREAKING_CHANGES.md b/BREAKING_CHANGES.md index f8c7b7913b..8c68d5ccc2 100644 --- a/BREAKING_CHANGES.md +++ b/BREAKING_CHANGES.md @@ -1,5 +1,13 @@ # Breaking Changes +## 0.0.283 + +### The target Python version now defaults to 3.8 instead of 3.10 ([#6397](https://github.com/astral-sh/ruff/pull/6397)) + +Previously, when a target Python version was not specified, Ruff would use a default of Python 3.10. However, it is safer to default to an _older_ Python version to avoid assuming the availability of new features. We now default to the oldest supported Python version which is currently Python 3.8. + +(We still support Python 3.7 but since [it has reached EOL](https://devguide.python.org/versions/#unsupported-versions) we've decided not to make it the default here.) + ## 0.0.277 ### `.ipynb_checkpoints`, `.pyenv`, `.pytest_cache`, and `.vscode` are now excluded by default ([#5513](https://github.com/astral-sh/ruff/pull/5513)) diff --git a/README.md b/README.md index 67ac480f6a..bfd3268516 100644 --- a/README.md +++ b/README.md @@ -211,8 +211,8 @@ line-length = 88 # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" -# Assume Python 3.10. -target-version = "py310" +# Assume Python 3.8 +target-version = "py38" [tool.ruff.mccabe] # Unlike Flake8, default to a complexity level of 10. diff --git a/docs/configuration.md b/docs/configuration.md index 25b151cf5f..c587f5ee07 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -53,8 +53,8 @@ line-length = 88 # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" -# Assume Python 3.10. -target-version = "py310" +# Assume Python 3.8 +target-version = "py38" ``` As an example, the following would configure Ruff to: (1) enforce flake8-bugbear rules, in addition From 8919b6ad9ae36a43c75927e3f0e3ae1ec3992fc5 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 15:12:12 -0400 Subject: [PATCH 021/155] Add a `with_dangling_comments` to the parenthesized formatter (#6402) See: https://github.com/astral-sh/ruff/pull/6376#discussion_r1285514328. --- .../src/expression/expr_dict.rs | 8 ++-- .../src/expression/expr_dict_comp.rs | 10 ++--- .../src/expression/expr_generator_exp.rs | 9 ++--- .../src/expression/expr_list.rs | 8 ++-- .../src/expression/expr_list_comp.rs | 10 ++--- .../src/expression/expr_set.rs | 8 ++-- .../src/expression/expr_set_comp.rs | 10 ++--- .../src/expression/expr_tuple.rs | 22 ++++------- .../src/expression/parentheses.rs | 37 +++++++++---------- .../src/other/arguments.rs | 10 ++--- .../src/other/parameters.rs | 10 ++--- 11 files changed, 60 insertions(+), 82 deletions(-) diff --git a/crates/ruff_python_formatter/src/expression/expr_dict.rs b/crates/ruff_python_formatter/src/expression/expr_dict.rs index f55c02dd20..2cd41626ed 100644 --- a/crates/ruff_python_formatter/src/expression/expr_dict.rs +++ b/crates/ruff_python_formatter/src/expression/expr_dict.rs @@ -6,9 +6,7 @@ use ruff_text_size::TextRange; use crate::builders::empty_parenthesized_with_dangling_comments; use crate::comments::leading_comments; -use crate::expression::parentheses::{ - parenthesized_with_dangling_comments, NeedsParentheses, OptionalParentheses, -}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; use crate::FormatNodeRule; @@ -86,7 +84,9 @@ impl FormatNodeRule for FormatExprDict { joiner.finish() }); - parenthesized_with_dangling_comments("{", dangling, &format_pairs, "}").fmt(f) + parenthesized("{", &format_pairs, "}") + .with_dangling_comments(dangling) + .fmt(f) } fn fmt_dangling_comments(&self, _node: &ExprDict, _f: &mut PyFormatter) -> FormatResult<()> { diff --git a/crates/ruff_python_formatter/src/expression/expr_dict_comp.rs b/crates/ruff_python_formatter/src/expression/expr_dict_comp.rs index a89565018d..e16d2e1900 100644 --- a/crates/ruff_python_formatter/src/expression/expr_dict_comp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_dict_comp.rs @@ -6,9 +6,7 @@ use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprDictComp; use crate::context::PyFormatContext; -use crate::expression::parentheses::{ - parenthesized_with_dangling_comments, NeedsParentheses, OptionalParentheses, -}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::AsFormat; use crate::{FormatNodeRule, FormattedIterExt, PyFormatter}; @@ -35,9 +33,8 @@ impl FormatNodeRule for FormatExprDictComp { write!( f, - [parenthesized_with_dangling_comments( + [parenthesized( "{", - dangling, &group(&format_args!( group(&key.format()), text(":"), @@ -47,7 +44,8 @@ impl FormatNodeRule for FormatExprDictComp { &joined )), "}" - )] + ) + .with_dangling_comments(dangling)] ) } } diff --git a/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs b/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs index e9c967e95b..f99773fabc 100644 --- a/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs @@ -4,8 +4,7 @@ use ruff_python_ast::ExprGeneratorExp; use crate::comments::leading_comments; use crate::context::PyFormatContext; -use crate::expression::parentheses::parenthesized_with_dangling_comments; -use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; use crate::AsFormat; use crate::{FormatNodeRule, PyFormatter}; @@ -66,16 +65,16 @@ impl FormatNodeRule for FormatExprGeneratorExp { } else { write!( f, - [parenthesized_with_dangling_comments( + [parenthesized( "(", - dangling, &group(&format_args!( group(&elt.format()), soft_line_break_or_space(), &joined )), ")" - )] + ) + .with_dangling_comments(dangling)] ) } } diff --git a/crates/ruff_python_formatter/src/expression/expr_list.rs b/crates/ruff_python_formatter/src/expression/expr_list.rs index 73482f3814..89ef07bcd6 100644 --- a/crates/ruff_python_formatter/src/expression/expr_list.rs +++ b/crates/ruff_python_formatter/src/expression/expr_list.rs @@ -3,9 +3,7 @@ use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{ExprList, Ranged}; use crate::builders::empty_parenthesized_with_dangling_comments; -use crate::expression::parentheses::{ - parenthesized_with_dangling_comments, NeedsParentheses, OptionalParentheses, -}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; use crate::FormatNodeRule; @@ -34,7 +32,9 @@ impl FormatNodeRule for FormatExprList { .finish() }); - parenthesized_with_dangling_comments("[", dangling, &items, "]").fmt(f) + parenthesized("[", &items, "]") + .with_dangling_comments(dangling) + .fmt(f) } fn fmt_dangling_comments(&self, _node: &ExprList, _f: &mut PyFormatter) -> FormatResult<()> { diff --git a/crates/ruff_python_formatter/src/expression/expr_list_comp.rs b/crates/ruff_python_formatter/src/expression/expr_list_comp.rs index bc557bb581..a5476e4b82 100644 --- a/crates/ruff_python_formatter/src/expression/expr_list_comp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_list_comp.rs @@ -3,9 +3,7 @@ use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprListComp; use crate::context::PyFormatContext; -use crate::expression::parentheses::{ - parenthesized_with_dangling_comments, NeedsParentheses, OptionalParentheses, -}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; use crate::AsFormat; use crate::{FormatNodeRule, PyFormatter}; @@ -32,16 +30,16 @@ impl FormatNodeRule for FormatExprListComp { write!( f, - [parenthesized_with_dangling_comments( + [parenthesized( "[", - dangling, &group(&format_args![ group(&elt.format()), soft_line_break_or_space(), &joined ]), "]" - )] + ) + .with_dangling_comments(dangling)] ) } diff --git a/crates/ruff_python_formatter/src/expression/expr_set.rs b/crates/ruff_python_formatter/src/expression/expr_set.rs index 66795cb1a9..4259be8049 100644 --- a/crates/ruff_python_formatter/src/expression/expr_set.rs +++ b/crates/ruff_python_formatter/src/expression/expr_set.rs @@ -1,9 +1,7 @@ use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{ExprSet, Ranged}; -use crate::expression::parentheses::{ - parenthesized_with_dangling_comments, NeedsParentheses, OptionalParentheses, -}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; use crate::FormatNodeRule; @@ -25,7 +23,9 @@ impl FormatNodeRule for FormatExprSet { let comments = f.context().comments().clone(); let dangling = comments.dangling_comments(item); - parenthesized_with_dangling_comments("{", dangling, &joined, "}").fmt(f) + parenthesized("{", &joined, "}") + .with_dangling_comments(dangling) + .fmt(f) } fn fmt_dangling_comments(&self, _node: &ExprSet, _f: &mut PyFormatter) -> FormatResult<()> { diff --git a/crates/ruff_python_formatter/src/expression/expr_set_comp.rs b/crates/ruff_python_formatter/src/expression/expr_set_comp.rs index a5acbbd6f2..5e3247a249 100644 --- a/crates/ruff_python_formatter/src/expression/expr_set_comp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_set_comp.rs @@ -3,9 +3,7 @@ use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprSetComp; use crate::context::PyFormatContext; -use crate::expression::parentheses::{ - parenthesized_with_dangling_comments, NeedsParentheses, OptionalParentheses, -}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; use crate::AsFormat; use crate::{FormatNodeRule, PyFormatter}; @@ -32,16 +30,16 @@ impl FormatNodeRule for FormatExprSetComp { write!( f, - [parenthesized_with_dangling_comments( + [parenthesized( "{", - dangling, &group(&format_args!( group(&elt.format()), soft_line_break_or_space(), &joined )), "}" - )] + ) + .with_dangling_comments(dangling)] ) } diff --git a/crates/ruff_python_formatter/src/expression/expr_tuple.rs b/crates/ruff_python_formatter/src/expression/expr_tuple.rs index a2e2af857c..da21a5a21f 100644 --- a/crates/ruff_python_formatter/src/expression/expr_tuple.rs +++ b/crates/ruff_python_formatter/src/expression/expr_tuple.rs @@ -1,14 +1,11 @@ +use ruff_formatter::{format_args, write, FormatRuleWithOptions}; +use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprTuple; use ruff_python_ast::{Expr, Ranged}; use ruff_text_size::TextRange; -use ruff_formatter::{format_args, write, FormatRuleWithOptions}; -use ruff_python_ast::node::AnyNodeRef; - use crate::builders::{empty_parenthesized_with_dangling_comments, parenthesize_if_expands}; -use crate::expression::parentheses::{ - parenthesized_with_dangling_comments, NeedsParentheses, OptionalParentheses, -}; +use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; #[derive(Eq, PartialEq, Debug, Default)] @@ -132,13 +129,9 @@ impl FormatNodeRule for FormatExprTuple { _ => // A single element tuple always needs parentheses and a trailing comma, except when inside of a subscript { - parenthesized_with_dangling_comments( - "(", - dangling, - &format_args![single.format(), text(",")], - ")", - ) - .fmt(f) + parenthesized("(", &format_args![single.format(), text(",")], ")") + .with_dangling_comments(dangling) + .fmt(f) } }, // If the tuple has parentheses, we generally want to keep them. The exception are for @@ -150,7 +143,8 @@ impl FormatNodeRule for FormatExprTuple { && !(self.parentheses == TupleParentheses::NeverPreserve && dangling.is_empty()) => { - parenthesized_with_dangling_comments("(", dangling, &ExprSequence::new(item), ")") + parenthesized("(", &ExprSequence::new(item), ")") + .with_dangling_comments(dangling) .fmt(f) } _ => match self.parentheses { diff --git a/crates/ruff_python_formatter/src/expression/parentheses.rs b/crates/ruff_python_formatter/src/expression/parentheses.rs index cc61902ce9..9e72231172 100644 --- a/crates/ruff_python_formatter/src/expression/parentheses.rs +++ b/crates/ruff_python_formatter/src/expression/parentheses.rs @@ -116,25 +116,6 @@ where } } -/// Formats `content` enclosed by the `left` and `right` parentheses, along with any dangling -/// comments on the opening parenthesis itself. -pub(crate) fn parenthesized_with_dangling_comments<'content, 'ast, Content>( - left: &'static str, - comments: &'content [SourceComment], - content: &'content Content, - right: &'static str, -) -> FormatParenthesized<'content, 'ast> -where - Content: Format>, -{ - FormatParenthesized { - left, - comments, - content: Argument::new(content), - right, - } -} - pub(crate) struct FormatParenthesized<'content, 'ast> { left: &'static str, comments: &'content [SourceComment], @@ -142,6 +123,24 @@ pub(crate) struct FormatParenthesized<'content, 'ast> { right: &'static str, } +impl<'content, 'ast> FormatParenthesized<'content, 'ast> { + /// Inserts any dangling comments that should be placed immediately after the open parenthesis. + /// For example: + /// ```python + /// [ # comment + /// 1, + /// 2, + /// 3, + /// ] + /// ``` + pub(crate) fn with_dangling_comments( + self, + comments: &'content [SourceComment], + ) -> FormatParenthesized<'content, 'ast> { + FormatParenthesized { comments, ..self } + } +} + impl<'ast> Format> for FormatParenthesized<'_, 'ast> { fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> { let inner = format_with(|f| { diff --git a/crates/ruff_python_formatter/src/other/arguments.rs b/crates/ruff_python_formatter/src/other/arguments.rs index fb19204624..291dd9159e 100644 --- a/crates/ruff_python_formatter/src/other/arguments.rs +++ b/crates/ruff_python_formatter/src/other/arguments.rs @@ -6,7 +6,7 @@ use ruff_text_size::{TextRange, TextSize}; use crate::builders::empty_parenthesized_with_dangling_comments; use crate::expression::expr_generator_exp::GeneratorExpParentheses; -use crate::expression::parentheses::{parenthesized_with_dangling_comments, Parentheses}; +use crate::expression::parentheses::{parenthesized, Parentheses}; use crate::prelude::*; use crate::FormatNodeRule; @@ -100,12 +100,8 @@ impl FormatNodeRule for FormatArguments { // hey_this_is_a_very_long_call, it_has_funny_attributes_asdf_asdf, really=True // ) // ``` - parenthesized_with_dangling_comments( - "(", - dangling_comments, - &group(&all_arguments), - ")" - ) + parenthesized("(", &group(&all_arguments), ")") + .with_dangling_comments(dangling_comments) ] ) } diff --git a/crates/ruff_python_formatter/src/other/parameters.rs b/crates/ruff_python_formatter/src/other/parameters.rs index b9daee7721..a9e8aa16af 100644 --- a/crates/ruff_python_formatter/src/other/parameters.rs +++ b/crates/ruff_python_formatter/src/other/parameters.rs @@ -11,7 +11,7 @@ use crate::comments::{ leading_comments, leading_node_comments, trailing_comments, CommentLinePosition, SourceComment, }; use crate::context::{NodeLevel, WithNodeLevel}; -use crate::expression::parentheses::parenthesized_with_dangling_comments; +use crate::expression::parentheses::parenthesized; use crate::prelude::*; use crate::FormatNodeRule; @@ -256,12 +256,8 @@ impl FormatNodeRule for FormatParameters { } else { write!( f, - [parenthesized_with_dangling_comments( - "(", - parenthesis_dangling, - &group(&format_inner), - ")" - )] + [parenthesized("(", &group(&format_inner), ")") + .with_dangling_comments(parenthesis_dangling)] ) } } From 98d4657961d9c70a3909b026c5c4abf26ec1f0de Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 15:13:22 -0400 Subject: [PATCH 022/155] Avoid attempting to fix `.format(...)` calls with too-few-arguments (#6401) ## Summary We can anticipate earlier that this will error, so we should avoid flagging the error at all. Specifically, we're talking about cases like `"{1} {0}".format(*args)"`, in which we'd need to reorder the arguments in order to remove the `1` and `0`, but we _can't_ reorder the arguments since they're not statically analyzable. Closes https://github.com/astral-sh/ruff/issues/6388. --- .../test/fixtures/pyupgrade/UP030_0.py | 27 ++ .../test/fixtures/pyupgrade/UP030_1.py | 14 + .../test/fixtures/pyupgrade/UP030_2.py | 28 -- .../src/checkers/ast/analyze/expression.rs | 2 +- crates/ruff/src/rules/pyupgrade/mod.rs | 1 - .../rules/pyupgrade/rules/format_literals.rs | 124 ++++++--- ...__rules__pyupgrade__tests__UP030_0.py.snap | 248 ++++++++++++++++++ ...__rules__pyupgrade__tests__UP030_2.py.snap | 240 ----------------- 8 files changed, 374 insertions(+), 310 deletions(-) delete mode 100644 crates/ruff/resources/test/fixtures/pyupgrade/UP030_2.py delete mode 100644 crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_2.py.snap diff --git a/crates/ruff/resources/test/fixtures/pyupgrade/UP030_0.py b/crates/ruff/resources/test/fixtures/pyupgrade/UP030_0.py index 35b85eb3cc..37e3ba4d49 100644 --- a/crates/ruff/resources/test/fixtures/pyupgrade/UP030_0.py +++ b/crates/ruff/resources/test/fixtures/pyupgrade/UP030_0.py @@ -32,3 +32,30 @@ print( ) '{' '0}'.format(1) + +args = list(range(10)) +kwargs = {x: x for x in range(10)} + +"{0}".format(*args) + +"{0}".format(**kwargs) + +"{0}_{1}".format(*args) + +"{0}_{1}".format(1, *args) + +"{0}_{1}".format(1, 2, *args) + +"{0}_{1}".format(*args, 1, 2) + +"{0}_{1}_{2}".format(1, **kwargs) + +"{0}_{1}_{2}".format(1, 2, **kwargs) + +"{0}_{1}_{2}".format(1, 2, 3, **kwargs) + +"{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) + +"{1}_{0}".format(1, 2, *args) + +"{1}_{0}".format(1, 2) diff --git a/crates/ruff/resources/test/fixtures/pyupgrade/UP030_1.py b/crates/ruff/resources/test/fixtures/pyupgrade/UP030_1.py index 85fcf311f5..5cb750ece9 100644 --- a/crates/ruff/resources/test/fixtures/pyupgrade/UP030_1.py +++ b/crates/ruff/resources/test/fixtures/pyupgrade/UP030_1.py @@ -15,3 +15,17 @@ f"{0}".format(1) print(f"{0}".format(1)) ''.format(1) + +'{1} {0}'.format(*args) + +"{1}_{0}".format(*args, 1) + +"{1}_{0}".format(*args, 1, 2) + +"{1}_{0}".format(1, **kwargs) + +"{1}_{0}".format(1, foo=2) + +"{1}_{0}".format(1, 2, **kwargs) + +"{1}_{0}".format(1, 2, foo=3, bar=4) diff --git a/crates/ruff/resources/test/fixtures/pyupgrade/UP030_2.py b/crates/ruff/resources/test/fixtures/pyupgrade/UP030_2.py deleted file mode 100644 index 30f2d0c886..0000000000 --- a/crates/ruff/resources/test/fixtures/pyupgrade/UP030_2.py +++ /dev/null @@ -1,28 +0,0 @@ -# These SHOULD change - -args = list(range(10)) -kwargs = {x: x for x in range(10)} - -"{0}".format(*args) - -"{0}".format(**kwargs) - -"{0}_{1}".format(*args) - -"{0}_{1}".format(1, *args) - -"{1}_{0}".format(*args) - -"{1}_{0}".format(1, *args) - -"{0}_{1}".format(1, 2, *args) - -"{0}_{1}".format(*args, 1, 2) - -"{0}_{1}_{2}".format(1, **kwargs) - -"{0}_{1}_{2}".format(1, 2, **kwargs) - -"{0}_{1}_{2}".format(1, 2, 3, **kwargs) - -"{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index ae29ce56f5..e47b871f77 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -410,7 +410,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { ); } if checker.enabled(Rule::FormatLiterals) { - pyupgrade::rules::format_literals(checker, &summary, expr); + pyupgrade::rules::format_literals(checker, &summary, call); } if checker.enabled(Rule::FString) { pyupgrade::rules::f_strings( diff --git a/crates/ruff/src/rules/pyupgrade/mod.rs b/crates/ruff/src/rules/pyupgrade/mod.rs index 7ffeb2b116..9e2f633ba0 100644 --- a/crates/ruff/src/rules/pyupgrade/mod.rs +++ b/crates/ruff/src/rules/pyupgrade/mod.rs @@ -30,7 +30,6 @@ mod tests { #[test_case(Rule::FString, Path::new("UP032_2.py"))] #[test_case(Rule::FormatLiterals, Path::new("UP030_0.py"))] #[test_case(Rule::FormatLiterals, Path::new("UP030_1.py"))] - #[test_case(Rule::FormatLiterals, Path::new("UP030_2.py"))] #[test_case(Rule::LRUCacheWithMaxsizeNone, Path::new("UP033_0.py"))] #[test_case(Rule::LRUCacheWithMaxsizeNone, Path::new("UP033_1.py"))] #[test_case(Rule::LRUCacheWithoutParameters, Path::new("UP011.py"))] diff --git a/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs b/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs index 1469cb7e74..360e8b855f 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs @@ -2,7 +2,7 @@ use anyhow::{anyhow, Result}; use libcst_native::{Arg, Expression}; use once_cell::sync::Lazy; use regex::Regex; -use ruff_python_ast::{Expr, Ranged}; +use ruff_python_ast::{self as ast, Expr, Ranged}; use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; @@ -55,6 +55,77 @@ impl Violation for FormatLiterals { } } +/// UP030 +pub(crate) fn format_literals( + checker: &mut Checker, + summary: &FormatSummary, + call: &ast::ExprCall, +) { + // The format we expect is, e.g.: `"{0} {1}".format(...)` + if summary.has_nested_parts { + return; + } + if !summary.keywords.is_empty() { + return; + } + if !summary.autos.is_empty() { + return; + } + if summary.indices.is_empty() { + return; + } + if (0..summary.indices.len()).any(|index| !summary.indices.contains(&index)) { + return; + } + + // If the positional indices aren't sequential (e.g., `"{1} {0}".format(1, 2)`), then we + // need to reorder the function arguments; so we need to ensure that the function + // arguments aren't splatted (e.g., `"{1} {0}".format(*foo)`), that there are a sufficient + // number of them, etc. + let arguments = if is_sequential(&summary.indices) { + Arguments::Preserve + } else { + // Ex) `"{1} {0}".format(foo=1, bar=2)` + if !call.arguments.keywords.is_empty() { + return; + } + + // Ex) `"{1} {0}".format(foo)` + if call.arguments.args.len() < summary.indices.len() { + return; + } + + // Ex) `"{1} {0}".format(*foo)` + if call + .arguments + .args + .iter() + .take(summary.indices.len()) + .any(Expr::is_starred_expr) + { + return; + } + + Arguments::Reorder(&summary.indices) + }; + + let mut diagnostic = Diagnostic::new(FormatLiterals, call.range()); + if checker.patch(diagnostic.kind.rule()) { + diagnostic.try_set_fix(|| { + Ok(Fix::suggested(Edit::range_replacement( + generate_call(call, arguments, checker.locator(), checker.stylist())?, + call.range(), + ))) + }); + } + checker.diagnostics.push(diagnostic); +} + +/// Returns true if the indices are sequential. +fn is_sequential(indices: &[usize]) -> bool { + indices.iter().enumerate().all(|(idx, value)| idx == *value) +} + // An opening curly brace, followed by any integer, followed by any text, // followed by a closing brace. static FORMAT_SPECIFIER: Lazy = @@ -118,26 +189,30 @@ fn generate_arguments<'a>(arguments: &[Arg<'a>], order: &'a [usize]) -> Result bool { - indices.iter().enumerate().all(|(idx, value)| idx == *value) +#[derive(Debug, Copy, Clone)] +enum Arguments<'a> { + /// Preserve the arguments to the `.format(...)` call. + Preserve, + /// Reorder the arguments to the `.format(...)` call, based on the given + /// indices. + Reorder(&'a [usize]), } /// Returns the corrected function call. fn generate_call( - expr: &Expr, - correct_order: &[usize], + call: &ast::ExprCall, + arguments: Arguments, locator: &Locator, stylist: &Stylist, ) -> Result { - let content = locator.slice(expr.range()); + let content = locator.slice(call.range()); let parenthesized_content = format!("({content})"); let mut expression = match_expression(&parenthesized_content)?; // Fix the call arguments. let call = match_call_mut(&mut expression)?; - if !is_sequential(correct_order) { - call.args = generate_arguments(&call.args, correct_order)?; + if let Arguments::Reorder(order) = arguments { + call.args = generate_arguments(&call.args, order)?; } // Fix the string itself. @@ -157,34 +232,3 @@ fn generate_call( Ok(output) } - -/// UP030 -pub(crate) fn format_literals(checker: &mut Checker, summary: &FormatSummary, expr: &Expr) { - // The format we expect is, e.g.: `"{0} {1}".format(...)` - if summary.has_nested_parts { - return; - } - if !summary.keywords.is_empty() { - return; - } - if !summary.autos.is_empty() { - return; - } - if summary.indices.is_empty() { - return; - } - if (0..summary.indices.len()).any(|index| !summary.indices.contains(&index)) { - return; - } - - let mut diagnostic = Diagnostic::new(FormatLiterals, expr.range()); - if checker.patch(diagnostic.kind.rule()) { - diagnostic.try_set_fix(|| { - Ok(Fix::suggested(Edit::range_replacement( - generate_call(expr, &summary.indices, checker.locator(), checker.stylist())?, - expr.range(), - ))) - }); - } - checker.diagnostics.push(diagnostic); -} diff --git a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_0.py.snap b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_0.py.snap index 393bdb502c..a0b8e1a467 100644 --- a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_0.py.snap +++ b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_0.py.snap @@ -249,7 +249,255 @@ UP030_0.py:34:1: UP030 Use implicit references for positional format fields 33 | 34 | '{' '0}'.format(1) | ^^^^^^^^^^^^^^^^^^ UP030 +35 | +36 | args = list(range(10)) | = help: Remove explicit positional indices +UP030_0.py:39:1: UP030 [*] Use implicit references for positional format fields + | +37 | kwargs = {x: x for x in range(10)} +38 | +39 | "{0}".format(*args) + | ^^^^^^^^^^^^^^^^^^^ UP030 +40 | +41 | "{0}".format(**kwargs) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +36 36 | args = list(range(10)) +37 37 | kwargs = {x: x for x in range(10)} +38 38 | +39 |-"{0}".format(*args) + 39 |+"{}".format(*args) +40 40 | +41 41 | "{0}".format(**kwargs) +42 42 | + +UP030_0.py:41:1: UP030 [*] Use implicit references for positional format fields + | +39 | "{0}".format(*args) +40 | +41 | "{0}".format(**kwargs) + | ^^^^^^^^^^^^^^^^^^^^^^ UP030 +42 | +43 | "{0}_{1}".format(*args) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +38 38 | +39 39 | "{0}".format(*args) +40 40 | +41 |-"{0}".format(**kwargs) + 41 |+"{}".format(**kwargs) +42 42 | +43 43 | "{0}_{1}".format(*args) +44 44 | + +UP030_0.py:43:1: UP030 [*] Use implicit references for positional format fields + | +41 | "{0}".format(**kwargs) +42 | +43 | "{0}_{1}".format(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^ UP030 +44 | +45 | "{0}_{1}".format(1, *args) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +40 40 | +41 41 | "{0}".format(**kwargs) +42 42 | +43 |-"{0}_{1}".format(*args) + 43 |+"{}_{}".format(*args) +44 44 | +45 45 | "{0}_{1}".format(1, *args) +46 46 | + +UP030_0.py:45:1: UP030 [*] Use implicit references for positional format fields + | +43 | "{0}_{1}".format(*args) +44 | +45 | "{0}_{1}".format(1, *args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +46 | +47 | "{0}_{1}".format(1, 2, *args) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +42 42 | +43 43 | "{0}_{1}".format(*args) +44 44 | +45 |-"{0}_{1}".format(1, *args) + 45 |+"{}_{}".format(1, *args) +46 46 | +47 47 | "{0}_{1}".format(1, 2, *args) +48 48 | + +UP030_0.py:47:1: UP030 [*] Use implicit references for positional format fields + | +45 | "{0}_{1}".format(1, *args) +46 | +47 | "{0}_{1}".format(1, 2, *args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +48 | +49 | "{0}_{1}".format(*args, 1, 2) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +44 44 | +45 45 | "{0}_{1}".format(1, *args) +46 46 | +47 |-"{0}_{1}".format(1, 2, *args) + 47 |+"{}_{}".format(1, 2, *args) +48 48 | +49 49 | "{0}_{1}".format(*args, 1, 2) +50 50 | + +UP030_0.py:49:1: UP030 [*] Use implicit references for positional format fields + | +47 | "{0}_{1}".format(1, 2, *args) +48 | +49 | "{0}_{1}".format(*args, 1, 2) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +50 | +51 | "{0}_{1}_{2}".format(1, **kwargs) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +46 46 | +47 47 | "{0}_{1}".format(1, 2, *args) +48 48 | +49 |-"{0}_{1}".format(*args, 1, 2) + 49 |+"{}_{}".format(*args, 1, 2) +50 50 | +51 51 | "{0}_{1}_{2}".format(1, **kwargs) +52 52 | + +UP030_0.py:51:1: UP030 [*] Use implicit references for positional format fields + | +49 | "{0}_{1}".format(*args, 1, 2) +50 | +51 | "{0}_{1}_{2}".format(1, **kwargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +52 | +53 | "{0}_{1}_{2}".format(1, 2, **kwargs) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +48 48 | +49 49 | "{0}_{1}".format(*args, 1, 2) +50 50 | +51 |-"{0}_{1}_{2}".format(1, **kwargs) + 51 |+"{}_{}_{}".format(1, **kwargs) +52 52 | +53 53 | "{0}_{1}_{2}".format(1, 2, **kwargs) +54 54 | + +UP030_0.py:53:1: UP030 [*] Use implicit references for positional format fields + | +51 | "{0}_{1}_{2}".format(1, **kwargs) +52 | +53 | "{0}_{1}_{2}".format(1, 2, **kwargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +54 | +55 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +50 50 | +51 51 | "{0}_{1}_{2}".format(1, **kwargs) +52 52 | +53 |-"{0}_{1}_{2}".format(1, 2, **kwargs) + 53 |+"{}_{}_{}".format(1, 2, **kwargs) +54 54 | +55 55 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) +56 56 | + +UP030_0.py:55:1: UP030 [*] Use implicit references for positional format fields + | +53 | "{0}_{1}_{2}".format(1, 2, **kwargs) +54 | +55 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +56 | +57 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +52 52 | +53 53 | "{0}_{1}_{2}".format(1, 2, **kwargs) +54 54 | +55 |-"{0}_{1}_{2}".format(1, 2, 3, **kwargs) + 55 |+"{}_{}_{}".format(1, 2, 3, **kwargs) +56 56 | +57 57 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) +58 58 | + +UP030_0.py:57:1: UP030 [*] Use implicit references for positional format fields + | +55 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) +56 | +57 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +58 | +59 | "{1}_{0}".format(1, 2, *args) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +54 54 | +55 55 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) +56 56 | +57 |-"{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) + 57 |+"{}_{}_{}".format(1, 2, 3, *args, **kwargs) +58 58 | +59 59 | "{1}_{0}".format(1, 2, *args) +60 60 | + +UP030_0.py:59:1: UP030 [*] Use implicit references for positional format fields + | +57 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) +58 | +59 | "{1}_{0}".format(1, 2, *args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 +60 | +61 | "{1}_{0}".format(1, 2) + | + = help: Remove explicit positional indices + +ℹ Suggested fix +56 56 | +57 57 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) +58 58 | +59 |-"{1}_{0}".format(1, 2, *args) + 59 |+"{}_{}".format(2, 1, ) +60 60 | +61 61 | "{1}_{0}".format(1, 2) + +UP030_0.py:61:1: UP030 [*] Use implicit references for positional format fields + | +59 | "{1}_{0}".format(1, 2, *args) +60 | +61 | "{1}_{0}".format(1, 2) + | ^^^^^^^^^^^^^^^^^^^^^^ UP030 + | + = help: Remove explicit positional indices + +ℹ Suggested fix +58 58 | +59 59 | "{1}_{0}".format(1, 2, *args) +60 60 | +61 |-"{1}_{0}".format(1, 2) + 61 |+"{}_{}".format(2, 1) + diff --git a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_2.py.snap b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_2.py.snap deleted file mode 100644 index 7a96569187..0000000000 --- a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP030_2.py.snap +++ /dev/null @@ -1,240 +0,0 @@ ---- -source: crates/ruff/src/rules/pyupgrade/mod.rs ---- -UP030_2.py:6:1: UP030 [*] Use implicit references for positional format fields - | -4 | kwargs = {x: x for x in range(10)} -5 | -6 | "{0}".format(*args) - | ^^^^^^^^^^^^^^^^^^^ UP030 -7 | -8 | "{0}".format(**kwargs) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -3 3 | args = list(range(10)) -4 4 | kwargs = {x: x for x in range(10)} -5 5 | -6 |-"{0}".format(*args) - 6 |+"{}".format(*args) -7 7 | -8 8 | "{0}".format(**kwargs) -9 9 | - -UP030_2.py:8:1: UP030 [*] Use implicit references for positional format fields - | - 6 | "{0}".format(*args) - 7 | - 8 | "{0}".format(**kwargs) - | ^^^^^^^^^^^^^^^^^^^^^^ UP030 - 9 | -10 | "{0}_{1}".format(*args) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -5 5 | -6 6 | "{0}".format(*args) -7 7 | -8 |-"{0}".format(**kwargs) - 8 |+"{}".format(**kwargs) -9 9 | -10 10 | "{0}_{1}".format(*args) -11 11 | - -UP030_2.py:10:1: UP030 [*] Use implicit references for positional format fields - | - 8 | "{0}".format(**kwargs) - 9 | -10 | "{0}_{1}".format(*args) - | ^^^^^^^^^^^^^^^^^^^^^^^ UP030 -11 | -12 | "{0}_{1}".format(1, *args) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -7 7 | -8 8 | "{0}".format(**kwargs) -9 9 | -10 |-"{0}_{1}".format(*args) - 10 |+"{}_{}".format(*args) -11 11 | -12 12 | "{0}_{1}".format(1, *args) -13 13 | - -UP030_2.py:12:1: UP030 [*] Use implicit references for positional format fields - | -10 | "{0}_{1}".format(*args) -11 | -12 | "{0}_{1}".format(1, *args) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 -13 | -14 | "{1}_{0}".format(*args) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -9 9 | -10 10 | "{0}_{1}".format(*args) -11 11 | -12 |-"{0}_{1}".format(1, *args) - 12 |+"{}_{}".format(1, *args) -13 13 | -14 14 | "{1}_{0}".format(*args) -15 15 | - -UP030_2.py:14:1: UP030 Use implicit references for positional format fields - | -12 | "{0}_{1}".format(1, *args) -13 | -14 | "{1}_{0}".format(*args) - | ^^^^^^^^^^^^^^^^^^^^^^^ UP030 -15 | -16 | "{1}_{0}".format(1, *args) - | - = help: Remove explicit positional indices - -UP030_2.py:16:1: UP030 [*] Use implicit references for positional format fields - | -14 | "{1}_{0}".format(*args) -15 | -16 | "{1}_{0}".format(1, *args) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 -17 | -18 | "{0}_{1}".format(1, 2, *args) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -13 13 | -14 14 | "{1}_{0}".format(*args) -15 15 | -16 |-"{1}_{0}".format(1, *args) - 16 |+"{}_{}".format(*args, 1) -17 17 | -18 18 | "{0}_{1}".format(1, 2, *args) -19 19 | - -UP030_2.py:18:1: UP030 [*] Use implicit references for positional format fields - | -16 | "{1}_{0}".format(1, *args) -17 | -18 | "{0}_{1}".format(1, 2, *args) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 -19 | -20 | "{0}_{1}".format(*args, 1, 2) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -15 15 | -16 16 | "{1}_{0}".format(1, *args) -17 17 | -18 |-"{0}_{1}".format(1, 2, *args) - 18 |+"{}_{}".format(1, 2, *args) -19 19 | -20 20 | "{0}_{1}".format(*args, 1, 2) -21 21 | - -UP030_2.py:20:1: UP030 [*] Use implicit references for positional format fields - | -18 | "{0}_{1}".format(1, 2, *args) -19 | -20 | "{0}_{1}".format(*args, 1, 2) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 -21 | -22 | "{0}_{1}_{2}".format(1, **kwargs) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -17 17 | -18 18 | "{0}_{1}".format(1, 2, *args) -19 19 | -20 |-"{0}_{1}".format(*args, 1, 2) - 20 |+"{}_{}".format(*args, 1, 2) -21 21 | -22 22 | "{0}_{1}_{2}".format(1, **kwargs) -23 23 | - -UP030_2.py:22:1: UP030 [*] Use implicit references for positional format fields - | -20 | "{0}_{1}".format(*args, 1, 2) -21 | -22 | "{0}_{1}_{2}".format(1, **kwargs) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 -23 | -24 | "{0}_{1}_{2}".format(1, 2, **kwargs) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -19 19 | -20 20 | "{0}_{1}".format(*args, 1, 2) -21 21 | -22 |-"{0}_{1}_{2}".format(1, **kwargs) - 22 |+"{}_{}_{}".format(1, **kwargs) -23 23 | -24 24 | "{0}_{1}_{2}".format(1, 2, **kwargs) -25 25 | - -UP030_2.py:24:1: UP030 [*] Use implicit references for positional format fields - | -22 | "{0}_{1}_{2}".format(1, **kwargs) -23 | -24 | "{0}_{1}_{2}".format(1, 2, **kwargs) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 -25 | -26 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -21 21 | -22 22 | "{0}_{1}_{2}".format(1, **kwargs) -23 23 | -24 |-"{0}_{1}_{2}".format(1, 2, **kwargs) - 24 |+"{}_{}_{}".format(1, 2, **kwargs) -25 25 | -26 26 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) -27 27 | - -UP030_2.py:26:1: UP030 [*] Use implicit references for positional format fields - | -24 | "{0}_{1}_{2}".format(1, 2, **kwargs) -25 | -26 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 -27 | -28 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) - | - = help: Remove explicit positional indices - -ℹ Suggested fix -23 23 | -24 24 | "{0}_{1}_{2}".format(1, 2, **kwargs) -25 25 | -26 |-"{0}_{1}_{2}".format(1, 2, 3, **kwargs) - 26 |+"{}_{}_{}".format(1, 2, 3, **kwargs) -27 27 | -28 28 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) - -UP030_2.py:28:1: UP030 [*] Use implicit references for positional format fields - | -26 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) -27 | -28 | "{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP030 - | - = help: Remove explicit positional indices - -ℹ Suggested fix -25 25 | -26 26 | "{0}_{1}_{2}".format(1, 2, 3, **kwargs) -27 27 | -28 |-"{0}_{1}_{2}".format(1, 2, 3, *args, **kwargs) - 28 |+"{}_{}_{}".format(1, 2, 3, *args, **kwargs) - - From 26098b8d91e357150da30666c950eae541039834 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 15:17:26 -0400 Subject: [PATCH 023/155] Extend nested union detection to handle bitwise or `Union` expressions (#6399) ## Summary We have some logic in the expression analyzer method to avoid re-checking the inner `Union` in `Union[Union[...]]`, since the methods that analyze `Union` expressions already recurse. Elsewhere, we have logic to avoid re-checking the inner `|` in `int | (int | str)`, for the same reason. This PR unifies that logic into a single method _and_ ensures that, just as we recurse over both `Union` and `|`, we also detect that we're in _either_ kind of nested union. Closes https://github.com/astral-sh/ruff/issues/6285. ## Test Plan Added some new snapshots. --- .../test/fixtures/flake8_pyi/PYI016.py | 57 +- .../test/fixtures/flake8_pyi/PYI016.pyi | 10 + .../src/checkers/ast/analyze/expression.rs | 50 +- ...__flake8_pyi__tests__PYI016_PYI016.py.snap | 588 ++++++++++++++---- ..._flake8_pyi__tests__PYI016_PYI016.pyi.snap | 59 ++ crates/ruff_python_semantic/src/model.rs | 30 +- 6 files changed, 627 insertions(+), 167 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.py b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.py index 9c3b530edf..6b11efb181 100644 --- a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.py +++ b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.py @@ -1,20 +1,19 @@ +import typing + # Shouldn't affect non-union field types. field1: str # Should emit for duplicate field types. field2: str | str # PYI016: Duplicate union member `str` - # Should emit for union types in arguments. def func1(arg1: int | int): # PYI016: Duplicate union member `int` print(arg1) - # Should emit for unions in return types. def func2() -> str | str: # PYI016: Duplicate union member `str` return "my string" - # Should emit in longer unions, even if not directly adjacent. field3: str | str | int # PYI016: Duplicate union member `str` field4: int | int | str # PYI016: Duplicate union member `int` @@ -33,3 +32,55 @@ field10: (str | int) | str # PYI016: Duplicate union member `str` # Should emit for nested unions. field11: dict[int | int, str] + +# Should emit for unions with more than two cases +field12: int | int | int # Error +field13: int | int | int | int # Error + +# Should emit for unions with more than two cases, even if not directly adjacent +field14: int | int | str | int # Error + +# Should emit for duplicate literal types; also covered by PYI030 +field15: typing.Literal[1] | typing.Literal[1] # Error + +# Shouldn't emit if in new parent type +field16: int | dict[int, str] # OK + +# Shouldn't emit if not in a union parent +field17: dict[int, int] # OK + +# Should emit in cases with newlines +field18: typing.Union[ + set[ + int # foo + ], + set[ + int # bar + ], +] # Error, newline and comment will not be emitted in message + +# Should emit in cases with `typing.Union` instead of `|` +field19: typing.Union[int, int] # Error + +# Should emit in cases with nested `typing.Union` +field20: typing.Union[int, typing.Union[int, str]] # Error + +# Should emit in cases with mixed `typing.Union` and `|` +field21: typing.Union[int, int | str] # Error + +# Should emit only once in cases with multiple nested `typing.Union` +field22: typing.Union[int, typing.Union[int, typing.Union[int, int]]] # Error + +# Should emit in cases with newlines +field23: set[ # foo + int] | set[int] + +# Should emit twice (once for each `int` in the nested union, both of which are +# duplicates of the outer `int`), but not three times (which would indicate that +# we incorrectly re-checked the nested union). +field24: typing.Union[int, typing.Union[int, int]] # PYI016: Duplicate union member `int` + +# Should emit twice (once for each `int` in the nested union, both of which are +# duplicates of the outer `int`), but not three times (which would indicate that +# we incorrectly re-checked the nested union). +field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` diff --git a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.pyi b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.pyi index 1fe4d0a6c7..6b11efb181 100644 --- a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.pyi +++ b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI016.pyi @@ -74,3 +74,13 @@ field22: typing.Union[int, typing.Union[int, typing.Union[int, int]]] # Error # Should emit in cases with newlines field23: set[ # foo int] | set[int] + +# Should emit twice (once for each `int` in the nested union, both of which are +# duplicates of the outer `int`), but not three times (which would indicate that +# we incorrectly re-checked the nested union). +field24: typing.Union[int, typing.Union[int, int]] # PYI016: Duplicate union member `int` + +# Should emit twice (once for each `int` in the nested union, both of which are +# duplicates of the outer `int`), but not three times (which would indicate that +# we incorrectly re-checked the nested union). +field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index e47b871f77..66e9678955 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -80,17 +80,9 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { Rule::RedundantLiteralUnion, Rule::UnnecessaryTypeUnion, ]) { - // Avoid duplicate checks if the parent is an `Union[...]` since these rules + // Avoid duplicate checks if the parent is a union, since these rules already // traverse nested unions. - let is_unchecked_union = checker - .semantic - .current_expression_grandparent() - .and_then(Expr::as_subscript_expr) - .map_or(true, |parent| { - !checker.semantic.match_typing_expr(&parent.value, "Union") - }); - - if is_unchecked_union { + if !checker.semantic.in_nested_union() { if checker.enabled(Rule::UnnecessaryLiteralUnion) { flake8_pyi::rules::unnecessary_literal_union(checker, expr); } @@ -1084,29 +1076,23 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { } } - // Avoid duplicate checks if the parent is an `|` since these rules + // Avoid duplicate checks if the parent is a union, since these rules already // traverse nested unions. - let is_unchecked_union = !matches!( - checker.semantic.current_expression_parent(), - Some(Expr::BinOp(ast::ExprBinOp { - op: Operator::BitOr, - .. - })) - ); - if checker.enabled(Rule::DuplicateUnionMember) - && checker.semantic.in_type_definition() - && is_unchecked_union - { - flake8_pyi::rules::duplicate_union_member(checker, expr); - } - if checker.enabled(Rule::UnnecessaryLiteralUnion) && is_unchecked_union { - flake8_pyi::rules::unnecessary_literal_union(checker, expr); - } - if checker.enabled(Rule::RedundantLiteralUnion) && is_unchecked_union { - flake8_pyi::rules::redundant_literal_union(checker, expr); - } - if checker.enabled(Rule::UnnecessaryTypeUnion) && is_unchecked_union { - flake8_pyi::rules::unnecessary_type_union(checker, expr); + if !checker.semantic.in_nested_union() { + if checker.enabled(Rule::DuplicateUnionMember) + && checker.semantic.in_type_definition() + { + flake8_pyi::rules::duplicate_union_member(checker, expr); + } + if checker.enabled(Rule::UnnecessaryLiteralUnion) { + flake8_pyi::rules::unnecessary_literal_union(checker, expr); + } + if checker.enabled(Rule::RedundantLiteralUnion) { + flake8_pyi::rules::redundant_literal_union(checker, expr); + } + if checker.enabled(Rule::UnnecessaryTypeUnion) { + flake8_pyi::rules::unnecessary_type_union(checker, expr); + } } } Expr::UnaryOp(ast::ExprUnaryOp { diff --git a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.py.snap b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.py.snap index 23b1b08e70..abc1d3226a 100644 --- a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.py.snap +++ b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.py.snap @@ -1,42 +1,44 @@ --- source: crates/ruff/src/rules/flake8_pyi/mod.rs --- -PYI016.py:5:15: PYI016 [*] Duplicate union member `str` +PYI016.py:7:15: PYI016 [*] Duplicate union member `str` | -4 | # Should emit for duplicate field types. -5 | field2: str | str # PYI016: Duplicate union member `str` +6 | # Should emit for duplicate field types. +7 | field2: str | str # PYI016: Duplicate union member `str` | ^^^ PYI016 +8 | +9 | # Should emit for union types in arguments. | = help: Remove duplicate union member `str` ℹ Fix -2 2 | field1: str -3 3 | -4 4 | # Should emit for duplicate field types. -5 |-field2: str | str # PYI016: Duplicate union member `str` - 5 |+field2: str # PYI016: Duplicate union member `str` -6 6 | -7 7 | -8 8 | # Should emit for union types in arguments. +4 4 | field1: str +5 5 | +6 6 | # Should emit for duplicate field types. +7 |-field2: str | str # PYI016: Duplicate union member `str` + 7 |+field2: str # PYI016: Duplicate union member `str` +8 8 | +9 9 | # Should emit for union types in arguments. +10 10 | def func1(arg1: int | int): # PYI016: Duplicate union member `int` -PYI016.py:9:23: PYI016 [*] Duplicate union member `int` +PYI016.py:10:23: PYI016 [*] Duplicate union member `int` | - 8 | # Should emit for union types in arguments. - 9 | def func1(arg1: int | int): # PYI016: Duplicate union member `int` + 9 | # Should emit for union types in arguments. +10 | def func1(arg1: int | int): # PYI016: Duplicate union member `int` | ^^^ PYI016 -10 | print(arg1) +11 | print(arg1) | = help: Remove duplicate union member `int` ℹ Fix -6 6 | -7 7 | -8 8 | # Should emit for union types in arguments. -9 |-def func1(arg1: int | int): # PYI016: Duplicate union member `int` - 9 |+def func1(arg1: int): # PYI016: Duplicate union member `int` -10 10 | print(arg1) -11 11 | +7 7 | field2: str | str # PYI016: Duplicate union member `str` +8 8 | +9 9 | # Should emit for union types in arguments. +10 |-def func1(arg1: int | int): # PYI016: Duplicate union member `int` + 10 |+def func1(arg1: int): # PYI016: Duplicate union member `int` +11 11 | print(arg1) 12 12 | +13 13 | # Should emit for unions in return types. PYI016.py:14:22: PYI016 [*] Duplicate union member `str` | @@ -48,170 +50,494 @@ PYI016.py:14:22: PYI016 [*] Duplicate union member `str` = help: Remove duplicate union member `str` ℹ Fix -11 11 | +11 11 | print(arg1) 12 12 | 13 13 | # Should emit for unions in return types. 14 |-def func2() -> str | str: # PYI016: Duplicate union member `str` 14 |+def func2() -> str: # PYI016: Duplicate union member `str` 15 15 | return "my string" 16 16 | -17 17 | +17 17 | # Should emit in longer unions, even if not directly adjacent. -PYI016.py:19:15: PYI016 [*] Duplicate union member `str` +PYI016.py:18:15: PYI016 [*] Duplicate union member `str` | -18 | # Should emit in longer unions, even if not directly adjacent. -19 | field3: str | str | int # PYI016: Duplicate union member `str` +17 | # Should emit in longer unions, even if not directly adjacent. +18 | field3: str | str | int # PYI016: Duplicate union member `str` | ^^^ PYI016 -20 | field4: int | int | str # PYI016: Duplicate union member `int` -21 | field5: str | int | str # PYI016: Duplicate union member `str` +19 | field4: int | int | str # PYI016: Duplicate union member `int` +20 | field5: str | int | str # PYI016: Duplicate union member `str` | = help: Remove duplicate union member `str` +ℹ Fix +15 15 | return "my string" +16 16 | +17 17 | # Should emit in longer unions, even if not directly adjacent. +18 |-field3: str | str | int # PYI016: Duplicate union member `str` + 18 |+field3: str | int # PYI016: Duplicate union member `str` +19 19 | field4: int | int | str # PYI016: Duplicate union member `int` +20 20 | field5: str | int | str # PYI016: Duplicate union member `str` +21 21 | field6: int | bool | str | int # PYI016: Duplicate union member `int` + +PYI016.py:19:15: PYI016 [*] Duplicate union member `int` + | +17 | # Should emit in longer unions, even if not directly adjacent. +18 | field3: str | str | int # PYI016: Duplicate union member `str` +19 | field4: int | int | str # PYI016: Duplicate union member `int` + | ^^^ PYI016 +20 | field5: str | int | str # PYI016: Duplicate union member `str` +21 | field6: int | bool | str | int # PYI016: Duplicate union member `int` + | + = help: Remove duplicate union member `int` + ℹ Fix 16 16 | -17 17 | -18 18 | # Should emit in longer unions, even if not directly adjacent. -19 |-field3: str | str | int # PYI016: Duplicate union member `str` - 19 |+field3: str | int # PYI016: Duplicate union member `str` -20 20 | field4: int | int | str # PYI016: Duplicate union member `int` -21 21 | field5: str | int | str # PYI016: Duplicate union member `str` -22 22 | field6: int | bool | str | int # PYI016: Duplicate union member `int` +17 17 | # Should emit in longer unions, even if not directly adjacent. +18 18 | field3: str | str | int # PYI016: Duplicate union member `str` +19 |-field4: int | int | str # PYI016: Duplicate union member `int` + 19 |+field4: int | str # PYI016: Duplicate union member `int` +20 20 | field5: str | int | str # PYI016: Duplicate union member `str` +21 21 | field6: int | bool | str | int # PYI016: Duplicate union member `int` +22 22 | -PYI016.py:20:15: PYI016 [*] Duplicate union member `int` +PYI016.py:20:21: PYI016 [*] Duplicate union member `str` | -18 | # Should emit in longer unions, even if not directly adjacent. -19 | field3: str | str | int # PYI016: Duplicate union member `str` -20 | field4: int | int | str # PYI016: Duplicate union member `int` - | ^^^ PYI016 -21 | field5: str | int | str # PYI016: Duplicate union member `str` -22 | field6: int | bool | str | int # PYI016: Duplicate union member `int` - | - = help: Remove duplicate union member `int` - -ℹ Fix -17 17 | -18 18 | # Should emit in longer unions, even if not directly adjacent. -19 19 | field3: str | str | int # PYI016: Duplicate union member `str` -20 |-field4: int | int | str # PYI016: Duplicate union member `int` - 20 |+field4: int | str # PYI016: Duplicate union member `int` -21 21 | field5: str | int | str # PYI016: Duplicate union member `str` -22 22 | field6: int | bool | str | int # PYI016: Duplicate union member `int` -23 23 | - -PYI016.py:21:21: PYI016 [*] Duplicate union member `str` - | -19 | field3: str | str | int # PYI016: Duplicate union member `str` -20 | field4: int | int | str # PYI016: Duplicate union member `int` -21 | field5: str | int | str # PYI016: Duplicate union member `str` +18 | field3: str | str | int # PYI016: Duplicate union member `str` +19 | field4: int | int | str # PYI016: Duplicate union member `int` +20 | field5: str | int | str # PYI016: Duplicate union member `str` | ^^^ PYI016 -22 | field6: int | bool | str | int # PYI016: Duplicate union member `int` +21 | field6: int | bool | str | int # PYI016: Duplicate union member `int` | = help: Remove duplicate union member `str` ℹ Fix -18 18 | # Should emit in longer unions, even if not directly adjacent. -19 19 | field3: str | str | int # PYI016: Duplicate union member `str` -20 20 | field4: int | int | str # PYI016: Duplicate union member `int` -21 |-field5: str | int | str # PYI016: Duplicate union member `str` - 21 |+field5: str | int # PYI016: Duplicate union member `str` -22 22 | field6: int | bool | str | int # PYI016: Duplicate union member `int` -23 23 | -24 24 | # Shouldn't emit for non-type unions. +17 17 | # Should emit in longer unions, even if not directly adjacent. +18 18 | field3: str | str | int # PYI016: Duplicate union member `str` +19 19 | field4: int | int | str # PYI016: Duplicate union member `int` +20 |-field5: str | int | str # PYI016: Duplicate union member `str` + 20 |+field5: str | int # PYI016: Duplicate union member `str` +21 21 | field6: int | bool | str | int # PYI016: Duplicate union member `int` +22 22 | +23 23 | # Shouldn't emit for non-type unions. -PYI016.py:22:28: PYI016 [*] Duplicate union member `int` +PYI016.py:21:28: PYI016 [*] Duplicate union member `int` | -20 | field4: int | int | str # PYI016: Duplicate union member `int` -21 | field5: str | int | str # PYI016: Duplicate union member `str` -22 | field6: int | bool | str | int # PYI016: Duplicate union member `int` +19 | field4: int | int | str # PYI016: Duplicate union member `int` +20 | field5: str | int | str # PYI016: Duplicate union member `str` +21 | field6: int | bool | str | int # PYI016: Duplicate union member `int` | ^^^ PYI016 -23 | -24 | # Shouldn't emit for non-type unions. +22 | +23 | # Shouldn't emit for non-type unions. | = help: Remove duplicate union member `int` ℹ Fix -19 19 | field3: str | str | int # PYI016: Duplicate union member `str` -20 20 | field4: int | int | str # PYI016: Duplicate union member `int` -21 21 | field5: str | int | str # PYI016: Duplicate union member `str` -22 |-field6: int | bool | str | int # PYI016: Duplicate union member `int` - 22 |+field6: int | bool | str # PYI016: Duplicate union member `int` -23 23 | -24 24 | # Shouldn't emit for non-type unions. -25 25 | field7 = str | str +18 18 | field3: str | str | int # PYI016: Duplicate union member `str` +19 19 | field4: int | int | str # PYI016: Duplicate union member `int` +20 20 | field5: str | int | str # PYI016: Duplicate union member `str` +21 |-field6: int | bool | str | int # PYI016: Duplicate union member `int` + 21 |+field6: int | bool | str # PYI016: Duplicate union member `int` +22 22 | +23 23 | # Shouldn't emit for non-type unions. +24 24 | field7 = str | str -PYI016.py:28:22: PYI016 [*] Duplicate union member `int` +PYI016.py:27:22: PYI016 [*] Duplicate union member `int` | -27 | # Should emit for strangely-bracketed unions. -28 | field8: int | (str | int) # PYI016: Duplicate union member `int` +26 | # Should emit for strangely-bracketed unions. +27 | field8: int | (str | int) # PYI016: Duplicate union member `int` | ^^^ PYI016 -29 | -30 | # Should handle user brackets when fixing. +28 | +29 | # Should handle user brackets when fixing. | = help: Remove duplicate union member `int` ℹ Fix -25 25 | field7 = str | str -26 26 | -27 27 | # Should emit for strangely-bracketed unions. -28 |-field8: int | (str | int) # PYI016: Duplicate union member `int` - 28 |+field8: int | (str) # PYI016: Duplicate union member `int` -29 29 | -30 30 | # Should handle user brackets when fixing. -31 31 | field9: int | (int | str) # PYI016: Duplicate union member `int` +24 24 | field7 = str | str +25 25 | +26 26 | # Should emit for strangely-bracketed unions. +27 |-field8: int | (str | int) # PYI016: Duplicate union member `int` + 27 |+field8: int | (str) # PYI016: Duplicate union member `int` +28 28 | +29 29 | # Should handle user brackets when fixing. +30 30 | field9: int | (int | str) # PYI016: Duplicate union member `int` -PYI016.py:31:16: PYI016 [*] Duplicate union member `int` +PYI016.py:30:16: PYI016 [*] Duplicate union member `int` | -30 | # Should handle user brackets when fixing. -31 | field9: int | (int | str) # PYI016: Duplicate union member `int` +29 | # Should handle user brackets when fixing. +30 | field9: int | (int | str) # PYI016: Duplicate union member `int` | ^^^ PYI016 -32 | field10: (str | int) | str # PYI016: Duplicate union member `str` +31 | field10: (str | int) | str # PYI016: Duplicate union member `str` | = help: Remove duplicate union member `int` ℹ Fix -28 28 | field8: int | (str | int) # PYI016: Duplicate union member `int` -29 29 | -30 30 | # Should handle user brackets when fixing. -31 |-field9: int | (int | str) # PYI016: Duplicate union member `int` - 31 |+field9: int | (str) # PYI016: Duplicate union member `int` -32 32 | field10: (str | int) | str # PYI016: Duplicate union member `str` -33 33 | -34 34 | # Should emit for nested unions. +27 27 | field8: int | (str | int) # PYI016: Duplicate union member `int` +28 28 | +29 29 | # Should handle user brackets when fixing. +30 |-field9: int | (int | str) # PYI016: Duplicate union member `int` + 30 |+field9: int | (str) # PYI016: Duplicate union member `int` +31 31 | field10: (str | int) | str # PYI016: Duplicate union member `str` +32 32 | +33 33 | # Should emit for nested unions. -PYI016.py:32:24: PYI016 [*] Duplicate union member `str` +PYI016.py:31:24: PYI016 [*] Duplicate union member `str` | -30 | # Should handle user brackets when fixing. -31 | field9: int | (int | str) # PYI016: Duplicate union member `int` -32 | field10: (str | int) | str # PYI016: Duplicate union member `str` +29 | # Should handle user brackets when fixing. +30 | field9: int | (int | str) # PYI016: Duplicate union member `int` +31 | field10: (str | int) | str # PYI016: Duplicate union member `str` | ^^^ PYI016 -33 | -34 | # Should emit for nested unions. +32 | +33 | # Should emit for nested unions. | = help: Remove duplicate union member `str` ℹ Fix -29 29 | -30 30 | # Should handle user brackets when fixing. -31 31 | field9: int | (int | str) # PYI016: Duplicate union member `int` -32 |-field10: (str | int) | str # PYI016: Duplicate union member `str` - 32 |+field10: str | int # PYI016: Duplicate union member `str` -33 33 | -34 34 | # Should emit for nested unions. -35 35 | field11: dict[int | int, str] +28 28 | +29 29 | # Should handle user brackets when fixing. +30 30 | field9: int | (int | str) # PYI016: Duplicate union member `int` +31 |-field10: (str | int) | str # PYI016: Duplicate union member `str` + 31 |+field10: str | int # PYI016: Duplicate union member `str` +32 32 | +33 33 | # Should emit for nested unions. +34 34 | field11: dict[int | int, str] -PYI016.py:35:21: PYI016 [*] Duplicate union member `int` +PYI016.py:34:21: PYI016 [*] Duplicate union member `int` | -34 | # Should emit for nested unions. -35 | field11: dict[int | int, str] +33 | # Should emit for nested unions. +34 | field11: dict[int | int, str] | ^^^ PYI016 +35 | +36 | # Should emit for unions with more than two cases | = help: Remove duplicate union member `int` ℹ Fix -32 32 | field10: (str | int) | str # PYI016: Duplicate union member `str` -33 33 | -34 34 | # Should emit for nested unions. -35 |-field11: dict[int | int, str] - 35 |+field11: dict[int, str] +31 31 | field10: (str | int) | str # PYI016: Duplicate union member `str` +32 32 | +33 33 | # Should emit for nested unions. +34 |-field11: dict[int | int, str] + 34 |+field11: dict[int, str] +35 35 | +36 36 | # Should emit for unions with more than two cases +37 37 | field12: int | int | int # Error + +PYI016.py:37:16: PYI016 [*] Duplicate union member `int` + | +36 | # Should emit for unions with more than two cases +37 | field12: int | int | int # Error + | ^^^ PYI016 +38 | field13: int | int | int | int # Error + | + = help: Remove duplicate union member `int` + +ℹ Fix +34 34 | field11: dict[int | int, str] +35 35 | +36 36 | # Should emit for unions with more than two cases +37 |-field12: int | int | int # Error + 37 |+field12: int | int # Error +38 38 | field13: int | int | int | int # Error +39 39 | +40 40 | # Should emit for unions with more than two cases, even if not directly adjacent + +PYI016.py:37:22: PYI016 [*] Duplicate union member `int` + | +36 | # Should emit for unions with more than two cases +37 | field12: int | int | int # Error + | ^^^ PYI016 +38 | field13: int | int | int | int # Error + | + = help: Remove duplicate union member `int` + +ℹ Fix +34 34 | field11: dict[int | int, str] +35 35 | +36 36 | # Should emit for unions with more than two cases +37 |-field12: int | int | int # Error + 37 |+field12: int | int # Error +38 38 | field13: int | int | int | int # Error +39 39 | +40 40 | # Should emit for unions with more than two cases, even if not directly adjacent + +PYI016.py:38:16: PYI016 [*] Duplicate union member `int` + | +36 | # Should emit for unions with more than two cases +37 | field12: int | int | int # Error +38 | field13: int | int | int | int # Error + | ^^^ PYI016 +39 | +40 | # Should emit for unions with more than two cases, even if not directly adjacent + | + = help: Remove duplicate union member `int` + +ℹ Fix +35 35 | +36 36 | # Should emit for unions with more than two cases +37 37 | field12: int | int | int # Error +38 |-field13: int | int | int | int # Error + 38 |+field13: int | int | int # Error +39 39 | +40 40 | # Should emit for unions with more than two cases, even if not directly adjacent +41 41 | field14: int | int | str | int # Error + +PYI016.py:38:22: PYI016 [*] Duplicate union member `int` + | +36 | # Should emit for unions with more than two cases +37 | field12: int | int | int # Error +38 | field13: int | int | int | int # Error + | ^^^ PYI016 +39 | +40 | # Should emit for unions with more than two cases, even if not directly adjacent + | + = help: Remove duplicate union member `int` + +ℹ Fix +35 35 | +36 36 | # Should emit for unions with more than two cases +37 37 | field12: int | int | int # Error +38 |-field13: int | int | int | int # Error + 38 |+field13: int | int | int # Error +39 39 | +40 40 | # Should emit for unions with more than two cases, even if not directly adjacent +41 41 | field14: int | int | str | int # Error + +PYI016.py:38:28: PYI016 [*] Duplicate union member `int` + | +36 | # Should emit for unions with more than two cases +37 | field12: int | int | int # Error +38 | field13: int | int | int | int # Error + | ^^^ PYI016 +39 | +40 | # Should emit for unions with more than two cases, even if not directly adjacent + | + = help: Remove duplicate union member `int` + +ℹ Fix +35 35 | +36 36 | # Should emit for unions with more than two cases +37 37 | field12: int | int | int # Error +38 |-field13: int | int | int | int # Error + 38 |+field13: int | int | int # Error +39 39 | +40 40 | # Should emit for unions with more than two cases, even if not directly adjacent +41 41 | field14: int | int | str | int # Error + +PYI016.py:41:16: PYI016 [*] Duplicate union member `int` + | +40 | # Should emit for unions with more than two cases, even if not directly adjacent +41 | field14: int | int | str | int # Error + | ^^^ PYI016 +42 | +43 | # Should emit for duplicate literal types; also covered by PYI030 + | + = help: Remove duplicate union member `int` + +ℹ Fix +38 38 | field13: int | int | int | int # Error +39 39 | +40 40 | # Should emit for unions with more than two cases, even if not directly adjacent +41 |-field14: int | int | str | int # Error + 41 |+field14: int | str | int # Error +42 42 | +43 43 | # Should emit for duplicate literal types; also covered by PYI030 +44 44 | field15: typing.Literal[1] | typing.Literal[1] # Error + +PYI016.py:41:28: PYI016 [*] Duplicate union member `int` + | +40 | # Should emit for unions with more than two cases, even if not directly adjacent +41 | field14: int | int | str | int # Error + | ^^^ PYI016 +42 | +43 | # Should emit for duplicate literal types; also covered by PYI030 + | + = help: Remove duplicate union member `int` + +ℹ Fix +38 38 | field13: int | int | int | int # Error +39 39 | +40 40 | # Should emit for unions with more than two cases, even if not directly adjacent +41 |-field14: int | int | str | int # Error + 41 |+field14: int | int | str # Error +42 42 | +43 43 | # Should emit for duplicate literal types; also covered by PYI030 +44 44 | field15: typing.Literal[1] | typing.Literal[1] # Error + +PYI016.py:44:30: PYI016 [*] Duplicate union member `typing.Literal[1]` + | +43 | # Should emit for duplicate literal types; also covered by PYI030 +44 | field15: typing.Literal[1] | typing.Literal[1] # Error + | ^^^^^^^^^^^^^^^^^ PYI016 +45 | +46 | # Shouldn't emit if in new parent type + | + = help: Remove duplicate union member `typing.Literal[1]` + +ℹ Fix +41 41 | field14: int | int | str | int # Error +42 42 | +43 43 | # Should emit for duplicate literal types; also covered by PYI030 +44 |-field15: typing.Literal[1] | typing.Literal[1] # Error + 44 |+field15: typing.Literal[1] # Error +45 45 | +46 46 | # Shouldn't emit if in new parent type +47 47 | field16: int | dict[int, str] # OK + +PYI016.py:57:5: PYI016 Duplicate union member `set[int]` + | +55 | int # foo +56 | ], +57 | set[ + | _____^ +58 | | int # bar +59 | | ], + | |_____^ PYI016 +60 | ] # Error, newline and comment will not be emitted in message + | + = help: Remove duplicate union member `set[int]` + +PYI016.py:63:28: PYI016 Duplicate union member `int` + | +62 | # Should emit in cases with `typing.Union` instead of `|` +63 | field19: typing.Union[int, int] # Error + | ^^^ PYI016 +64 | +65 | # Should emit in cases with nested `typing.Union` + | + = help: Remove duplicate union member `int` + +PYI016.py:66:41: PYI016 Duplicate union member `int` + | +65 | # Should emit in cases with nested `typing.Union` +66 | field20: typing.Union[int, typing.Union[int, str]] # Error + | ^^^ PYI016 +67 | +68 | # Should emit in cases with mixed `typing.Union` and `|` + | + = help: Remove duplicate union member `int` + +PYI016.py:69:28: PYI016 [*] Duplicate union member `int` + | +68 | # Should emit in cases with mixed `typing.Union` and `|` +69 | field21: typing.Union[int, int | str] # Error + | ^^^ PYI016 +70 | +71 | # Should emit only once in cases with multiple nested `typing.Union` + | + = help: Remove duplicate union member `int` + +ℹ Fix +66 66 | field20: typing.Union[int, typing.Union[int, str]] # Error +67 67 | +68 68 | # Should emit in cases with mixed `typing.Union` and `|` +69 |-field21: typing.Union[int, int | str] # Error + 69 |+field21: typing.Union[int, str] # Error +70 70 | +71 71 | # Should emit only once in cases with multiple nested `typing.Union` +72 72 | field22: typing.Union[int, typing.Union[int, typing.Union[int, int]]] # Error + +PYI016.py:72:41: PYI016 Duplicate union member `int` + | +71 | # Should emit only once in cases with multiple nested `typing.Union` +72 | field22: typing.Union[int, typing.Union[int, typing.Union[int, int]]] # Error + | ^^^ PYI016 +73 | +74 | # Should emit in cases with newlines + | + = help: Remove duplicate union member `int` + +PYI016.py:72:59: PYI016 Duplicate union member `int` + | +71 | # Should emit only once in cases with multiple nested `typing.Union` +72 | field22: typing.Union[int, typing.Union[int, typing.Union[int, int]]] # Error + | ^^^ PYI016 +73 | +74 | # Should emit in cases with newlines + | + = help: Remove duplicate union member `int` + +PYI016.py:72:64: PYI016 Duplicate union member `int` + | +71 | # Should emit only once in cases with multiple nested `typing.Union` +72 | field22: typing.Union[int, typing.Union[int, typing.Union[int, int]]] # Error + | ^^^ PYI016 +73 | +74 | # Should emit in cases with newlines + | + = help: Remove duplicate union member `int` + +PYI016.py:76:12: PYI016 [*] Duplicate union member `set[int]` + | +74 | # Should emit in cases with newlines +75 | field23: set[ # foo +76 | int] | set[int] + | ^^^^^^^^ PYI016 +77 | +78 | # Should emit twice (once for each `int` in the nested union, both of which are + | + = help: Remove duplicate union member `set[int]` + +ℹ Fix +73 73 | +74 74 | # Should emit in cases with newlines +75 75 | field23: set[ # foo +76 |- int] | set[int] + 76 |+ int] +77 77 | +78 78 | # Should emit twice (once for each `int` in the nested union, both of which are +79 79 | # duplicates of the outer `int`), but not three times (which would indicate that + +PYI016.py:81:41: PYI016 Duplicate union member `int` + | +79 | # duplicates of the outer `int`), but not three times (which would indicate that +80 | # we incorrectly re-checked the nested union). +81 | field24: typing.Union[int, typing.Union[int, int]] # PYI016: Duplicate union member `int` + | ^^^ PYI016 +82 | +83 | # Should emit twice (once for each `int` in the nested union, both of which are + | + = help: Remove duplicate union member `int` + +PYI016.py:81:46: PYI016 Duplicate union member `int` + | +79 | # duplicates of the outer `int`), but not three times (which would indicate that +80 | # we incorrectly re-checked the nested union). +81 | field24: typing.Union[int, typing.Union[int, int]] # PYI016: Duplicate union member `int` + | ^^^ PYI016 +82 | +83 | # Should emit twice (once for each `int` in the nested union, both of which are + | + = help: Remove duplicate union member `int` + +PYI016.py:86:28: PYI016 [*] Duplicate union member `int` + | +84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 | # we incorrectly re-checked the nested union). +86 | field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + | ^^^ PYI016 + | + = help: Remove duplicate union member `int` + +ℹ Fix +83 83 | # Should emit twice (once for each `int` in the nested union, both of which are +84 84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 85 | # we incorrectly re-checked the nested union). +86 |-field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + 86 |+field25: typing.Union[int, int] # PYI016: Duplicate union member `int` + +PYI016.py:86:34: PYI016 [*] Duplicate union member `int` + | +84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 | # we incorrectly re-checked the nested union). +86 | field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + | ^^^ PYI016 + | + = help: Remove duplicate union member `int` + +ℹ Fix +83 83 | # Should emit twice (once for each `int` in the nested union, both of which are +84 84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 85 | # we incorrectly re-checked the nested union). +86 |-field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + 86 |+field25: typing.Union[int, int] # PYI016: Duplicate union member `int` diff --git a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.pyi.snap b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.pyi.snap index ca5312e2e9..d29fea9901 100644 --- a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.pyi.snap +++ b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI016_PYI016.pyi.snap @@ -471,6 +471,8 @@ PYI016.pyi:76:12: PYI016 [*] Duplicate union member `set[int]` 75 | field23: set[ # foo 76 | int] | set[int] | ^^^^^^^^ PYI016 +77 | +78 | # Should emit twice (once for each `int` in the nested union, both of which are | = help: Remove duplicate union member `set[int]` @@ -480,5 +482,62 @@ PYI016.pyi:76:12: PYI016 [*] Duplicate union member `set[int]` 75 75 | field23: set[ # foo 76 |- int] | set[int] 76 |+ int] +77 77 | +78 78 | # Should emit twice (once for each `int` in the nested union, both of which are +79 79 | # duplicates of the outer `int`), but not three times (which would indicate that + +PYI016.pyi:81:41: PYI016 Duplicate union member `int` + | +79 | # duplicates of the outer `int`), but not three times (which would indicate that +80 | # we incorrectly re-checked the nested union). +81 | field24: typing.Union[int, typing.Union[int, int]] # PYI016: Duplicate union member `int` + | ^^^ PYI016 +82 | +83 | # Should emit twice (once for each `int` in the nested union, both of which are + | + = help: Remove duplicate union member `int` + +PYI016.pyi:81:46: PYI016 Duplicate union member `int` + | +79 | # duplicates of the outer `int`), but not three times (which would indicate that +80 | # we incorrectly re-checked the nested union). +81 | field24: typing.Union[int, typing.Union[int, int]] # PYI016: Duplicate union member `int` + | ^^^ PYI016 +82 | +83 | # Should emit twice (once for each `int` in the nested union, both of which are + | + = help: Remove duplicate union member `int` + +PYI016.pyi:86:28: PYI016 [*] Duplicate union member `int` + | +84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 | # we incorrectly re-checked the nested union). +86 | field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + | ^^^ PYI016 + | + = help: Remove duplicate union member `int` + +ℹ Fix +83 83 | # Should emit twice (once for each `int` in the nested union, both of which are +84 84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 85 | # we incorrectly re-checked the nested union). +86 |-field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + 86 |+field25: typing.Union[int, int] # PYI016: Duplicate union member `int` + +PYI016.pyi:86:34: PYI016 [*] Duplicate union member `int` + | +84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 | # we incorrectly re-checked the nested union). +86 | field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + | ^^^ PYI016 + | + = help: Remove duplicate union member `int` + +ℹ Fix +83 83 | # Should emit twice (once for each `int` in the nested union, both of which are +84 84 | # duplicates of the outer `int`), but not three times (which would indicate that +85 85 | # we incorrectly re-checked the nested union). +86 |-field25: typing.Union[int, int | int] # PYI016: Duplicate union member `int` + 86 |+field25: typing.Union[int, int] # PYI016: Duplicate union member `int` diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index 3ae1b06bb2..4b55de7648 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -6,7 +6,7 @@ use smallvec::smallvec; use ruff_python_ast::call_path::{collect_call_path, from_unqualified_name, CallPath}; use ruff_python_ast::helpers::from_relative_import; -use ruff_python_ast::{self as ast, Expr, Ranged, Stmt}; +use ruff_python_ast::{self as ast, Expr, Operator, Ranged, Stmt}; use ruff_python_stdlib::path::is_python_stub_file; use ruff_python_stdlib::typing::is_typing_extension; use ruff_text_size::{TextRange, TextSize}; @@ -1022,6 +1022,34 @@ impl<'a> SemanticModel<'a> { false } + /// Return `true` if the model is in a nested union expression (e.g., the inner `Union` in + /// `Union[Union[int, str], float]`). + pub fn in_nested_union(&self) -> bool { + // Ex) `Union[Union[int, str], float]` + if self + .current_expression_grandparent() + .and_then(Expr::as_subscript_expr) + .is_some_and(|parent| self.match_typing_expr(&parent.value, "Union")) + { + return true; + } + + // Ex) `int | Union[str, float]` + if self.current_expression_parent().is_some_and(|parent| { + matches!( + parent, + Expr::BinOp(ast::ExprBinOp { + op: Operator::BitOr, + .. + }) + ) + }) { + return true; + } + + false + } + /// Returns `true` if the given [`BindingId`] is used. pub fn is_used(&self, binding_id: BindingId) -> bool { self.bindings[binding_id].is_used() From 404e334fecf5311d11930f307c0454011fe89117 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 15:46:28 -0400 Subject: [PATCH 024/155] Rename `ArgumentSeparator` to `ParameterSeparator` (#6404) To mirror the rename from `Arguments` to `Parameters`. --- .../src/comments/placement.rs | 4 ++-- .../src/other/parameters.rs | 22 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 79c56ca277..f7d90a98bb 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -12,7 +12,7 @@ use ruff_text_size::TextRange; use crate::comments::visitor::{CommentPlacement, DecoratedComment}; use crate::expression::expr_slice::{assign_comment_in_slice, ExprSliceCommentSection}; use crate::other::parameters::{ - assign_argument_separator_comment_placement, find_argument_separators, + assign_argument_separator_comment_placement, find_parameter_separators, }; /// Manually attach comments to nodes that the default placement gets wrong. @@ -606,7 +606,7 @@ fn handle_parameters_separator_comment<'a>( parameters: &Parameters, locator: &Locator, ) -> CommentPlacement<'a> { - let (slash, star) = find_argument_separators(locator.contents(), parameters); + let (slash, star) = find_parameter_separators(locator.contents(), parameters); let comment_range = comment.slice().range(); let placement = assign_argument_separator_comment_placement( slash.as_ref(), diff --git a/crates/ruff_python_formatter/src/other/parameters.rs b/crates/ruff_python_formatter/src/other/parameters.rs index a9e8aa16af..fa15f83efe 100644 --- a/crates/ruff_python_formatter/src/other/parameters.rs +++ b/crates/ruff_python_formatter/src/other/parameters.rs @@ -60,7 +60,7 @@ impl FormatNodeRule for FormatParameters { kwarg, } = item; - let (slash, star) = find_argument_separators(f.context().source(), item); + let (slash, star) = find_parameter_separators(f.context().source(), item); let comments = f.context().comments().clone(); let dangling = comments.dangling_comments(item); @@ -318,7 +318,7 @@ impl Format> for CommentsAroundText<'_> { /// ^ star following start /// ``` #[derive(Debug)] -pub(crate) struct ArgumentSeparator { +pub(crate) struct ParameterSeparator { /// The end of the last node or separator before this separator pub(crate) preceding_end: TextSize, /// The range of the separator itself @@ -330,10 +330,10 @@ pub(crate) struct ArgumentSeparator { /// Finds slash and star in `f(a, /, b, *, c)` or `lambda a, /, b, *, c: 1`. /// /// Returns the location of the slash and star separators, if any. -pub(crate) fn find_argument_separators( +pub(crate) fn find_parameter_separators( contents: &str, parameters: &Parameters, -) -> (Option, Option) { +) -> (Option, Option) { // We only compute preceding_end and token location here since following_start depends on the // star location, but the star location depends on slash's position let slash = if let Some(preceding_end) = parameters.posonlyargs.last().map(Ranged::end) { @@ -388,7 +388,7 @@ pub(crate) fn find_argument_separators( .expect("The function definition can't end here"); debug_assert!(star.kind() == SimpleTokenKind::Star, "{star:?}"); - Some(ArgumentSeparator { + Some(ParameterSeparator { preceding_end, separator: star.range, following_start: first_keyword_argument.start(), @@ -411,7 +411,7 @@ pub(crate) fn find_argument_separators( }; debug_assert!(star.kind() == SimpleTokenKind::Star, "{star:?}"); - Some(ArgumentSeparator { + Some(ParameterSeparator { preceding_end: parameters.range.start(), separator: star.range, following_start: first_keyword_argument.start(), @@ -434,7 +434,7 @@ pub(crate) fn find_argument_separators( .or(parameters.vararg.as_ref().map(|first| first.start())) .or(star.as_ref().map(|star| star.separator.start())) .unwrap_or(parameters.end()); - let slash = slash.map(|(preceding_end, slash)| ArgumentSeparator { + let slash = slash.map(|(preceding_end, slash)| ParameterSeparator { preceding_end, separator: slash, following_start: slash_following_start, @@ -534,12 +534,12 @@ pub(crate) fn find_argument_separators( /// ^^^^^^ keyword only parameters (kwargs) /// ``` pub(crate) fn assign_argument_separator_comment_placement( - slash: Option<&ArgumentSeparator>, - star: Option<&ArgumentSeparator>, + slash: Option<&ParameterSeparator>, + star: Option<&ParameterSeparator>, comment_range: TextRange, text_position: CommentLinePosition, ) -> Option { - if let Some(ArgumentSeparator { + if let Some(ParameterSeparator { preceding_end, separator: slash, following_start, @@ -578,7 +578,7 @@ pub(crate) fn assign_argument_separator_comment_placement( } } - if let Some(ArgumentSeparator { + if let Some(ParameterSeparator { preceding_end, separator: star, following_start, From 3d06fe743db725db76f2b4164729316099c98bb0 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 16:32:55 -0400 Subject: [PATCH 025/155] Change `model: &SemanticModel` to `semantic: &SemanticModel` (#6406) Use the same naming conventions everywhere. See: https://github.com/astral-sh/ruff/pull/6314/files#r1284457874. --- crates/ruff/src/checkers/ast/mod.rs | 5 ++-- .../rules/bad_file_permissions.rs | 8 +++--- .../rules/hardcoded_sql_expression.rs | 4 +-- .../function_call_in_argument_default.rs | 4 +-- .../rules/builtin_attribute_shadowing.rs | 6 ++--- .../flake8_pyi/rules/exit_annotations.rs | 26 +++++++++---------- .../rules/redundant_literal_union.rs | 4 +-- .../rules/no_slots_in_str_subclass.rs | 4 +-- .../perflint/rules/incorrect_dict_iterator.rs | 10 ++++--- .../pyupgrade/rules/redundant_open_modes.rs | 4 +-- ...y_iterable_allocation_for_first_element.rs | 4 +-- crates/ruff_python_semantic/src/model.rs | 4 +-- 12 files changed, 42 insertions(+), 41 deletions(-) diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs index ee0a17fee4..0cb15891ec 100644 --- a/crates/ruff/src/checkers/ast/mod.rs +++ b/crates/ruff/src/checkers/ast/mod.rs @@ -176,13 +176,12 @@ impl<'a> Checker<'a> { /// /// If the current expression in the context is not an f-string, returns ``None``. pub(crate) fn f_string_quote_style(&self) -> Option { - let model = &self.semantic; - if !model.in_f_string() { + if !self.semantic.in_f_string() { return None; } // Find the quote character used to start the containing f-string. - let expr = model.current_expression()?; + let expr = self.semantic.current_expression()?; let string_range = self.indexer.f_string_range(expr.start())?; let trailing_quote = trailing_quote(self.locator.slice(string_range))?; diff --git a/crates/ruff/src/rules/flake8_bandit/rules/bad_file_permissions.rs b/crates/ruff/src/rules/flake8_bandit/rules/bad_file_permissions.rs index 3cf3cb905b..1da82b4681 100644 --- a/crates/ruff/src/rules/flake8_bandit/rules/bad_file_permissions.rs +++ b/crates/ruff/src/rules/flake8_bandit/rules/bad_file_permissions.rs @@ -112,21 +112,21 @@ fn py_stat(call_path: &CallPath) -> Option { } } -fn int_value(expr: &Expr, model: &SemanticModel) -> Option { +fn int_value(expr: &Expr, semantic: &SemanticModel) -> Option { match expr { Expr::Constant(ast::ExprConstant { value: Constant::Int(value), .. }) => value.to_u16(), - Expr::Attribute(_) => model.resolve_call_path(expr).as_ref().and_then(py_stat), + Expr::Attribute(_) => semantic.resolve_call_path(expr).as_ref().and_then(py_stat), Expr::BinOp(ast::ExprBinOp { left, op, right, range: _, }) => { - let left_value = int_value(left, model)?; - let right_value = int_value(right, model)?; + let left_value = int_value(left, semantic)?; + let right_value = int_value(right, semantic)?; match op { Operator::BitAnd => Some(left_value & right_value), Operator::BitOr => Some(left_value | right_value), diff --git a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs index 467a0676cd..9d82380f4e 100644 --- a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs +++ b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs @@ -53,7 +53,7 @@ fn matches_sql_statement(string: &str) -> bool { SQL_REGEX.is_match(string) } -fn matches_string_format_expression(expr: &Expr, model: &SemanticModel) -> bool { +fn matches_string_format_expression(expr: &Expr, semantic: &SemanticModel) -> bool { match expr { // "select * from table where val = " + "str" + ... // "select * from table where val = %s" % ... @@ -62,7 +62,7 @@ fn matches_string_format_expression(expr: &Expr, model: &SemanticModel) -> bool .. }) => { // Only evaluate the full BinOp, not the nested components. - if model + if semantic .current_expression_parent() .map_or(true, |parent| !parent.is_bin_op_expr()) { diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs b/crates/ruff/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs index 01e52dbb67..48577e04dd 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs @@ -67,9 +67,9 @@ struct ArgumentDefaultVisitor<'a> { } impl<'a> ArgumentDefaultVisitor<'a> { - fn new(model: &'a SemanticModel<'a>, extend_immutable_calls: Vec>) -> Self { + fn new(semantic: &'a SemanticModel<'a>, extend_immutable_calls: Vec>) -> Self { Self { - semantic: model, + semantic, extend_immutable_calls, diagnostics: Vec::new(), } diff --git a/crates/ruff/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs b/crates/ruff/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs index 271bc997ce..f4069ff24b 100644 --- a/crates/ruff/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs +++ b/crates/ruff/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs @@ -131,7 +131,7 @@ pub(crate) fn builtin_method_shadowing( fn is_standard_library_override( name: &str, class_def: &ast::StmtClassDef, - model: &SemanticModel, + semantic: &SemanticModel, ) -> bool { let Some(Arguments { args: bases, .. }) = class_def.arguments.as_deref() else { return false; @@ -139,13 +139,13 @@ fn is_standard_library_override( match name { // Ex) `Event#set` "set" => bases.iter().any(|base| { - model + semantic .resolve_call_path(base) .is_some_and(|call_path| matches!(call_path.as_slice(), ["threading", "Event"])) }), // Ex) `Filter#filter` "filter" => bases.iter().any(|base| { - model + semantic .resolve_call_path(base) .is_some_and(|call_path| matches!(call_path.as_slice(), ["logging", "Filter"])) }), diff --git a/crates/ruff/src/rules/flake8_pyi/rules/exit_annotations.rs b/crates/ruff/src/rules/flake8_pyi/rules/exit_annotations.rs index fc43b9b485..5a183d94d9 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/exit_annotations.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/exit_annotations.rs @@ -242,11 +242,11 @@ fn check_positional_args( /// Return the non-`None` annotation element of a PEP 604-style union or `Optional` annotation. fn non_none_annotation_element<'a>( annotation: &'a Expr, - model: &SemanticModel, + semantic: &SemanticModel, ) -> Option<&'a Expr> { // E.g., `typing.Union` or `typing.Optional` if let Expr::Subscript(ExprSubscript { value, slice, .. }) = annotation { - if model.match_typing_expr(value, "Optional") { + if semantic.match_typing_expr(value, "Optional") { return if is_const_none(slice) { None } else { @@ -254,7 +254,7 @@ fn non_none_annotation_element<'a>( }; } - if !model.match_typing_expr(value, "Union") { + if !semantic.match_typing_expr(value, "Union") { return None; } @@ -297,8 +297,8 @@ fn non_none_annotation_element<'a>( } /// Return `true` if the [`Expr`] is the `object` builtin or the `_typeshed.Unused` type. -fn is_object_or_unused(expr: &Expr, model: &SemanticModel) -> bool { - model +fn is_object_or_unused(expr: &Expr, semantic: &SemanticModel) -> bool { + semantic .resolve_call_path(expr) .as_ref() .is_some_and(|call_path| { @@ -310,34 +310,34 @@ fn is_object_or_unused(expr: &Expr, model: &SemanticModel) -> bool { } /// Return `true` if the [`Expr`] is `BaseException`. -fn is_base_exception(expr: &Expr, model: &SemanticModel) -> bool { - model +fn is_base_exception(expr: &Expr, semantic: &SemanticModel) -> bool { + semantic .resolve_call_path(expr) .as_ref() .is_some_and(|call_path| matches!(call_path.as_slice(), ["" | "builtins", "BaseException"])) } /// Return `true` if the [`Expr`] is the `types.TracebackType` type. -fn is_traceback_type(expr: &Expr, model: &SemanticModel) -> bool { - model +fn is_traceback_type(expr: &Expr, semantic: &SemanticModel) -> bool { + semantic .resolve_call_path(expr) .as_ref() .is_some_and(|call_path| matches!(call_path.as_slice(), ["types", "TracebackType"])) } /// Return `true` if the [`Expr`] is, e.g., `Type[BaseException]`. -fn is_base_exception_type(expr: &Expr, model: &SemanticModel) -> bool { +fn is_base_exception_type(expr: &Expr, semantic: &SemanticModel) -> bool { let Expr::Subscript(ExprSubscript { value, slice, .. }) = expr else { return false; }; - if model.match_typing_expr(value, "Type") - || model + if semantic.match_typing_expr(value, "Type") + || semantic .resolve_call_path(value) .as_ref() .is_some_and(|call_path| matches!(call_path.as_slice(), ["" | "builtins", "type"])) { - is_base_exception(slice, model) + is_base_exception(slice, semantic) } else { false } diff --git a/crates/ruff/src/rules/flake8_pyi/rules/redundant_literal_union.rs b/crates/ruff/src/rules/flake8_pyi/rules/redundant_literal_union.rs index 51e333fc50..b1c112c0f9 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/redundant_literal_union.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/redundant_literal_union.rs @@ -121,7 +121,7 @@ impl fmt::Display for ExprType { /// Return the [`ExprType`] of an [`Expr]` if it is a builtin type (e.g. `int`, `bool`, `float`, /// `str`, `bytes`, or `complex`). -fn match_builtin_type(expr: &Expr, model: &SemanticModel) -> Option { +fn match_builtin_type(expr: &Expr, semantic: &SemanticModel) -> Option { let name = expr.as_name_expr()?; let result = match name.id.as_str() { "int" => ExprType::Int, @@ -132,7 +132,7 @@ fn match_builtin_type(expr: &Expr, model: &SemanticModel) -> Option { "complex" => ExprType::Complex, _ => return None, }; - if !model.is_builtin(name.id.as_str()) { + if !semantic.is_builtin(name.id.as_str()) { return None; } Some(result) diff --git a/crates/ruff/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs b/crates/ruff/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs index 45213759fb..c72057ea64 100644 --- a/crates/ruff/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs +++ b/crates/ruff/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs @@ -66,10 +66,10 @@ pub(crate) fn no_slots_in_str_subclass(checker: &mut Checker, stmt: &Stmt, class /// Return `true` if the class is a subclass of `str`, but _not_ a subclass of `enum.Enum`, /// `enum.IntEnum`, etc. -fn is_str_subclass(bases: &[Expr], model: &SemanticModel) -> bool { +fn is_str_subclass(bases: &[Expr], semantic: &SemanticModel) -> bool { let mut is_str_subclass = false; for base in bases { - if let Some(call_path) = model.resolve_call_path(base) { + if let Some(call_path) = semantic.resolve_call_path(base) { match call_path.as_slice() { ["" | "builtins", "str"] => { is_str_subclass = true; diff --git a/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs b/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs index 58e1ed7e07..0419d1790b 100644 --- a/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs +++ b/crates/ruff/src/rules/perflint/rules/incorrect_dict_iterator.rs @@ -148,9 +148,11 @@ impl fmt::Display for DictSubset { } /// Returns `true` if the given expression is either an unused value or a tuple of unused values. -fn is_unused(expr: &Expr, model: &SemanticModel) -> bool { +fn is_unused(expr: &Expr, semantic: &SemanticModel) -> bool { match expr { - Expr::Tuple(ast::ExprTuple { elts, .. }) => elts.iter().all(|expr| is_unused(expr, model)), + Expr::Tuple(ast::ExprTuple { elts, .. }) => { + elts.iter().all(|expr| is_unused(expr, semantic)) + } Expr::Name(ast::ExprName { id, .. }) => { // Treat a variable as used if it has any usages, _or_ it's shadowed by another variable // with usages. @@ -167,10 +169,10 @@ fn is_unused(expr: &Expr, model: &SemanticModel) -> bool { // // print(bar) // ``` - let scope = model.current_scope(); + let scope = semantic.current_scope(); scope .get_all(id) - .map(|binding_id| model.binding(binding_id)) + .map(|binding_id| semantic.binding(binding_id)) .filter(|binding| binding.range.start() >= expr.range().start()) .all(|binding| !binding.is_used()) } diff --git a/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs b/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs index d09ec73155..cddf140161 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs @@ -116,11 +116,11 @@ const OPEN_FUNC_NAME: &str = "open"; const MODE_KEYWORD_ARGUMENT: &str = "mode"; /// Returns `true` if the given `call` is a call to the `open` builtin. -fn is_open_builtin(func: &Expr, model: &SemanticModel) -> bool { +fn is_open_builtin(func: &Expr, semantic: &SemanticModel) -> bool { let Some(ast::ExprName { id, .. }) = func.as_name_expr() else { return false; }; - id.as_str() == OPEN_FUNC_NAME && model.is_builtin(id) + id.as_str() == OPEN_FUNC_NAME && semantic.is_builtin(id) } #[derive(Debug, Copy, Clone)] diff --git a/crates/ruff/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs b/crates/ruff/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs index ec61a8b4f9..13c581fdc4 100644 --- a/crates/ruff/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs +++ b/crates/ruff/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs @@ -149,7 +149,7 @@ struct IterationTarget { /// /// As a special-case, given `[x for x in y]`, returns the range of `y` (rather than the /// redundant comprehension). -fn match_iteration_target(expr: &Expr, model: &SemanticModel) -> Option { +fn match_iteration_target(expr: &Expr, semantic: &SemanticModel) -> Option { let result = match expr { Expr::Call(ast::ExprCall { func, @@ -166,7 +166,7 @@ fn match_iteration_target(expr: &Expr, model: &SemanticModel) -> Option SemanticModel<'a> { exceptions } - /// Generate a [`Snapshot`] of the current model. + /// Generate a [`Snapshot`] of the current semantic model. pub fn snapshot(&self) -> Snapshot { Snapshot { scope_id: self.scope_id, @@ -1124,7 +1124,7 @@ impl<'a> SemanticModel<'a> { } } - /// Restore the model to the given [`Snapshot`]. + /// Restore the semantic model to the given [`Snapshot`]. pub fn restore(&mut self, snapshot: Snapshot) { let Snapshot { scope_id, From 927cfc9564124688541030525aadd0a5e03c8037 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 7 Aug 2023 16:33:01 -0400 Subject: [PATCH 026/155] Respect file-level `# ruff: noqa` suppressions for `unused-noqa` rule (#6405) ## Summary We weren't respecting `# ruff: noqa: RUF100`, i.e., file-level suppressions for the `unused-noqa` rule itself. Closes https://github.com/astral-sh/ruff/issues/6385. --- crates/ruff/resources/test/fixtures/ruff/RUF100_4.py | 5 +++++ crates/ruff/src/checkers/noqa.rs | 11 +++++++++-- crates/ruff/src/rules/ruff/mod.rs | 10 ++++++++++ .../snapshots/ruff__rules__ruff__tests__ruf100_4.snap | 4 ++++ 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 crates/ruff/resources/test/fixtures/ruff/RUF100_4.py create mode 100644 crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__ruf100_4.snap diff --git a/crates/ruff/resources/test/fixtures/ruff/RUF100_4.py b/crates/ruff/resources/test/fixtures/ruff/RUF100_4.py new file mode 100644 index 0000000000..51830749f5 --- /dev/null +++ b/crates/ruff/resources/test/fixtures/ruff/RUF100_4.py @@ -0,0 +1,5 @@ +# ruff: noqa: RUF100 + +import os # noqa: F401 + +print(os.sep) diff --git a/crates/ruff/src/checkers/noqa.rs b/crates/ruff/src/checkers/noqa.rs index 2916ad7339..78455814d3 100644 --- a/crates/ruff/src/checkers/noqa.rs +++ b/crates/ruff/src/checkers/noqa.rs @@ -94,8 +94,15 @@ pub(crate) fn check_noqa( } } - // Enforce that the noqa directive was actually used (RUF100). - if analyze_directives && settings.rules.enabled(Rule::UnusedNOQA) { + // Enforce that the noqa directive was actually used (RUF100), unless RUF100 was itself + // suppressed. + if settings.rules.enabled(Rule::UnusedNOQA) + && analyze_directives + && !exemption.is_some_and(|exemption| match exemption { + FileExemption::All => true, + FileExemption::Codes(codes) => codes.contains(&Rule::UnusedNOQA.noqa_code()), + }) + { for line in noqa_directives.lines() { match &line.directive { Directive::All(directive) => { diff --git a/crates/ruff/src/rules/ruff/mod.rs b/crates/ruff/src/rules/ruff/mod.rs index 42350547ab..16b6ac7a48 100644 --- a/crates/ruff/src/rules/ruff/mod.rs +++ b/crates/ruff/src/rules/ruff/mod.rs @@ -156,6 +156,16 @@ mod tests { Ok(()) } + #[test] + fn ruf100_4() -> Result<()> { + let diagnostics = test_path( + Path::new("ruff/RUF100_4.py"), + &settings::Settings::for_rules(vec![Rule::UnusedNOQA, Rule::UnusedImport]), + )?; + assert_messages!(diagnostics); + Ok(()) + } + #[test] fn flake8_noqa() -> Result<()> { let diagnostics = test_path( diff --git a/crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__ruf100_4.snap b/crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__ruf100_4.snap new file mode 100644 index 0000000000..e51f71f811 --- /dev/null +++ b/crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__ruf100_4.snap @@ -0,0 +1,4 @@ +--- +source: crates/ruff/src/rules/ruff/mod.rs +--- + From 90c9aa2992a93d811fa3d7ea8b2972200cd71488 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 7 Aug 2023 16:22:06 -0500 Subject: [PATCH 027/155] Add support for simple generic type variables to UP040 (#6314) Extends #6289 to support moving type variable usage in type aliases to use PEP-695. Does not remove the possibly unused type variable declaration. Presumably this is handled by other rules, but is not working for me. Does not handle type variables with bounds or variance declarations yet. Part of #4617 --- .../test/fixtures/pyupgrade/UP040.py | 35 ++- .../pyupgrade/rules/use_pep695_type_alias.rs | 95 ++++++++- ...e__tests__non_pep695_type_alias_py312.snap | 201 ++++++++++++++++-- 3 files changed, 312 insertions(+), 19 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pyupgrade/UP040.py b/crates/ruff/resources/test/fixtures/pyupgrade/UP040.py index 69854a8af7..49fb6f7c84 100644 --- a/crates/ruff/resources/test/fixtures/pyupgrade/UP040.py +++ b/crates/ruff/resources/test/fixtures/pyupgrade/UP040.py @@ -5,11 +5,42 @@ from typing import TypeAlias x: typing.TypeAlias = int x: TypeAlias = int - -# UP040 with generics (todo) +# UP040 simple generic T = typing.TypeVar["T"] x: typing.TypeAlias = list[T] +# UP040 call style generic +T = typing.TypeVar("T") +x: typing.TypeAlias = list[T] + +# UP040 bounded generic (todo) +T = typing.TypeVar("T", bound=int) +x: typing.TypeAlias = list[T] + +T = typing.TypeVar("T", int, str) +x: typing.TypeAlias = list[T] + +# UP040 contravariant generic (todo) +T = typing.TypeVar("T", contravariant=True) +x: typing.TypeAlias = list[T] + +# UP040 covariant generic (todo) +T = typing.TypeVar("T", covariant=True) +x: typing.TypeAlias = list[T] + +# UP040 in class scope +T = typing.TypeVar["T"] +class Foo: + # reference to global variable + x: typing.TypeAlias = list[T] + + # reference to class variable + TCLS = typing.TypeVar["TCLS"] + y: typing.TypeAlias = list[TCLS] + +# UP040 wont add generics in fix +T = typing.TypeVar(*args) +x: typing.TypeAlias = list[T] # OK x: TypeAlias diff --git a/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs b/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs index 64d00f6a80..3db1ec67df 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs @@ -1,4 +1,11 @@ -use ruff_python_ast::{Expr, ExprName, Ranged, Stmt, StmtAnnAssign, StmtTypeAlias}; +use ast::{Constant, ExprCall, ExprConstant}; +use ruff_python_ast::{ + self as ast, + visitor::{self, Visitor}, + Expr, ExprName, ExprSubscript, Identifier, Ranged, Stmt, StmtAnnAssign, StmtAssign, + StmtTypeAlias, TypeParam, TypeParamTypeVar, +}; +use ruff_python_semantic::SemanticModel; use crate::{registry::AsRule, settings::types::PythonVersion}; use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation}; @@ -75,11 +82,36 @@ pub(crate) fn non_pep695_type_alias(checker: &mut Checker, stmt: &StmtAnnAssign) // as type params instead let mut diagnostic = Diagnostic::new(NonPEP695TypeAlias { name: name.clone() }, stmt.range()); if checker.patch(diagnostic.kind.rule()) { + let mut visitor = TypeVarReferenceVisitor { + names: vec![], + semantic: checker.semantic(), + }; + visitor.visit_expr(value); + + let type_params = if visitor.names.is_empty() { + None + } else { + Some(ast::TypeParams { + range: TextRange::default(), + type_params: visitor + .names + .iter() + .map(|name| { + TypeParam::TypeVar(TypeParamTypeVar { + range: TextRange::default(), + name: Identifier::new(name.id.clone(), TextRange::default()), + bound: None, + }) + }) + .collect(), + }) + }; + diagnostic.set_fix(Fix::automatic(Edit::range_replacement( checker.generator().stmt(&Stmt::from(StmtTypeAlias { range: TextRange::default(), name: target.clone(), - type_params: None, + type_params, value: value.clone(), })), stmt.range(), @@ -87,3 +119,62 @@ pub(crate) fn non_pep695_type_alias(checker: &mut Checker, stmt: &StmtAnnAssign) } checker.diagnostics.push(diagnostic); } + +struct TypeVarReferenceVisitor<'a> { + names: Vec<&'a ExprName>, + semantic: &'a SemanticModel<'a>, +} + +/// Recursively collects the names of type variable references present in an expression. +impl<'a> Visitor<'a> for TypeVarReferenceVisitor<'a> { + fn visit_expr(&mut self, expr: &'a Expr) { + match expr { + Expr::Name(name) if name.ctx.is_load() => { + let Some(Stmt::Assign(StmtAssign { value, .. })) = + self.semantic.lookup_symbol(name.id.as_str()) + .and_then(|binding_id| { + self.semantic + .binding(binding_id) + .source + .map(|node_id| self.semantic.statement(node_id)) + }) else { + return; + }; + + match value.as_ref() { + Expr::Subscript(ExprSubscript { + value: ref subscript_value, + .. + }) => { + if self.semantic.match_typing_expr(subscript_value, "TypeVar") { + self.names.push(name); + } + } + Expr::Call(ExprCall { + func, arguments, .. + }) => { + // TODO(zanieb): Add support for bounds and variance declarations + // for now this only supports `TypeVar("...")` + if self.semantic.match_typing_expr(func, "TypeVar") + && arguments.args.len() == 1 + && arguments.args.first().is_some_and(|arg| { + matches!( + arg, + Expr::Constant(ExprConstant { + value: Constant::Str(_), + .. + }) + ) + }) + && arguments.keywords.is_empty() + { + self.names.push(name); + } + } + _ => {} + } + } + _ => visitor::walk_expr(self, expr), + } + } +} diff --git a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__non_pep695_type_alias_py312.snap b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__non_pep695_type_alias_py312.snap index c46a4b8879..33d0e3b165 100644 --- a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__non_pep695_type_alias_py312.snap +++ b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__non_pep695_type_alias_py312.snap @@ -18,7 +18,7 @@ UP040.py:5:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of th 5 |+type x = int 6 6 | x: TypeAlias = int 7 7 | -8 8 | +8 8 | # UP040 simple generic UP040.py:6:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword | @@ -26,6 +26,8 @@ UP040.py:6:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of th 5 | x: typing.TypeAlias = int 6 | x: TypeAlias = int | ^^^^^^^^^^^^^^^^^^ UP040 +7 | +8 | # UP040 simple generic | = help: Use the `type` keyword @@ -36,26 +38,195 @@ UP040.py:6:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of th 6 |-x: TypeAlias = int 6 |+type x = int 7 7 | -8 8 | -9 9 | # UP040 with generics (todo) +8 8 | # UP040 simple generic +9 9 | T = typing.TypeVar["T"] -UP040.py:11:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword +UP040.py:10:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword | - 9 | # UP040 with generics (todo) -10 | T = typing.TypeVar["T"] -11 | x: typing.TypeAlias = list[T] + 8 | # UP040 simple generic + 9 | T = typing.TypeVar["T"] +10 | x: typing.TypeAlias = list[T] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +11 | +12 | # UP040 call style generic | = help: Use the `type` keyword ℹ Fix -8 8 | -9 9 | # UP040 with generics (todo) -10 10 | T = typing.TypeVar["T"] -11 |-x: typing.TypeAlias = list[T] - 11 |+type x = list[T] -12 12 | -13 13 | -14 14 | # OK +7 7 | +8 8 | # UP040 simple generic +9 9 | T = typing.TypeVar["T"] +10 |-x: typing.TypeAlias = list[T] + 10 |+type x[T] = list[T] +11 11 | +12 12 | # UP040 call style generic +13 13 | T = typing.TypeVar("T") + +UP040.py:14:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword + | +12 | # UP040 call style generic +13 | T = typing.TypeVar("T") +14 | x: typing.TypeAlias = list[T] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +15 | +16 | # UP040 bounded generic (todo) + | + = help: Use the `type` keyword + +ℹ Fix +11 11 | +12 12 | # UP040 call style generic +13 13 | T = typing.TypeVar("T") +14 |-x: typing.TypeAlias = list[T] + 14 |+type x[T] = list[T] +15 15 | +16 16 | # UP040 bounded generic (todo) +17 17 | T = typing.TypeVar("T", bound=int) + +UP040.py:18:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword + | +16 | # UP040 bounded generic (todo) +17 | T = typing.TypeVar("T", bound=int) +18 | x: typing.TypeAlias = list[T] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +19 | +20 | T = typing.TypeVar("T", int, str) + | + = help: Use the `type` keyword + +ℹ Fix +15 15 | +16 16 | # UP040 bounded generic (todo) +17 17 | T = typing.TypeVar("T", bound=int) +18 |-x: typing.TypeAlias = list[T] + 18 |+type x = list[T] +19 19 | +20 20 | T = typing.TypeVar("T", int, str) +21 21 | x: typing.TypeAlias = list[T] + +UP040.py:21:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword + | +20 | T = typing.TypeVar("T", int, str) +21 | x: typing.TypeAlias = list[T] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +22 | +23 | # UP040 contravariant generic (todo) + | + = help: Use the `type` keyword + +ℹ Fix +18 18 | x: typing.TypeAlias = list[T] +19 19 | +20 20 | T = typing.TypeVar("T", int, str) +21 |-x: typing.TypeAlias = list[T] + 21 |+type x = list[T] +22 22 | +23 23 | # UP040 contravariant generic (todo) +24 24 | T = typing.TypeVar("T", contravariant=True) + +UP040.py:25:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword + | +23 | # UP040 contravariant generic (todo) +24 | T = typing.TypeVar("T", contravariant=True) +25 | x: typing.TypeAlias = list[T] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +26 | +27 | # UP040 covariant generic (todo) + | + = help: Use the `type` keyword + +ℹ Fix +22 22 | +23 23 | # UP040 contravariant generic (todo) +24 24 | T = typing.TypeVar("T", contravariant=True) +25 |-x: typing.TypeAlias = list[T] + 25 |+type x = list[T] +26 26 | +27 27 | # UP040 covariant generic (todo) +28 28 | T = typing.TypeVar("T", covariant=True) + +UP040.py:29:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword + | +27 | # UP040 covariant generic (todo) +28 | T = typing.TypeVar("T", covariant=True) +29 | x: typing.TypeAlias = list[T] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +30 | +31 | # UP040 in class scope + | + = help: Use the `type` keyword + +ℹ Fix +26 26 | +27 27 | # UP040 covariant generic (todo) +28 28 | T = typing.TypeVar("T", covariant=True) +29 |-x: typing.TypeAlias = list[T] + 29 |+type x = list[T] +30 30 | +31 31 | # UP040 in class scope +32 32 | T = typing.TypeVar["T"] + +UP040.py:35:5: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword + | +33 | class Foo: +34 | # reference to global variable +35 | x: typing.TypeAlias = list[T] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +36 | +37 | # reference to class variable + | + = help: Use the `type` keyword + +ℹ Fix +32 32 | T = typing.TypeVar["T"] +33 33 | class Foo: +34 34 | # reference to global variable +35 |- x: typing.TypeAlias = list[T] + 35 |+ type x[T] = list[T] +36 36 | +37 37 | # reference to class variable +38 38 | TCLS = typing.TypeVar["TCLS"] + +UP040.py:39:5: UP040 [*] Type alias `y` uses `TypeAlias` annotation instead of the `type` keyword + | +37 | # reference to class variable +38 | TCLS = typing.TypeVar["TCLS"] +39 | y: typing.TypeAlias = list[TCLS] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +40 | +41 | # UP040 wont add generics in fix + | + = help: Use the `type` keyword + +ℹ Fix +36 36 | +37 37 | # reference to class variable +38 38 | TCLS = typing.TypeVar["TCLS"] +39 |- y: typing.TypeAlias = list[TCLS] + 39 |+ type y[TCLS] = list[TCLS] +40 40 | +41 41 | # UP040 wont add generics in fix +42 42 | T = typing.TypeVar(*args) + +UP040.py:43:1: UP040 [*] Type alias `x` uses `TypeAlias` annotation instead of the `type` keyword + | +41 | # UP040 wont add generics in fix +42 | T = typing.TypeVar(*args) +43 | x: typing.TypeAlias = list[T] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP040 +44 | +45 | # OK + | + = help: Use the `type` keyword + +ℹ Fix +40 40 | +41 41 | # UP040 wont add generics in fix +42 42 | T = typing.TypeVar(*args) +43 |-x: typing.TypeAlias = list[T] + 43 |+type x = list[T] +44 44 | +45 45 | # OK +46 46 | x: TypeAlias From 6df5ab40987cba7bb5681c2445caaf83ebcfbf7d Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Mon, 7 Aug 2023 17:08:51 -0700 Subject: [PATCH 028/155] Remove duplicate line from project structure docs (#6408) Signed-off-by: Anders Kaseorg --- CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc73c69cbb..df06b40efc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -131,7 +131,6 @@ At time of writing, the repository includes the following crates: - `crates/ruff_macros`: proc macro crate containing macros used by Ruff. - `crates/ruff_python_ast`: library crate containing Python-specific AST types and utilities. - `crates/ruff_python_codegen`: library crate containing utilities for generating Python source code. -- `crates/ruff_python_codegen`: library crate containing utilities for generating Python source code. - `crates/ruff_python_formatter`: library crate implementing the Python formatter. Emits an intermediate representation for each node, which `ruff_formatter` prints based on the configured line length. From 289d1e85bfc11b1c8137cb9c88da9386d1cc6491 Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Tue, 8 Aug 2023 09:14:18 +0530 Subject: [PATCH 029/155] Manually parenthesize tuple expr in `B014` autofix (#6415) ## Summary Manually add the parentheses around tuple expressions for the autofix in `B014`. This is also done in various other autofixes as well such as for [`RUF005`](https://github.com/astral-sh/ruff/blob/6df5ab40987cba7bb5681c2445caaf83ebcfbf7d/crates/ruff/src/rules/ruff/rules/collection_literal_concatenation.rs#L183-L184), [`UP024`](https://github.com/astral-sh/ruff/blob/6df5ab40987cba7bb5681c2445caaf83ebcfbf7d/crates/ruff/src/rules/pyupgrade/rules/os_error_alias.rs#L137-L137). ### Alternate Solution An alternate solution would be to fix this in the `Generator` itself by checking if the tuple expression needs to be generated at the top-level or not. If so, then always add the parentheses. ```rust } else if level == 0 { // Top-level tuples are always parenthesized. self.p("("); let mut first = true; for elt in elts { self.p_delim(&mut first, ", "); self.unparse_expr(elt, precedence::COMMA); } self.p_if(elts.len() == 1, ","); self.p(")"); ``` ## Test Plan Add a regression test for this case in `B014`. fixes: #6412 --- .../test/fixtures/flake8_bugbear/B014.py | 7 +++++++ .../rules/duplicate_exceptions.rs | 4 +++- ...s__flake8_bugbear__tests__B014_B014.py.snap | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_bugbear/B014.py b/crates/ruff/resources/test/fixtures/flake8_bugbear/B014.py index 38473457b3..8a03e75121 100644 --- a/crates/ruff/resources/test/fixtures/flake8_bugbear/B014.py +++ b/crates/ruff/resources/test/fixtures/flake8_bugbear/B014.py @@ -74,3 +74,10 @@ try: except (ValueError, binascii.Error): # binascii.Error is a subclass of ValueError. pass + + +# https://github.com/astral-sh/ruff/issues/6412 +try: + pass +except (ValueError, ValueError, TypeError): + pass diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs b/crates/ruff/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs index 6f6fbe550a..01dd70f639 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs @@ -150,7 +150,9 @@ fn duplicate_handler_exceptions<'a>( if unique_elts.len() == 1 { checker.generator().expr(unique_elts[0]) } else { - checker.generator().expr(&type_pattern(unique_elts)) + // Multiple exceptions must always be parenthesized. This is done + // manually as the generator never parenthesizes lone tuples. + format!("({})", checker.generator().expr(&type_pattern(unique_elts))) }, expr.range(), ))); diff --git a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B014_B014.py.snap b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B014_B014.py.snap index bb8fb6c3c2..52e3ea5167 100644 --- a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B014_B014.py.snap +++ b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B014_B014.py.snap @@ -64,4 +64,22 @@ B014.py:49:8: B014 [*] Exception handler with duplicate exception: `re.error` 51 51 | pass 52 52 | +B014.py:82:8: B014 [*] Exception handler with duplicate exception: `ValueError` + | +80 | try: +81 | pass +82 | except (ValueError, ValueError, TypeError): + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ B014 +83 | pass + | + = help: De-duplicate exceptions + +ℹ Fix +79 79 | # https://github.com/astral-sh/ruff/issues/6412 +80 80 | try: +81 81 | pass +82 |-except (ValueError, ValueError, TypeError): + 82 |+except (ValueError, TypeError): +83 83 | pass + From 2bd345358f14a21ecf52b5514d6b5dbe3e8cbca0 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Tue, 8 Aug 2023 10:50:57 +0200 Subject: [PATCH 030/155] Simplify `parenthesized` formatting (#6419) --- .../src/expression/parentheses.rs | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/crates/ruff_python_formatter/src/expression/parentheses.rs b/crates/ruff_python_formatter/src/expression/parentheses.rs index 9e72231172..9c2a962bcc 100644 --- a/crates/ruff_python_formatter/src/expression/parentheses.rs +++ b/crates/ruff_python_formatter/src/expression/parentheses.rs @@ -144,22 +144,13 @@ impl<'content, 'ast> FormatParenthesized<'content, 'ast> { impl<'ast> Format> for FormatParenthesized<'_, 'ast> { fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> { let inner = format_with(|f| { - if self.comments.is_empty() { - group(&format_args![ - text(self.left), - &soft_block_indent(&Arguments::from(&self.content)), - text(self.right) - ]) - .fmt(f) - } else { - group(&format_args![ - text(self.left), - &dangling_open_parenthesis_comments(self.comments), - &soft_block_indent(&Arguments::from(&self.content)), - text(self.right) - ]) - .fmt(f) - } + group(&format_args![ + text(self.left), + &dangling_open_parenthesis_comments(self.comments), + &soft_block_indent(&Arguments::from(&self.content)), + text(self.right) + ]) + .fmt(f) }); let current_level = f.context().node_level(); From 90ba40c23c4a179637da81f5a38f50b2f4b4951c Mon Sep 17 00:00:00 2001 From: konsti Date: Tue, 8 Aug 2023 11:15:35 +0200 Subject: [PATCH 031/155] Fix zulip unstable formatting with end-of-line comments (#6386) ## Bug Given ```python x = () - (# ) ``` the comment is a dangling comment of the empty tuple. This is an end-of-line comment so it may move after the expression. It still expands the parent, so the operator breaks: ```python x = ( () - () # ) ``` In the next formatting pass, the comment is not a trailing tuple but a trailing bin op comment, so the bin op doesn't break anymore. The comment again expands the parent, so we still add the superfluous parentheses ```python x = ( () - () # ) ``` ## Fix The new formatting is to keep the comment on the empty tuple. This is a log uglier and again has additional outer parentheses, but it's stable: ```python x = ( () - ( # ) ) ``` ## Alternatives Black formats all the examples above as ```python x = () - () # ``` which i find better. I would be happy about any suggestions for better solutions than the current one. I'd mainly need a workaround for expand parent having an effect on the bin op instead of first moving the comment to the end and then applying expand parent to the assign statement. --- .../test/fixtures/ruff/expression/binary.py | 11 +++++++++ .../test/fixtures/ruff/statement/delete.py | 4 ++++ crates/ruff_python_formatter/src/builders.rs | 10 ++++++++ .../format@expression__binary.py.snap | 24 +++++++++++++++++++ .../snapshots/format@expression__call.py.snap | 3 ++- .../snapshots/format@expression__dict.py.snap | 3 ++- .../format@expression__lambda.py.snap | 3 ++- .../snapshots/format@expression__list.py.snap | 6 +++-- .../format@statement__delete.py.snap | 11 ++++++++- .../format@statement__function.py.snap | 3 ++- .../snapshots/format@statement__raise.py.snap | 3 ++- 11 files changed, 73 insertions(+), 8 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/binary.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/binary.py index 30cf4c4465..572518635e 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/binary.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/binary.py @@ -211,3 +211,14 @@ for user_id in set(target_user_ids) - {u.user_id for u in updates}: log(self.price / self.strike) + (self.risk_free - self.div_cont + 0.5 * (self.sigma**2)) * self.exp_time ) / self.sigmaT + +# Stability with end-of-line comments between empty tuples and bin op +x = () - (# +) +x = ( + () + - () # +) +x = ( + () - () # +) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/delete.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/delete.py index c8ca7da9d7..a86c65dde8 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/delete.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/delete.py @@ -73,3 +73,7 @@ del ( del ( # dangling end of line comment ) + +del ( # dangling end of line comment + # dangling own line comment +) # trailing statement comment diff --git a/crates/ruff_python_formatter/src/builders.rs b/crates/ruff_python_formatter/src/builders.rs index 8acf770044..5d7e0c2c3f 100644 --- a/crates/ruff_python_formatter/src/builders.rs +++ b/crates/ruff_python_formatter/src/builders.rs @@ -253,6 +253,16 @@ impl<'ast> Format> for EmptyWithDanglingComments<'_> { self.opening, // end-of-line comments trailing_comments(&self.comments[..end_of_line_split]), + // Avoid unstable formatting with + // ```python + // x = () - (# + // ) + // ``` + // Without this the comment would go after the empty tuple first, but still expand + // the bin op. In the second formatting pass they are trailing bin op comments + // so the bin op collapse. Suboptimally we keep parentheses around the bin op in + // either case. + (!self.comments[..end_of_line_split].is_empty()).then_some(hard_line_break()), // own line comments, which need to be indented soft_block_indent(&dangling_comments(&self.comments[end_of_line_split..])), self.closing diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__binary.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__binary.py.snap index 61499e20e3..172b318812 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__binary.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__binary.py.snap @@ -217,6 +217,17 @@ for user_id in set(target_user_ids) - {u.user_id for u in updates}: log(self.price / self.strike) + (self.risk_free - self.div_cont + 0.5 * (self.sigma**2)) * self.exp_time ) / self.sigmaT + +# Stability with end-of-line comments between empty tuples and bin op +x = () - (# +) +x = ( + () + - () # +) +x = ( + () - () # +) ``` ## Output @@ -488,6 +499,19 @@ for user_id in set(target_user_ids) - {u.user_id for u in updates}: log(self.price / self.strike) + (self.risk_free - self.div_cont + 0.5 * (self.sigma**2)) * self.exp_time ) / self.sigmaT + +# Stability with end-of-line comments between empty tuples and bin op +x = ( + () + - ( # + ) +) +x = ( + () - () # +) +x = ( + () - () # +) ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap index 45bcc8a76a..86880bd396 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap @@ -213,7 +213,8 @@ f( a.very_long_function_function_that_is_so_long_that_it_expands_the_parent_but_its_only_a_single_argument() ) -f() # abc +f( # abc +) f( # abc # abc diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__dict.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__dict.py.snap index e27a63126d..a5b6c5e896 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__dict.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__dict.py.snap @@ -129,7 +129,8 @@ a = { 3: True, } -x = {} # dangling end of line comment +x = { # dangling end of line comment +} ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap index 6937a6e5e1..2d126b3408 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap @@ -165,7 +165,8 @@ a = ( # Regression test: lambda empty arguments ranges were too long, leading to unstable # formatting ( - lambda: (), # + lambda: ( # + ), ) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap index 04f9c816e3..ff883a8f45 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap @@ -62,7 +62,8 @@ c1 = [ # trailing open bracket ```py # Dangling comment placement in empty lists # Regression test for https://github.com/python/cpython/blob/03160630319ca26dcbbad65225da4248e54c45ec/Tools/c-analyzer/c_analyzer/datafiles.py#L14-L16 -a1 = [] # a +a1 = [ # a +] a2 = [ # a # b ] @@ -93,7 +94,8 @@ c1 = [ # trailing open bracket ] # trailing close bracket -[] # end-of-line comment +[ # end-of-line comment +] [ # end-of-line comment # own-line comment diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__delete.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__delete.py.snap index 39a4afbc07..ce4add0b94 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__delete.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__delete.py.snap @@ -79,6 +79,10 @@ del ( del ( # dangling end of line comment ) + +del ( # dangling end of line comment + # dangling own line comment +) # trailing statement comment ``` ## Output @@ -215,7 +219,12 @@ del ( ) # Completed # Done -del () # dangling end of line comment +del ( # dangling end of line comment +) + +del ( # dangling end of line comment + # dangling own line comment +) # trailing statement comment ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index 8a7676fce9..7f77fc37ab 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -845,7 +845,8 @@ def f( # first ... -def f(): # first # second +def f( # first +): # second ... diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap index db7ed62b73..1c9746b12a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap @@ -192,7 +192,8 @@ raise aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfk < ( ) # the other end # sneaky comment -raise () # another comment +raise ( # another comment +) raise () # what now From 6aefe71c565b402c8045ea74b09331be4f69bafb Mon Sep 17 00:00:00 2001 From: Piotr Date: Tue, 8 Aug 2023 11:24:41 +0200 Subject: [PATCH 032/155] Fix name of rule in example of `extend-per-file-ignores` in options.rs (#6417) ## Summary Fix name of rule in example of `extend-per-file-ignores` in `options.rs` file. It was `E401` but in configuration example `E402` was listed. Just a tiny mismatch. ## Test Plan Just by my eyes :). --- crates/ruff/src/settings/options.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ruff/src/settings/options.rs b/crates/ruff/src/settings/options.rs index 4fe3ecf819..5e3ea14207 100644 --- a/crates/ruff/src/settings/options.rs +++ b/crates/ruff/src/settings/options.rs @@ -596,7 +596,7 @@ pub struct Options { default = "{}", value_type = "dict[str, list[RuleSelector]]", example = r#" - # Also ignore `E401` in all `__init__.py` files. + # Also ignore `E402` in all `__init__.py` files. [tool.ruff.extend-per-file-ignores] "__init__.py" = ["E402"] "# From 87984e9ac7387204c49703d9dcf50237b5a33d89 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 8 Aug 2023 08:45:20 -0400 Subject: [PATCH 033/155] Expand parents whenever open-parenthesis comments are present (#6389) ## Summary This PR modifies our dangling-open-parenthesis handling to _always_ expand the parent expression. So, for example, given: ```python a = int( # type: ignore int( # type: ignore int( # type: ignore 6 ) ) ) ``` We now retain that as stable formatting, instead of truncating like: ```python a = int(int(int(6))) # comment # comment # comment ``` Note that Black _does_ collapse comments like this _unless_ they're `# type: ignore` comments, and perhaps in some other cases, so this is an intentional deviation ([playground](https://black.vercel.app/?version=main&state=_Td6WFoAAATm1rRGAgAhARYAAAB0L-Wj4AFEAHpdAD2IimZxl1N_WlOfrjryFgvD4ScVsKPztqdHDGJUg5knO0JCdpUfW1IrWSNmIJPx95s0hP-pRNkCQNH64-eIznIvXjeWBQ5-qax0oNw4yMOuhwr2azvMRZaEB5r8IXVPHmRCJp7fe7y4290u1zzxqK_nAi6q_5sI-jsAAAAA8HgZ9V7hG3QAAZYBxQIAAGnCHXexxGf7AgAAAAAEWVo=)). --- .../src/comments/format.rs | 9 +++---- ...onsecutive_open_parentheses_ignore.py.snap | 26 +++++++++++-------- ...ompatibility@simple_cases__torture.py.snap | 11 +++++--- .../snapshots/format@expression__call.py.snap | 4 ++- .../format@expression__dict_comp.py.snap | 5 +++- .../snapshots/format@expression__list.py.snap | 10 +++++-- .../format@statement__function.py.snap | 4 ++- 7 files changed, 44 insertions(+), 25 deletions(-) diff --git a/crates/ruff_python_formatter/src/comments/format.rs b/crates/ruff_python_formatter/src/comments/format.rs index 29781c38a6..316f4b5ae2 100644 --- a/crates/ruff_python_formatter/src/comments/format.rs +++ b/crates/ruff_python_formatter/src/comments/format.rs @@ -260,11 +260,10 @@ impl Format> for FormatDanglingOpenParenthesisComments<'_> { write!( f, - [line_suffix(&format_args![ - space(), - space(), - format_comment(comment) - ])] + [ + line_suffix(&format_args![space(), space(), format_comment(comment)]), + expand_parent() + ] )?; comment.mark_formatted(); diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap index 1c0ac7dd11..a99e1bf762 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap @@ -33,20 +33,18 @@ print( "111" ) # type: ignore ```diff --- Black +++ Ruff -@@ -1,12 +1,6 @@ +@@ -1,9 +1,9 @@ # This is a regression test. Issue #3737 -a = ( # type: ignore -- int( # type: ignore -- int( # type: ignore ++a = int( # type: ignore # type: ignore + int( # type: ignore + int( # type: ignore - int(6) # type: ignore -- ) -- ) --) -+a = int(int(int(6))) # type: ignore # type: ignore # type: ignore # type: ignore - - b = int(6) - ++ 6 + ) + ) + ) ``` ## Ruff Output @@ -54,7 +52,13 @@ print( "111" ) # type: ignore ```py # This is a regression test. Issue #3737 -a = int(int(int(6))) # type: ignore # type: ignore # type: ignore # type: ignore +a = int( # type: ignore # type: ignore + int( # type: ignore + int( # type: ignore + 6 + ) + ) +) b = int(6) diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap index 69341cf627..f44e1053f0 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap @@ -50,14 +50,15 @@ assert ( ) # assert sort_by_dependency( -@@ -25,9 +25,7 @@ +@@ -25,9 +25,9 @@ class A: def foo(self): for _ in range(10): - aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc( -- xxxxxxxxxxxx ++ aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc( # pylint: disable=no-member + xxxxxxxxxxxx - ) # pylint: disable=no-member -+ aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc(xxxxxxxxxxxx) # pylint: disable=no-member ++ ) def test(self, othr): @@ -93,7 +94,9 @@ importA class A: def foo(self): for _ in range(10): - aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc(xxxxxxxxxxxx) # pylint: disable=no-member + aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc( # pylint: disable=no-member + xxxxxxxxxxxx + ) def test(self, othr): diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap index 86880bd396..283a06b31a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap @@ -224,7 +224,9 @@ f( # abc ) -f(1) # abc +f( # abc + 1 +) f( # abc diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap index 190d80a451..4d725fc27c 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap @@ -265,7 +265,10 @@ selected_choices = { { k: v - for (x, aaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaay) in z # foo + for ( # foo + x, + aaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaay, + ) in z } a = { diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap index ff883a8f45..a4b60d427a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap @@ -101,9 +101,15 @@ c1 = [ # trailing open bracket # own-line comment ] -[1] # end-of-line comment +[ # end-of-line comment + 1 +] -[first, second, third] # inner comment # outer comment +[ # inner comment + first, + second, + third, +] # outer comment ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index 7f77fc37ab..8fba525759 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -886,7 +886,9 @@ def f( # first ... -def f(a): # first # second +def f( # first + a +): # second ... From 001aa486df8566aaf74f7f601684321f9ef2d53b Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Tue, 8 Aug 2023 18:48:49 +0530 Subject: [PATCH 034/155] Add formatting for `StmtMatch` (#6286) ## Summary This PR adds support for `StmtMatch` with subs for `MatchCase`. ## Test Plan Add a few additional test cases around `match` statement, comments, line breaks. resolves: #6298 --- .../test/fixtures/ruff/statement/match.py | 57 +++ .../src/comments/placement.rs | 104 +---- .../src/comments/visitor.rs | 8 - .../src/other/match_case.rs | 37 +- .../src/statement/stmt_match.rs | 41 +- ...y@py_310__pattern_matching_complex.py.snap | 358 +++++++++++------- ...ty@py_310__pattern_matching_extras.py.snap | 247 ++++++++---- ...y@py_310__pattern_matching_generic.py.snap | 57 +-- ...ty@py_310__pattern_matching_simple.py.snap | 227 +++++++---- ...ity@py_310__pattern_matching_style.py.snap | 37 +- ...py_310__remove_newline_after_match.py.snap | 27 +- .../snapshots/format@statement__match.py.snap | 126 ++++++ 12 files changed, 882 insertions(+), 444 deletions(-) create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py new file mode 100644 index 0000000000..e1c8d5baf4 --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py @@ -0,0 +1,57 @@ +# leading match comment +match foo: # dangling match comment + case "bar": + pass + + +# leading match comment +match ( # leading expr comment + # another leading expr comment + foo # trailing expr comment + # another trailing expr comment +): # dangling match comment + case "bar": + pass + + +# leading match comment +match ( # hello + foo # trailing expr comment + , # another +): # dangling match comment + case "bar": + pass + + +match [ # comment + first, + second, + third +]: # another comment + case ["a", "b", "c"]: + pass + +match ( # comment + "a b c" +).split(): # another comment + case ["a", "b", "c"]: + pass + + +match ( # comment + # let's go + yield foo +): # another comment + case ["a", "b", "c"]: + pass + + +match aaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh: # comment + case "sshhhhhhhh": + pass + + +def foo(): + match inside_func: # comment + case "bar": + pass diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index f7d90a98bb..1385b8ffa5 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -63,7 +63,6 @@ pub(super) fn place_comment<'a>( CommentPlacement::Default(comment) } } - AnyNodeRef::MatchCase(match_case) => handle_match_comment(comment, match_case, locator), AnyNodeRef::ModModule(_) => { handle_module_level_own_line_comment_before_class_or_function_comment(comment, locator) } @@ -210,6 +209,10 @@ fn is_first_statement_in_body(statement: AnyNodeRef, has_body: AnyNodeRef) -> bo are_same_optional(statement, body.first()) } + AnyNodeRef::StmtMatch(ast::StmtMatch { cases, .. }) => { + are_same_optional(statement, cases.first()) + } + _ => false, } } @@ -407,105 +410,6 @@ fn handle_own_line_comment_in_clause<'a>( CommentPlacement::Default(comment) } -/// Handles leading comments in front of a match case or a trailing comment of the `match` statement. -/// ```python -/// match pt: -/// # Leading `case(x, y)` comment -/// case (x, y): -/// return Point3d(x, y, 0) -/// # Leading `case (x, y, z)` comment -/// case _: -/// ``` -fn handle_match_comment<'a>( - comment: DecoratedComment<'a>, - match_case: &'a MatchCase, - locator: &Locator, -) -> CommentPlacement<'a> { - // Must be an own line comment after the last statement in a match case - if comment.line_position().is_end_of_line() || comment.following_node().is_some() { - return CommentPlacement::Default(comment); - } - - // And its parent match statement. - let Some(match_stmt) = comment.enclosing_parent().and_then(AnyNodeRef::stmt_match) else { - return CommentPlacement::Default(comment); - }; - - // Get the next sibling (sibling traversal would be really nice) - let current_case_index = match_stmt - .cases - .iter() - .position(|case| case == match_case) - .expect("Expected case to belong to parent match statement."); - - let next_case = match_stmt.cases.get(current_case_index + 1); - - let comment_indentation = indentation_at_offset(comment.slice().range().start(), locator) - .unwrap_or_default() - .len(); - let match_case_indentation = indentation(locator, match_case).unwrap().len(); - - if let Some(next_case) = next_case { - // The comment's indentation is less or equal to the `case` indention and there's a following - // `case` arm. - // ```python - // match pt: - // case (x, y): - // return Point3d(x, y, 0) - // # Leading `case (x, y, z)` comment - // case _: - // pass - // ``` - // Attach the `comment` as leading comment to the next case. - if comment_indentation <= match_case_indentation { - CommentPlacement::leading(next_case, comment) - } else { - // Otherwise, delegate to `handle_trailing_body_comment` - // ```python - // match pt: - // case (x, y): - // return Point3d(x, y, 0) - // # Trailing case body comment - // case _: - // pass - // ``` - CommentPlacement::Default(comment) - } - } else { - // Comment after the last statement in a match case... - let match_stmt_indentation = indentation(locator, match_stmt).unwrap_or_default().len(); - - if comment_indentation <= match_case_indentation - && comment_indentation > match_stmt_indentation - { - // The comment's indent matches the `case` indent (or is larger than the `match`'s indent). - // ```python - // match pt: - // case (x, y): - // return Point3d(x, y, 0) - // case _: - // pass - // # Trailing match comment - // ``` - // This is a trailing comment of the last case. - CommentPlacement::trailing(match_case, comment) - } else { - // Delegate to `handle_trailing_body_comment` because it's either a trailing indent - // for the last statement in the `case` body or a comment for the parent of the `match` - // - // ```python - // match pt: - // case (x, y): - // return Point3d(x, y, 0) - // case _: - // pass - // # trailing case comment - // ``` - CommentPlacement::Default(comment) - } - } -} - /// Determine where to attach an own line comment after a branch depending on its indentation fn handle_own_line_comment_after_branch<'a>( comment: DecoratedComment<'a>, diff --git a/crates/ruff_python_formatter/src/comments/visitor.rs b/crates/ruff_python_formatter/src/comments/visitor.rs index 9e60c5833d..0b18ea76d4 100644 --- a/crates/ruff_python_formatter/src/comments/visitor.rs +++ b/crates/ruff_python_formatter/src/comments/visitor.rs @@ -73,7 +73,6 @@ impl<'a> CommentsVisitor<'a> { enclosing: enclosing_node, preceding: self.preceding_node, following: Some(node), - parent: self.parents.iter().rev().nth(1).copied(), line_position: text_position(*comment_range, self.source_code), slice: self.source_code.slice(*comment_range), }; @@ -131,7 +130,6 @@ impl<'a> CommentsVisitor<'a> { let comment = DecoratedComment { enclosing: node, preceding: self.preceding_node, - parent: self.parents.last().copied(), following: None, line_position: text_position(*comment_range, self.source_code), slice: self.source_code.slice(*comment_range), @@ -340,7 +338,6 @@ pub(super) struct DecoratedComment<'a> { enclosing: AnyNodeRef<'a>, preceding: Option>, following: Option>, - parent: Option>, line_position: CommentLinePosition, slice: SourceCodeSlice, } @@ -366,11 +363,6 @@ impl<'a> DecoratedComment<'a> { self.enclosing } - /// Returns the parent of the enclosing node, if any - pub(super) fn enclosing_parent(&self) -> Option> { - self.parent - } - /// Returns the slice into the source code. pub(super) fn slice(&self) -> &SourceCodeSlice { &self.slice diff --git a/crates/ruff_python_formatter/src/other/match_case.rs b/crates/ruff_python_formatter/src/other/match_case.rs index 91a584657e..0bbe0572bc 100644 --- a/crates/ruff_python_formatter/src/other/match_case.rs +++ b/crates/ruff_python_formatter/src/other/match_case.rs @@ -1,12 +1,45 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::MatchCase; +use crate::expression::maybe_parenthesize_expression; +use crate::expression::parentheses::Parenthesize; +use crate::not_yet_implemented_custom_text; +use crate::prelude::*; +use crate::{FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatMatchCase; impl FormatNodeRule for FormatMatchCase { fn fmt_fields(&self, item: &MatchCase, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + let MatchCase { + range: _, + pattern: _, + guard, + body, + } = item; + + write!( + f, + [ + text("case"), + space(), + not_yet_implemented_custom_text("NOT_YET_IMPLEMENTED_Pattern"), + ] + )?; + + if let Some(guard) = guard { + write!( + f, + [ + space(), + text("if"), + space(), + maybe_parenthesize_expression(guard, item, Parenthesize::IfBreaks) + ] + )?; + } + + write!(f, [text(":"), block_indent(&body.format())]) } } diff --git a/crates/ruff_python_formatter/src/statement/stmt_match.rs b/crates/ruff_python_formatter/src/statement/stmt_match.rs index 073acc1722..6971950c90 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_match.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_match.rs @@ -1,12 +1,49 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::StmtMatch; +use crate::comments::trailing_comments; +use crate::expression::maybe_parenthesize_expression; +use crate::expression::parentheses::Parenthesize; +use crate::prelude::*; +use crate::{FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatStmtMatch; impl FormatNodeRule for FormatStmtMatch { fn fmt_fields(&self, item: &StmtMatch, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + let StmtMatch { + range: _, + subject, + cases, + } = item; + + let comments = f.context().comments().clone(); + let dangling_item_comments = comments.dangling_comments(item); + + // There can be at most one dangling comment after the colon in a match statement. + debug_assert!(dangling_item_comments.len() <= 1); + + write!( + f, + [ + text("match"), + space(), + maybe_parenthesize_expression(subject, item, Parenthesize::IfBreaks), + text(":"), + trailing_comments(dangling_item_comments) + ] + )?; + + for case in cases { + write!(f, [block_indent(&case.format())])?; + } + + Ok(()) + } + + fn fmt_dangling_comments(&self, _node: &StmtMatch, _f: &mut PyFormatter) -> FormatResult<()> { + // Handled as part of `fmt_fields` + Ok(()) } } diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap index ce5a833fd2..e498853715 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap @@ -156,180 +156,192 @@ match x: ```diff --- Black +++ Ruff -@@ -1,144 +1,60 @@ - # Cases sampled from Lib/test/test_patma.py +@@ -2,143 +2,143 @@ # case black_test_patma_098 --match x: + match x: - case -0j: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_142 --match x: + match x: - case bytes(z): -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_073 --match x: + match x: - case 0 if 0: -- y = 0 ++ case NOT_YET_IMPLEMENTED_Pattern if 0: + y = 0 - case 0 if 1: -- y = 1 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern if 1: + y = 1 # case black_test_patma_006 --match 3: + match 3: - case 0 | 1 | 2 | 3: -- x = True -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + x = True # case black_test_patma_049 --match x: + match x: - case [0, 1] | [1, 0]: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_check_sequence_then_mapping --match x: + match x: - case [*_]: -- return "seq" ++ case NOT_YET_IMPLEMENTED_Pattern: + return "seq" - case {}: -- return "map" -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + return "map" # case black_test_patma_035 --match x: + match x: - case {0: [1, 2, {}]}: -- y = 0 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 - case {0: [1, 2, {}] | True} | {1: [[]]} | {0: [1, 2, {}]} | [] | "X" | {}: -- y = 1 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 1 - case []: -- y = 2 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_107 --match x: + match x: - case 0.25 + 1.75j: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_097 --match x: + match x: - case -0j: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_007 --match 4: + match 4: - case 0 | 1 | 2 | 3: -- x = True -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + x = True # case black_test_patma_154 --match x: + match x: - case 0 if x: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern if x: + y = 0 # case black_test_patma_134 --match x: + match x: - case {1: 0}: -- y = 0 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 - case {0: 0}: -- y = 1 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 1 - case {**z}: -- y = 2 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_185 --match Seq(): + match Seq(): - case [*_]: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_063 --match x: + match x: - case 1: -- y = 0 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 - case 1: -- y = 1 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 1 # case black_test_patma_248 --match x: + match x: - case {"foo": bar}: -- y = bar -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = bar # case black_test_patma_019 --match (0, 1, 2): + match (0, 1, 2): - case [0, 1, *x, 2]: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_052 --match x: + match x: - case [0]: -- y = 0 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 - case [1, 0] if (x := x[:0]): -- y = 1 ++ case NOT_YET_IMPLEMENTED_Pattern if x := x[:0]: + y = 1 - case [1, 0]: -- y = 2 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_191 --match w: + match w: - case [x, y, *_]: -- z = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + z = 0 # case black_test_patma_110 --match x: + match x: - case -0.25 - 1.75j: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_151 --match (x,): + match (x,): - case [y]: -- z = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + z = 0 # case black_test_patma_114 --match x: + match x: - case A.B.C.D: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_232 --match x: + match x: - case None: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_058 --match x: + match x: - case 0: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_233 --match x: + match x: - case False: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_078 --match x: + match x: - case []: -- y = 0 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 - case [""]: -- y = 1 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 1 - case "": -- y = 2 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_156 --match x: + match x: - case z: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_189 --match w: + match w: - case [x, y, *rest]: -- z = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + z = 0 # case black_test_patma_042 --match x: + match x: - case (0 as z) | (1 as z) | (2 as z) if z == x % 2: -- y = 0 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern if z == x % 2: + y = 0 # case black_test_patma_034 --match x: + match x: - case {0: [1, 2, {}]}: -- y = 0 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 - case {0: [1, 2, {}] | False} | {1: [[]]} | {0: [1, 2, {}]} | [] | "X" | {}: -- y = 1 ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 1 - case []: -- y = 2 -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 2 ``` ## Ruff Output @@ -338,63 +350,147 @@ match x: # Cases sampled from Lib/test/test_patma.py # case black_test_patma_098 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_142 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_073 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern if 0: + y = 0 + case NOT_YET_IMPLEMENTED_Pattern if 1: + y = 1 # case black_test_patma_006 -NOT_YET_IMPLEMENTED_StmtMatch +match 3: + case NOT_YET_IMPLEMENTED_Pattern: + x = True # case black_test_patma_049 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_check_sequence_then_mapping -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + return "seq" + case NOT_YET_IMPLEMENTED_Pattern: + return "map" # case black_test_patma_035 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 + case NOT_YET_IMPLEMENTED_Pattern: + y = 1 + case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_107 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_097 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_007 -NOT_YET_IMPLEMENTED_StmtMatch +match 4: + case NOT_YET_IMPLEMENTED_Pattern: + x = True # case black_test_patma_154 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern if x: + y = 0 # case black_test_patma_134 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 + case NOT_YET_IMPLEMENTED_Pattern: + y = 1 + case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_185 -NOT_YET_IMPLEMENTED_StmtMatch +match Seq(): + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_063 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 + case NOT_YET_IMPLEMENTED_Pattern: + y = 1 # case black_test_patma_248 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = bar # case black_test_patma_019 -NOT_YET_IMPLEMENTED_StmtMatch +match (0, 1, 2): + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_052 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 + case NOT_YET_IMPLEMENTED_Pattern if x := x[:0]: + y = 1 + case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_191 -NOT_YET_IMPLEMENTED_StmtMatch +match w: + case NOT_YET_IMPLEMENTED_Pattern: + z = 0 # case black_test_patma_110 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_151 -NOT_YET_IMPLEMENTED_StmtMatch +match (x,): + case NOT_YET_IMPLEMENTED_Pattern: + z = 0 # case black_test_patma_114 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_232 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_058 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_233 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_078 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 + case NOT_YET_IMPLEMENTED_Pattern: + y = 1 + case NOT_YET_IMPLEMENTED_Pattern: + y = 2 # case black_test_patma_156 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 # case black_test_patma_189 -NOT_YET_IMPLEMENTED_StmtMatch +match w: + case NOT_YET_IMPLEMENTED_Pattern: + z = 0 # case black_test_patma_042 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern if z == x % 2: + y = 0 # case black_test_patma_034 -NOT_YET_IMPLEMENTED_StmtMatch +match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 + case NOT_YET_IMPLEMENTED_Pattern: + y = 1 + case NOT_YET_IMPLEMENTED_Pattern: + y = 2 ``` ## Black Output diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap index 23dd576815..f107f563a0 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap @@ -131,139 +131,155 @@ match bar1: ```diff --- Black +++ Ruff -@@ -1,119 +1,43 @@ +@@ -1,13 +1,13 @@ import match --match something: + match something: - case [a as b]: -- print(b) ++ case NOT_YET_IMPLEMENTED_Pattern: + print(b) - case [a as b, c, d, e as f]: -- print(f) ++ case NOT_YET_IMPLEMENTED_Pattern: + print(f) - case Point(a as b): -- print(b) ++ case NOT_YET_IMPLEMENTED_Pattern: + print(b) - case Point(int() as x, int() as y): -- print(x, y) -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + print(x, y) - match = 1 +@@ -15,40 +15,43 @@ case: int = re.match(something) --match re.match(case): + match re.match(case): - case type("match", match): -- pass ++ case NOT_YET_IMPLEMENTED_Pattern: + pass - case match: -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass def func(match: case, case: match) -> case: -- match Something(): + match Something(): - case func(match, case): -- ... ++ case NOT_YET_IMPLEMENTED_Pattern: + ... - case another: -- ... -+ NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + ... --match maybe, multiple: + match maybe, multiple: - case perhaps, 5: -- pass ++ case NOT_YET_IMPLEMENTED_Pattern: + pass - case perhaps, 6,: -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass -match more := (than, one), indeed,: - case _, (5, 6): -- pass ++match ( ++ more := (than, one), ++ indeed, ++): ++ case NOT_YET_IMPLEMENTED_Pattern: + pass - case [[5], (6)], [7],: -- pass ++ case NOT_YET_IMPLEMENTED_Pattern: + pass - case _: -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass --match a, *b, c: + match a, *b, c: - case [*_]: -- assert "seq" == _ ++ case NOT_YET_IMPLEMENTED_Pattern: + assert "seq" == _ - case {}: -- assert "map" == b -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + assert "map" == b --match match( -- case, -- match( -- match, case, match, looooooooooooooooooooooooooooooooooooong, match, case, match -- ), -- case, --): +@@ -59,61 +62,47 @@ + ), + case, + ): - case case( - match=case, - case=re.match( - loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong - ), - ): -- pass -+NOT_YET_IMPLEMENTED_StmtMatch - ++ case NOT_YET_IMPLEMENTED_Pattern: + pass +- - case [a as match]: -- pass - ++ case NOT_YET_IMPLEMENTED_Pattern: + pass +- - case case: -- pass -- -- --match match: -- case case: -- pass -- -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass --match a, *b(), c: + + match match: +- case case: ++ case NOT_YET_IMPLEMENTED_Pattern: + pass + + + match a, *b(), c: - case d, *f, g: -- pass ++ case NOT_YET_IMPLEMENTED_Pattern: + pass -- --match something: + + match something: - case { - "key": key as key_1, - "password": PASS.ONE | PASS.TWO | PASS.THREE as password, - }: -- pass ++ case NOT_YET_IMPLEMENTED_Pattern: + pass - case {"maybe": something(complicated as this) as that}: -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass --match something: + match something: - case 1 as a: -- pass -+NOT_YET_IMPLEMENTED_StmtMatch - ++ case NOT_YET_IMPLEMENTED_Pattern: + pass +- - case 2 as b, 3 as c: -- pass - ++ case NOT_YET_IMPLEMENTED_Pattern: + pass +- - case 4 as d, (5 as e), (6 | 7 as g), *h: -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass --match bar1: + match bar1: - case Foo(aa=Callable() as aa, bb=int()): -- print(bar1.aa, bar1.bb) ++ case NOT_YET_IMPLEMENTED_Pattern: + print(bar1.aa, bar1.bb) - case _: -- print("no match", "\n") -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + print("no match", "\n") --match bar1: + match bar1: - case Foo( - normal=x, perhaps=[list, {"x": d, "y": 1.0}] as y, otherwise=something, q=t as u - ): -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass ``` ## Ruff Output @@ -271,47 +287,112 @@ match bar1: ```py import match -NOT_YET_IMPLEMENTED_StmtMatch +match something: + case NOT_YET_IMPLEMENTED_Pattern: + print(b) + case NOT_YET_IMPLEMENTED_Pattern: + print(f) + case NOT_YET_IMPLEMENTED_Pattern: + print(b) + case NOT_YET_IMPLEMENTED_Pattern: + print(x, y) match = 1 case: int = re.match(something) -NOT_YET_IMPLEMENTED_StmtMatch +match re.match(case): + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass def func(match: case, case: match) -> case: - NOT_YET_IMPLEMENTED_StmtMatch + match Something(): + case NOT_YET_IMPLEMENTED_Pattern: + ... + case NOT_YET_IMPLEMENTED_Pattern: + ... -NOT_YET_IMPLEMENTED_StmtMatch +match maybe, multiple: + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass -NOT_YET_IMPLEMENTED_StmtMatch +match ( + more := (than, one), + indeed, +): + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass -NOT_YET_IMPLEMENTED_StmtMatch +match a, *b, c: + case NOT_YET_IMPLEMENTED_Pattern: + assert "seq" == _ + case NOT_YET_IMPLEMENTED_Pattern: + assert "map" == b -NOT_YET_IMPLEMENTED_StmtMatch +match match( + case, + match( + match, case, match, looooooooooooooooooooooooooooooooooooong, match, case, match + ), + case, +): + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass -NOT_YET_IMPLEMENTED_StmtMatch +match match: + case NOT_YET_IMPLEMENTED_Pattern: + pass -NOT_YET_IMPLEMENTED_StmtMatch +match a, *b(), c: + case NOT_YET_IMPLEMENTED_Pattern: + pass -NOT_YET_IMPLEMENTED_StmtMatch +match something: + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass -NOT_YET_IMPLEMENTED_StmtMatch +match something: + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass -NOT_YET_IMPLEMENTED_StmtMatch +match bar1: + case NOT_YET_IMPLEMENTED_Pattern: + print(bar1.aa, bar1.bb) + case NOT_YET_IMPLEMENTED_Pattern: + print("no match", "\n") -NOT_YET_IMPLEMENTED_StmtMatch +match bar1: + case NOT_YET_IMPLEMENTED_Pattern: + pass ``` ## Black Output diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap index 6049e7897b..64445949cb 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap @@ -119,49 +119,44 @@ with match() as match: ```diff --- Black +++ Ruff -@@ -23,11 +23,7 @@ - pygram.python_grammar, +@@ -24,9 +24,9 @@ ] -- match match: + match match: - case case: -- match match: ++ case NOT_YET_IMPLEMENTED_Pattern: + match match: - case case: -- pass -+ NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass if all(version.is_python2() for version in target_versions): - # Python 2-only code, so try Python 2 grammars. -@@ -45,9 +41,7 @@ - +@@ -46,7 +46,7 @@ def test_patma_139(self): x = False -- match x: + match x: - case bool(z): -- y = 0 -+ NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 self.assertIs(x, False) self.assertEqual(y, 0) - self.assertIs(z, x) -@@ -72,16 +66,12 @@ - def test_patma_155(self): +@@ -73,14 +73,14 @@ x = 0 y = None -- match x: + match x: - case 1e1000: -- y = 0 -+ NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + y = 0 self.assertEqual(x, 0) self.assertIs(y, None) x = range(3) -- match x: + match x: - case [y, case as x, z]: -- w = 0 -+ NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + w = 0 # At least one of the above branches must have been taken, because every Python - # version has exactly one of the two 'ASYNC_*' flags ``` ## Ruff Output @@ -192,7 +187,11 @@ def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]: pygram.python_grammar, ] - NOT_YET_IMPLEMENTED_StmtMatch + match match: + case NOT_YET_IMPLEMENTED_Pattern: + match match: + case NOT_YET_IMPLEMENTED_Pattern: + pass if all(version.is_python2() for version in target_versions): # Python 2-only code, so try Python 2 grammars. @@ -210,7 +209,9 @@ def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]: def test_patma_139(self): x = False - NOT_YET_IMPLEMENTED_StmtMatch + match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 self.assertIs(x, False) self.assertEqual(y, 0) self.assertIs(z, x) @@ -235,12 +236,16 @@ def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]: def test_patma_155(self): x = 0 y = None - NOT_YET_IMPLEMENTED_StmtMatch + match x: + case NOT_YET_IMPLEMENTED_Pattern: + y = 0 self.assertEqual(x, 0) self.assertIs(y, None) x = range(3) - NOT_YET_IMPLEMENTED_StmtMatch + match x: + case NOT_YET_IMPLEMENTED_Pattern: + w = 0 # At least one of the above branches must have been taken, because every Python # version has exactly one of the two 'ASYNC_*' flags diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap index a165da5f84..c5fea0c542 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap @@ -104,111 +104,129 @@ def where_is(point): ```diff --- Black +++ Ruff -@@ -1,92 +1,27 @@ +@@ -1,92 +1,92 @@ # Cases sampled from PEP 636 examples --match command.split(): + match command.split(): - case [action, obj]: -- ... # interpret action, obj -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + ... # interpret action, obj --match command.split(): + match command.split(): - case [action]: -- ... # interpret single-verb action ++ case NOT_YET_IMPLEMENTED_Pattern: + ... # interpret single-verb action - case [action, obj]: -- ... # interpret action, obj -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + ... # interpret action, obj --match command.split(): + match command.split(): - case ["quit"]: -- print("Goodbye!") -- quit_game() ++ case NOT_YET_IMPLEMENTED_Pattern: + print("Goodbye!") + quit_game() - case ["look"]: -- current_room.describe() ++ case NOT_YET_IMPLEMENTED_Pattern: + current_room.describe() - case ["get", obj]: -- character.get(obj, current_room) ++ case NOT_YET_IMPLEMENTED_Pattern: + character.get(obj, current_room) - case ["go", direction]: -- current_room = current_room.neighbor(direction) -- # The rest of your commands go here -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor(direction) + # The rest of your commands go here --match command.split(): + match command.split(): - case ["drop", *objects]: -- for obj in objects: -- character.drop(obj, current_room) -- # The rest of your commands go here -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + for obj in objects: + character.drop(obj, current_room) + # The rest of your commands go here --match command.split(): + match command.split(): - case ["quit"]: -- pass ++ case NOT_YET_IMPLEMENTED_Pattern: + pass - case ["go", direction]: -- print("Going:", direction) ++ case NOT_YET_IMPLEMENTED_Pattern: + print("Going:", direction) - case ["drop", *objects]: -- print("Dropping: ", *objects) ++ case NOT_YET_IMPLEMENTED_Pattern: + print("Dropping: ", *objects) - case _: -- print(f"Sorry, I couldn't understand {command!r}") -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + print(f"Sorry, I couldn't understand {command!r}") --match command.split(): + match command.split(): - case ["north"] | ["go", "north"]: -- current_room = current_room.neighbor("north") ++ case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor("north") - case ["get", obj] | ["pick", "up", obj] | ["pick", obj, "up"]: -- ... # Code for picking up the given object -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + ... # Code for picking up the given object --match command.split(): + match command.split(): - case ["go", ("north" | "south" | "east" | "west")]: -- current_room = current_room.neighbor(...) -- # how do I know which direction to go? -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor(...) + # how do I know which direction to go? --match command.split(): + match command.split(): - case ["go", ("north" | "south" | "east" | "west") as direction]: -- current_room = current_room.neighbor(direction) -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor(direction) --match command.split(): + match command.split(): - case ["go", direction] if direction in current_room.exits: -- current_room = current_room.neighbor(direction) ++ case NOT_YET_IMPLEMENTED_Pattern if direction in current_room.exits: + current_room = current_room.neighbor(direction) - case ["go", _]: -- print("Sorry, you can't go that way") -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + print("Sorry, you can't go that way") --match event.get(): + match event.get(): - case Click(position=(x, y)): -- handle_click_at(x, y) ++ case NOT_YET_IMPLEMENTED_Pattern: + handle_click_at(x, y) - case KeyPress(key_name="Q") | Quit(): -- game.quit() ++ case NOT_YET_IMPLEMENTED_Pattern: + game.quit() - case KeyPress(key_name="up arrow"): -- game.go_north() ++ case NOT_YET_IMPLEMENTED_Pattern: + game.go_north() - case KeyPress(): -- pass # Ignore other keystrokes ++ case NOT_YET_IMPLEMENTED_Pattern: + pass # Ignore other keystrokes - case other_event: -- raise ValueError(f"Unrecognized event: {other_event}") -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + raise ValueError(f"Unrecognized event: {other_event}") --match event.get(): + match event.get(): - case Click((x, y), button=Button.LEFT): # This is a left click -- handle_click_at(x, y) ++ case NOT_YET_IMPLEMENTED_Pattern: + handle_click_at(x, y) - case Click(): -- pass # ignore other clicks -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass # ignore other clicks def where_is(point): -- match point: + match point: - case Point(x=0, y=0): -- print("Origin") ++ case NOT_YET_IMPLEMENTED_Pattern: + print("Origin") - case Point(x=0, y=y): -- print(f"Y={y}") ++ case NOT_YET_IMPLEMENTED_Pattern: + print(f"Y={y}") - case Point(x=x, y=0): -- print(f"X={x}") ++ case NOT_YET_IMPLEMENTED_Pattern: + print(f"X={x}") - case Point(): -- print("Somewhere else") ++ case NOT_YET_IMPLEMENTED_Pattern: + print("Somewhere else") - case _: -- print("Not a point") -+ NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + print("Not a point") ``` ## Ruff Output @@ -216,31 +234,96 @@ def where_is(point): ```py # Cases sampled from PEP 636 examples -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + ... # interpret action, obj -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + ... # interpret single-verb action + case NOT_YET_IMPLEMENTED_Pattern: + ... # interpret action, obj -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + print("Goodbye!") + quit_game() + case NOT_YET_IMPLEMENTED_Pattern: + current_room.describe() + case NOT_YET_IMPLEMENTED_Pattern: + character.get(obj, current_room) + case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor(direction) + # The rest of your commands go here -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + for obj in objects: + character.drop(obj, current_room) + # The rest of your commands go here -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + print("Going:", direction) + case NOT_YET_IMPLEMENTED_Pattern: + print("Dropping: ", *objects) + case NOT_YET_IMPLEMENTED_Pattern: + print(f"Sorry, I couldn't understand {command!r}") -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor("north") + case NOT_YET_IMPLEMENTED_Pattern: + ... # Code for picking up the given object -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor(...) + # how do I know which direction to go? -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern: + current_room = current_room.neighbor(direction) -NOT_YET_IMPLEMENTED_StmtMatch +match command.split(): + case NOT_YET_IMPLEMENTED_Pattern if direction in current_room.exits: + current_room = current_room.neighbor(direction) + case NOT_YET_IMPLEMENTED_Pattern: + print("Sorry, you can't go that way") -NOT_YET_IMPLEMENTED_StmtMatch +match event.get(): + case NOT_YET_IMPLEMENTED_Pattern: + handle_click_at(x, y) + case NOT_YET_IMPLEMENTED_Pattern: + game.quit() + case NOT_YET_IMPLEMENTED_Pattern: + game.go_north() + case NOT_YET_IMPLEMENTED_Pattern: + pass # Ignore other keystrokes + case NOT_YET_IMPLEMENTED_Pattern: + raise ValueError(f"Unrecognized event: {other_event}") -NOT_YET_IMPLEMENTED_StmtMatch +match event.get(): + case NOT_YET_IMPLEMENTED_Pattern: + handle_click_at(x, y) + case NOT_YET_IMPLEMENTED_Pattern: + pass # ignore other clicks def where_is(point): - NOT_YET_IMPLEMENTED_StmtMatch + match point: + case NOT_YET_IMPLEMENTED_Pattern: + print("Origin") + case NOT_YET_IMPLEMENTED_Pattern: + print(f"Y={y}") + case NOT_YET_IMPLEMENTED_Pattern: + print(f"X={x}") + case NOT_YET_IMPLEMENTED_Pattern: + print("Somewhere else") + case NOT_YET_IMPLEMENTED_Pattern: + print("Not a point") ``` ## Black Output diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap index 56fe93fb72..6c268b7a02 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap @@ -65,22 +65,25 @@ match match( ```diff --- Black +++ Ruff -@@ -1,35 +1,24 @@ --match something: +@@ -1,35 +1,34 @@ + match something: - case b(): -- print(1 + 1) ++ case NOT_YET_IMPLEMENTED_Pattern: + print(1 + 1) - case c( - very_complex=True, perhaps_even_loooooooooooooooooooooooooooooooooooooong=-1 - ): -- print(1) ++ case NOT_YET_IMPLEMENTED_Pattern: + print(1) - case c( - very_complex=True, - perhaps_even_loooooooooooooooooooooooooooooooooooooong=-1, - ): -- print(2) ++ case NOT_YET_IMPLEMENTED_Pattern: + print(2) - case a: -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass -match(arg) # comment +match( @@ -106,18 +109,26 @@ match match( + something # fast +) re.match() --match match(): + match match(): - case case( - arg, # comment - ): -- pass -+NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + pass ``` ## Ruff Output ```py -NOT_YET_IMPLEMENTED_StmtMatch +match something: + case NOT_YET_IMPLEMENTED_Pattern: + print(1 + 1) + case NOT_YET_IMPLEMENTED_Pattern: + print(1) + case NOT_YET_IMPLEMENTED_Pattern: + print(2) + case NOT_YET_IMPLEMENTED_Pattern: + pass match( arg # comment @@ -140,7 +151,9 @@ re.match( something # fast ) re.match() -NOT_YET_IMPLEMENTED_StmtMatch +match match(): + case NOT_YET_IMPLEMENTED_Pattern: + pass ``` ## Black Output diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap index 6099825e88..2f1f0ea0b9 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap @@ -31,28 +31,39 @@ def http_status(status): ```diff --- Black +++ Ruff -@@ -1,13 +1,2 @@ +@@ -1,13 +1,10 @@ def http_status(status): -- match status: + match status: - case 400: -- return "Bad request" ++ case NOT_YET_IMPLEMENTED_Pattern: + return "Bad request" - - case 401: -- return "Unauthorized" ++ case NOT_YET_IMPLEMENTED_Pattern: + return "Unauthorized" - - case 403: -- return "Forbidden" ++ case NOT_YET_IMPLEMENTED_Pattern: + return "Forbidden" - - case 404: -- return "Not found" -+ NOT_YET_IMPLEMENTED_StmtMatch ++ case NOT_YET_IMPLEMENTED_Pattern: + return "Not found" ``` ## Ruff Output ```py def http_status(status): - NOT_YET_IMPLEMENTED_StmtMatch + match status: + case NOT_YET_IMPLEMENTED_Pattern: + return "Bad request" + case NOT_YET_IMPLEMENTED_Pattern: + return "Unauthorized" + case NOT_YET_IMPLEMENTED_Pattern: + return "Forbidden" + case NOT_YET_IMPLEMENTED_Pattern: + return "Not found" ``` ## Black Output diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap new file mode 100644 index 0000000000..42bfbfbedd --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap @@ -0,0 +1,126 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py +--- +## Input +```py +# leading match comment +match foo: # dangling match comment + case "bar": + pass + + +# leading match comment +match ( # leading expr comment + # another leading expr comment + foo # trailing expr comment + # another trailing expr comment +): # dangling match comment + case "bar": + pass + + +# leading match comment +match ( # hello + foo # trailing expr comment + , # another +): # dangling match comment + case "bar": + pass + + +match [ # comment + first, + second, + third +]: # another comment + case ["a", "b", "c"]: + pass + +match ( # comment + "a b c" +).split(): # another comment + case ["a", "b", "c"]: + pass + + +match ( # comment + # let's go + yield foo +): # another comment + case ["a", "b", "c"]: + pass + + +match aaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh: # comment + case "sshhhhhhhh": + pass + + +def foo(): + match inside_func: # comment + case "bar": + pass +``` + +## Output +```py +# leading match comment +match foo: # dangling match comment + case NOT_YET_IMPLEMENTED_Pattern: + pass + + +# leading match comment +match ( + # leading expr comment + # another leading expr comment + foo # trailing expr comment + # another trailing expr comment +): # dangling match comment + case NOT_YET_IMPLEMENTED_Pattern: + pass + + +# leading match comment +match ( # hello + foo, # trailing expr comment # another +): # dangling match comment + case NOT_YET_IMPLEMENTED_Pattern: + pass + + +match [first, second, third]: # comment # another comment + case NOT_YET_IMPLEMENTED_Pattern: + pass + +match ( + # comment + "a b c" +).split(): # another comment + case NOT_YET_IMPLEMENTED_Pattern: + pass + + +match ( + # comment + # let's go + yield foo +): # another comment + case NOT_YET_IMPLEMENTED_Pattern: + pass + + +match aaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh: # comment + case NOT_YET_IMPLEMENTED_Pattern: + pass + + +def foo(): + match inside_func: # comment + case NOT_YET_IMPLEMENTED_Pattern: + pass +``` + + + From d815a25b11d8abe0151628fd84282ed48d823750 Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Tue, 8 Aug 2023 20:15:02 +0530 Subject: [PATCH 035/155] Update `StmtMatch` formatting snapshots (#6427) --- .../tests/snapshots/format@statement__match.py.snap | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap index 42bfbfbedd..f794cbc12a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap @@ -90,7 +90,11 @@ match ( # hello pass -match [first, second, third]: # comment # another comment +match [ # comment + first, + second, + third, +]: # another comment case NOT_YET_IMPLEMENTED_Pattern: pass From e769c74899a744eb773b80da9f3a18dbc42e072b Mon Sep 17 00:00:00 2001 From: konsti Date: Tue, 8 Aug 2023 17:46:46 +0200 Subject: [PATCH 036/155] Check .git in formatter progress checkouts for build (#6387) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From the formatter progress CI logs: ``` 2023-08-07T03:49:02.5178602Z + mkdir -p /home/runner/work/ruff/ruff/target/progress_projects 2023-08-07T03:49:02.5193474Z + '[' '!' -d /home/runner/work/ruff/ruff/target/progress_projects/build ']' 2023-08-07T03:49:02.5194228Z + '[' '!' -d /home/runner/work/ruff/ruff/target/progress_projects/django ']' 2023-08-07T03:49:02.5194966Z + git clone --filter=tree:0 https://github.com/django/django /home/runner/work/ruff/ruff/target/progress_projects/django 2023-08-07T03:49:02.5209260Z Cloning into '/home/runner/work/ruff/ruff/target/progress_projects/django'... ``` ``` 2023-08-07T03:51:17.4726088Z 2023-08-07T03:51:17.472404Z ERROR Failed /home/runner/work/ruff/ruff/target/progress_projects/build: no python files in ["/home/runner/work/ruff/ruff/target/progress_projects/build"] ``` Seems that build exists but is an empty cached folder. These changes should fix this by a) checking for `.git` instead of just the folder existing b) running the commit checkout unconditionally. The latter is also important if we ever want to update the SHAs. --- .github/workflows/ci.yaml | 10 ++++------ scripts/formatter_ecosystem_checks.sh | 28 +++++++++++++-------------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 71ccf1bcbe..5707fdea6a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -42,7 +42,7 @@ jobs: - "!crates/ruff_formatter/**" - "!crates/ruff_dev/**" - "!crates/ruff_shrinking/**" - - scripts/check_ecosystem.py + - scripts/* formatter: - Cargo.toml @@ -56,6 +56,7 @@ jobs: - crates/ruff_text_size/** - crates/ruff_python_parser/** - crates/ruff_dev/** + - scripts/* cargo-fmt: name: "cargo fmt" @@ -338,8 +339,5 @@ jobs: run: scripts/formatter_ecosystem_checks.sh - name: "Github step summary" run: grep "similarity index" target/progress_projects_log.txt | sort > $GITHUB_STEP_SUMMARY - # CPython is not black formatted, so we run only the stability check - - name: "Clone CPython 3.10" - run: git clone --branch 3.10 --depth 1 https://github.com/python/cpython.git crates/ruff/resources/test/cpython - - name: "Check CPython stability" - run: cargo run --bin ruff_dev -- format-dev --stability-check crates/ruff/resources/test/cpython + - name: "Remove checkouts from cache" + run: rm -r target/progress_projects diff --git a/scripts/formatter_ecosystem_checks.sh b/scripts/formatter_ecosystem_checks.sh index c4aa2db57b..46d765fb2d 100755 --- a/scripts/formatter_ecosystem_checks.sh +++ b/scripts/formatter_ecosystem_checks.sh @@ -17,40 +17,40 @@ dir="$target/progress_projects" mkdir -p "$dir" # small util library -if [ ! -d "$dir/build" ]; then +if [ ! -d "$dir/build/.git" ]; then git clone --filter=tree:0 https://github.com/pypa/build "$dir/build" - git -C "$dir/build" checkout d90f9ac6503a40ddbfaef94b7a7040f87178a4b3 fi +git -C "$dir/build" checkout d90f9ac6503a40ddbfaef94b7a7040f87178a4b3 # web framework that implements a lot of magic -if [ ! -d "$dir/django" ]; then +if [ ! -d "$dir/django/.git" ]; then git clone --filter=tree:0 https://github.com/django/django "$dir/django" - git -C "$dir/django" checkout 95e4d6b81312fdd9f8ebf3385be1c1331168b5cf fi +git -C "$dir/django" checkout 95e4d6b81312fdd9f8ebf3385be1c1331168b5cf # an ML project -if [ ! -d "$dir/transformers" ]; then +if [ ! -d "$dir/transformers/.git" ]; then git clone --filter=tree:0 https://github.com/huggingface/transformers "$dir/transformers" - git -C "$dir/transformers" checkout c9a82be592ca305180a7ab6a36e884bca1d426b8 fi +git -C "$dir/django" checkout 95e4d6b81312fdd9f8ebf3385be1c1331168b5cf # type annotations -if [ ! -d "$dir/typeshed" ]; then +if [ ! -d "$dir/typeshed/.git" ]; then git clone --filter=tree:0 https://github.com/python/typeshed "$dir/typeshed" - git -C "$dir/typeshed" checkout 7d33060e6ae3ebe54462a891f0c566c97371915b fi +git -C "$dir/typeshed" checkout 7d33060e6ae3ebe54462a891f0c566c97371915b # python 3.11, typing and 100% test coverage -if [ ! -d "$dir/warehouse" ]; then +if [ ! -d "$dir/warehouse/.git" ]; then git clone --filter=tree:0 https://github.com/pypi/warehouse "$dir/warehouse" - git -C "$dir/warehouse" checkout fe6455c0a946e81f61d72edc1049f536d8bba903 fi +git -C "$dir/warehouse" checkout fe6455c0a946e81f61d72edc1049f536d8bba903 # zulip, a django user -if [ ! -d "$dir/zulip" ]; then +if [ ! -d "$dir/zulip/.git" ]; then git clone --filter=tree:0 https://github.com/zulip/zulip "$dir/zulip" - git -C "$dir/zulip" checkout 6cb080c4479546a7f5cb017fcddea56605910b48 fi +git -C "$dir/zulip" checkout 6cb080c4479546a7f5cb017fcddea56605910b48 # cpython itself -if [ ! -d "$dir/cpython" ]; then +if [ ! -d "$dir/cpython/.git" ]; then git clone --filter=tree:0 https://github.com/python/cpython "$dir/cpython" - git -C "$dir/cpython" checkout 45de31db9cc9be945702f3a7ca35bbb9f98476af fi +git -C "$dir/cpython" checkout 45de31db9cc9be945702f3a7ca35bbb9f98476af # Uncomment if you want to update the hashes # for i in "$dir"/*/; do git -C "$i" switch main && git -C "$i" pull && echo "# $(basename "$i") $(git -C "$i" rev-parse HEAD)"; done From fe9590f39f4d41deb1d4ed7c655cff0bcb02bdc4 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 8 Aug 2023 12:31:30 -0500 Subject: [PATCH 037/155] Bump version number to 0.0.283 (#6407) --- Cargo.lock | 6 +++--- README.md | 2 +- crates/flake8_to_ruff/Cargo.toml | 2 +- crates/ruff/Cargo.toml | 2 +- crates/ruff_cli/Cargo.toml | 2 +- docs/tutorial.md | 2 +- docs/usage.md | 6 +++--- pyproject.toml | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 622032c09a..8707b07130 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -800,7 +800,7 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flake8-to-ruff" -version = "0.0.282" +version = "0.0.283" dependencies = [ "anyhow", "clap", @@ -2042,7 +2042,7 @@ dependencies = [ [[package]] name = "ruff" -version = "0.0.282" +version = "0.0.283" dependencies = [ "annotate-snippets 0.9.1", "anyhow", @@ -2141,7 +2141,7 @@ dependencies = [ [[package]] name = "ruff_cli" -version = "0.0.282" +version = "0.0.283" dependencies = [ "annotate-snippets 0.9.1", "anyhow", diff --git a/README.md b/README.md index bfd3268516..a835da57db 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Ruff can also be used as a [pre-commit](https://pre-commit.com) hook: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.282 + rev: v0.0.283 hooks: - id: ruff ``` diff --git a/crates/flake8_to_ruff/Cargo.toml b/crates/flake8_to_ruff/Cargo.toml index 662ee703e4..bb384cdedb 100644 --- a/crates/flake8_to_ruff/Cargo.toml +++ b/crates/flake8_to_ruff/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "flake8-to-ruff" -version = "0.0.282" +version = "0.0.283" description = """ Convert Flake8 configuration files to Ruff configuration files. """ diff --git a/crates/ruff/Cargo.toml b/crates/ruff/Cargo.toml index fe8fa3e225..9b2f2f7b87 100644 --- a/crates/ruff/Cargo.toml +++ b/crates/ruff/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ruff" -version = "0.0.282" +version = "0.0.283" publish = false authors = { workspace = true } edition = { workspace = true } diff --git a/crates/ruff_cli/Cargo.toml b/crates/ruff_cli/Cargo.toml index 3e9faee31c..2db8807199 100644 --- a/crates/ruff_cli/Cargo.toml +++ b/crates/ruff_cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ruff_cli" -version = "0.0.282" +version = "0.0.283" publish = false authors = { workspace = true } edition = { workspace = true } diff --git a/docs/tutorial.md b/docs/tutorial.md index 244467449f..39a9331536 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -242,7 +242,7 @@ This tutorial has focused on Ruff's command-line interface, but Ruff can also be ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.282 + rev: v0.0.283 hooks: - id: ruff ``` diff --git a/docs/usage.md b/docs/usage.md index 4c2019c44e..7e695f9927 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ Ruff can also be used as a [pre-commit](https://pre-commit.com) hook: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.282 + rev: v0.0.283 hooks: - id: ruff ``` @@ -32,7 +32,7 @@ Or, to enable autofix: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.282 + rev: v0.0.283 hooks: - id: ruff args: [ --fix, --exit-non-zero-on-fix ] @@ -43,7 +43,7 @@ Or, to run the hook on Jupyter Notebooks too: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.282 + rev: v0.0.283 hooks: - id: ruff types_or: [python, pyi, jupyter] diff --git a/pyproject.toml b/pyproject.toml index 304491f392..497004e757 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "maturin" [project] name = "ruff" -version = "0.0.282" +version = "0.0.283" description = "An extremely fast Python linter, written in Rust." authors = [{ name = "Charlie Marsh", email = "charlie.r.marsh@gmail.com" }] maintainers = [{ name = "Charlie Marsh", email = "charlie.r.marsh@gmail.com" }] From c7703e205d64d1c5be8e8a2daee30824bf80bf05 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 8 Aug 2023 15:17:17 -0400 Subject: [PATCH 038/155] Move `empty_parenthesized` into the `parentheses.rs` (#6403) ## Summary This PR moves `empty_parenthesized` such that it's peer to `parenthesized`, and changes the API to better match that of `parenthesized` (takes `&str` rather than `StaticText`, has a `with_dangling_comments` method, etc.). It may be intentionally _not_ part of `parentheses.rs`, but to me they're so similar that it makes more sense for them to be in the same module, with the same API, etc. --- crates/ruff_python_formatter/src/builders.rs | 62 ------------------ .../src/expression/expr_dict.rs | 8 +-- .../src/expression/expr_list.rs | 10 +-- .../src/expression/expr_tuple.rs | 9 +-- .../src/expression/parentheses.rs | 65 ++++++++++++++++++- .../src/other/arguments.rs | 13 +--- .../src/other/parameters.rs | 12 +--- 7 files changed, 83 insertions(+), 96 deletions(-) diff --git a/crates/ruff_python_formatter/src/builders.rs b/crates/ruff_python_formatter/src/builders.rs index 5d7e0c2c3f..95a2a76ace 100644 --- a/crates/ruff_python_formatter/src/builders.rs +++ b/crates/ruff_python_formatter/src/builders.rs @@ -3,7 +3,6 @@ use ruff_python_ast::Ranged; use ruff_python_trivia::{SimpleToken, SimpleTokenKind, SimpleTokenizer}; use ruff_text_size::{TextRange, TextSize}; -use crate::comments::{dangling_comments, trailing_comments, SourceComment}; use crate::context::{NodeLevel, WithNodeLevel}; use crate::prelude::*; use crate::MagicTrailingComma; @@ -209,64 +208,3 @@ impl<'fmt, 'ast, 'buf> JoinCommaSeparatedBuilder<'fmt, 'ast, 'buf> { }) } } - -/// Format comments inside empty parentheses, brackets or curly braces. -/// -/// Empty `()`, `[]` and `{}` are special because there can be dangling comments, and they can be in -/// two positions: -/// ```python -/// x = [ # end-of-line -/// # own line -/// ] -/// ``` -/// These comments are dangling because they can't be assigned to any element inside as they would -/// in all other cases. -pub(crate) fn empty_parenthesized_with_dangling_comments( - opening: StaticText, - comments: &[SourceComment], - closing: StaticText, -) -> EmptyWithDanglingComments { - EmptyWithDanglingComments { - opening, - comments, - closing, - } -} - -pub(crate) struct EmptyWithDanglingComments<'a> { - opening: StaticText, - comments: &'a [SourceComment], - closing: StaticText, -} - -impl<'ast> Format> for EmptyWithDanglingComments<'_> { - fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - let end_of_line_split = self - .comments - .partition_point(|comment| comment.line_position().is_end_of_line()); - debug_assert!(self.comments[end_of_line_split..] - .iter() - .all(|comment| comment.line_position().is_own_line())); - write!( - f, - [group(&format_args![ - self.opening, - // end-of-line comments - trailing_comments(&self.comments[..end_of_line_split]), - // Avoid unstable formatting with - // ```python - // x = () - (# - // ) - // ``` - // Without this the comment would go after the empty tuple first, but still expand - // the bin op. In the second formatting pass they are trailing bin op comments - // so the bin op collapse. Suboptimally we keep parentheses around the bin op in - // either case. - (!self.comments[..end_of_line_split].is_empty()).then_some(hard_line_break()), - // own line comments, which need to be indented - soft_block_indent(&dangling_comments(&self.comments[end_of_line_split..])), - self.closing - ])] - ) - } -} diff --git a/crates/ruff_python_formatter/src/expression/expr_dict.rs b/crates/ruff_python_formatter/src/expression/expr_dict.rs index 2cd41626ed..39fae66527 100644 --- a/crates/ruff_python_formatter/src/expression/expr_dict.rs +++ b/crates/ruff_python_formatter/src/expression/expr_dict.rs @@ -4,9 +4,10 @@ use ruff_python_ast::Ranged; use ruff_python_ast::{Expr, ExprDict}; use ruff_text_size::TextRange; -use crate::builders::empty_parenthesized_with_dangling_comments; use crate::comments::leading_comments; -use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; +use crate::expression::parentheses::{ + empty_parenthesized, parenthesized, NeedsParentheses, OptionalParentheses, +}; use crate::prelude::*; use crate::FormatNodeRule; @@ -69,8 +70,7 @@ impl FormatNodeRule for FormatExprDict { let dangling = comments.dangling_comments(item); if values.is_empty() { - return empty_parenthesized_with_dangling_comments(text("{"), dangling, text("}")) - .fmt(f); + return empty_parenthesized("{", dangling, "}").fmt(f); } let format_pairs = format_with(|f| { diff --git a/crates/ruff_python_formatter/src/expression/expr_list.rs b/crates/ruff_python_formatter/src/expression/expr_list.rs index 89ef07bcd6..7c91b4ef36 100644 --- a/crates/ruff_python_formatter/src/expression/expr_list.rs +++ b/crates/ruff_python_formatter/src/expression/expr_list.rs @@ -1,9 +1,10 @@ -use ruff_formatter::prelude::{format_with, text}; +use ruff_formatter::prelude::format_with; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{ExprList, Ranged}; -use crate::builders::empty_parenthesized_with_dangling_comments; -use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; +use crate::expression::parentheses::{ + empty_parenthesized, parenthesized, NeedsParentheses, OptionalParentheses, +}; use crate::prelude::*; use crate::FormatNodeRule; @@ -22,8 +23,7 @@ impl FormatNodeRule for FormatExprList { let dangling = comments.dangling_comments(item); if elts.is_empty() { - return empty_parenthesized_with_dangling_comments(text("["), dangling, text("]")) - .fmt(f); + return empty_parenthesized("[", dangling, "]").fmt(f); } let items = format_with(|f| { diff --git a/crates/ruff_python_formatter/src/expression/expr_tuple.rs b/crates/ruff_python_formatter/src/expression/expr_tuple.rs index da21a5a21f..df1d2db7ce 100644 --- a/crates/ruff_python_formatter/src/expression/expr_tuple.rs +++ b/crates/ruff_python_formatter/src/expression/expr_tuple.rs @@ -4,8 +4,10 @@ use ruff_python_ast::ExprTuple; use ruff_python_ast::{Expr, Ranged}; use ruff_text_size::TextRange; -use crate::builders::{empty_parenthesized_with_dangling_comments, parenthesize_if_expands}; -use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; +use crate::builders::parenthesize_if_expands; +use crate::expression::parentheses::{ + empty_parenthesized, parenthesized, NeedsParentheses, OptionalParentheses, +}; use crate::prelude::*; #[derive(Eq, PartialEq, Debug, Default)] @@ -117,8 +119,7 @@ impl FormatNodeRule for FormatExprTuple { // In all other cases comments get assigned to a list element match elts.as_slice() { [] => { - return empty_parenthesized_with_dangling_comments(text("("), dangling, text(")")) - .fmt(f); + return empty_parenthesized("(", dangling, ")").fmt(f); } [single] => match self.parentheses { TupleParentheses::Preserve diff --git a/crates/ruff_python_formatter/src/expression/parentheses.rs b/crates/ruff_python_formatter/src/expression/parentheses.rs index 9c2a962bcc..6864c80458 100644 --- a/crates/ruff_python_formatter/src/expression/parentheses.rs +++ b/crates/ruff_python_formatter/src/expression/parentheses.rs @@ -4,7 +4,9 @@ use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::Ranged; use ruff_python_trivia::{first_non_trivia_token, SimpleToken, SimpleTokenKind, SimpleTokenizer}; -use crate::comments::{dangling_open_parenthesis_comments, SourceComment}; +use crate::comments::{ + dangling_comments, dangling_open_parenthesis_comments, trailing_comments, SourceComment, +}; use crate::context::{NodeLevel, WithNodeLevel}; use crate::prelude::*; @@ -307,6 +309,67 @@ impl<'ast> Format> for FormatInParenthesesOnlyGroup<'_, 'a } } +/// Format comments inside empty parentheses, brackets or curly braces. +/// +/// Empty `()`, `[]` and `{}` are special because there can be dangling comments, and they can be in +/// two positions: +/// ```python +/// x = [ # end-of-line +/// # own line +/// ] +/// ``` +/// These comments are dangling because they can't be assigned to any element inside as they would +/// in all other cases. +pub(crate) fn empty_parenthesized<'content>( + left: &'static str, + comments: &'content [SourceComment], + right: &'static str, +) -> FormatEmptyParenthesized<'content> { + FormatEmptyParenthesized { + left, + comments, + right, + } +} + +pub(crate) struct FormatEmptyParenthesized<'content> { + left: &'static str, + comments: &'content [SourceComment], + right: &'static str, +} + +impl Format> for FormatEmptyParenthesized<'_> { + fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { + let end_of_line_split = self + .comments + .partition_point(|comment| comment.line_position().is_end_of_line()); + debug_assert!(self.comments[end_of_line_split..] + .iter() + .all(|comment| comment.line_position().is_own_line())); + write!( + f, + [group(&format_args![ + text(self.left), + // end-of-line comments + trailing_comments(&self.comments[..end_of_line_split]), + // Avoid unstable formatting with + // ```python + // x = () - (# + // ) + // ``` + // Without this the comment would go after the empty tuple first, but still expand + // the bin op. In the second formatting pass they are trailing bin op comments + // so the bin op collapse. Suboptimally we keep parentheses around the bin op in + // either case. + (!self.comments[..end_of_line_split].is_empty()).then_some(hard_line_break()), + // own line comments, which need to be indented + soft_block_indent(&dangling_comments(&self.comments[end_of_line_split..])), + text(self.right) + ])] + ) + } +} + #[cfg(test)] mod tests { use ruff_python_ast::node::AnyNodeRef; diff --git a/crates/ruff_python_formatter/src/other/arguments.rs b/crates/ruff_python_formatter/src/other/arguments.rs index 291dd9159e..6810397b65 100644 --- a/crates/ruff_python_formatter/src/other/arguments.rs +++ b/crates/ruff_python_formatter/src/other/arguments.rs @@ -4,9 +4,8 @@ use ruff_python_ast::{Arguments, Expr, Ranged}; use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer}; use ruff_text_size::{TextRange, TextSize}; -use crate::builders::empty_parenthesized_with_dangling_comments; use crate::expression::expr_generator_exp::GeneratorExpParentheses; -use crate::expression::parentheses::{parenthesized, Parentheses}; +use crate::expression::parentheses::{empty_parenthesized, parenthesized, Parentheses}; use crate::prelude::*; use crate::FormatNodeRule; @@ -24,14 +23,8 @@ impl FormatNodeRule for FormatArguments { // ``` if item.args.is_empty() && item.keywords.is_empty() { let comments = f.context().comments().clone(); - return write!( - f, - [empty_parenthesized_with_dangling_comments( - text("("), - comments.dangling_comments(item), - text(")"), - )] - ); + let dangling = comments.dangling_comments(item); + return write!(f, [empty_parenthesized("(", dangling, ")")]); } let all_arguments = format_with(|f: &mut PyFormatter| { diff --git a/crates/ruff_python_formatter/src/other/parameters.rs b/crates/ruff_python_formatter/src/other/parameters.rs index fa15f83efe..cbd9b594b7 100644 --- a/crates/ruff_python_formatter/src/other/parameters.rs +++ b/crates/ruff_python_formatter/src/other/parameters.rs @@ -6,12 +6,11 @@ use ruff_python_ast::{Parameters, Ranged}; use ruff_python_trivia::{SimpleToken, SimpleTokenKind, SimpleTokenizer}; use ruff_text_size::{TextRange, TextSize}; -use crate::builders::empty_parenthesized_with_dangling_comments; use crate::comments::{ leading_comments, leading_node_comments, trailing_comments, CommentLinePosition, SourceComment, }; use crate::context::{NodeLevel, WithNodeLevel}; -use crate::expression::parentheses::parenthesized; +use crate::expression::parentheses::{empty_parenthesized, parenthesized}; use crate::prelude::*; use crate::FormatNodeRule; @@ -245,14 +244,7 @@ impl FormatNodeRule for FormatParameters { write!(f, [group(&format_inner)]) } else if num_parameters == 0 { // No parameters, format any dangling comments between `()` - write!( - f, - [empty_parenthesized_with_dangling_comments( - text("("), - dangling, - text(")"), - )] - ) + write!(f, [empty_parenthesized("(", dangling, ")")]) } else { write!( f, From d33618062e3135dd99e517e39efb09e37226a1e8 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 8 Aug 2023 15:16:36 -0500 Subject: [PATCH 039/155] Improve documentation for `PLE1300` (#6430) --- .../src/rules/pylint/rules/bad_string_format_character.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/ruff/src/rules/pylint/rules/bad_string_format_character.rs b/crates/ruff/src/rules/pylint/rules/bad_string_format_character.rs index 39fd1c4b34..6639fb95ce 100644 --- a/crates/ruff/src/rules/pylint/rules/bad_string_format_character.rs +++ b/crates/ruff/src/rules/pylint/rules/bad_string_format_character.rs @@ -19,8 +19,7 @@ use crate::checkers::ast::Checker; /// Checks for unsupported format types in format strings. /// /// ## Why is this bad? -/// The format string is not checked at compile time, so it is easy to -/// introduce bugs by mistyping the format string. +/// An invalid format string character will result in an error at runtime. /// /// ## Example /// ```python @@ -41,6 +40,7 @@ impl Violation for BadStringFormatCharacter { } } +/// PLE1300 /// Ex) `"{:z}".format("1")` pub(crate) fn call(checker: &mut Checker, string: &str, range: TextRange) { if let Ok(format_string) = FormatString::from_str(string) { @@ -64,6 +64,7 @@ pub(crate) fn call(checker: &mut Checker, string: &str, range: TextRange) { } } +/// PLE1300 /// Ex) `"%z" % "1"` pub(crate) fn percent(checker: &mut Checker, expr: &Expr) { // Grab each string segment (in case there's an implicit concatenation). From 55d6fd53cde7579a8961bef13333e6692f9aa3fd Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 8 Aug 2023 16:48:38 -0400 Subject: [PATCH 040/155] Treat comments on open parentheses in return annotations as dangling (#6413) ## Summary Given: ```python def double(a: int) -> ( # Hello int ): return 2*a ``` We currently treat `# Hello` as a trailing comment on the parameters (`(a: int)`). This PR adds a placement method to instead treat it as a dangling comment on the function definition itself, so that it gets formatted at the end of the definition, like: ```python def double(a: int) -> int: # Hello return 2*a ``` The formatting in this case is unchanged, but it's incorrect IMO for that to be a trailing comment on the parameters, and that placement leads to an instability after changing the grouping in #6410. Fixing this led to a _different_ instability related to tuple return type annotations, like: ```python def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] ): ... ``` (This is a real example.) To fix, I had to special-case tuples in that spot, though I'm not certain that's correct. --- .../test/fixtures/ruff/statement/function.py | 38 ++++++ .../src/comments/placement.rs | 39 +++++- .../src/statement/stmt_function_def.rs | 25 ++-- .../format@statement__function.py.snap | 121 ++++++++++++++++++ 4 files changed, 211 insertions(+), 12 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py index 42e643032c..e59547d6ce 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py @@ -371,3 +371,41 @@ def f( # first # third ): ... + +# Handle comments on empty tuple return types. +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + # comment +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1, 2 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + (1, 2) +): ... + +def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 + self, m: Match[str], data: str +) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: + ... + +def double(a: int # Hello +) -> (int): + return 2 * a + +def double(a: int) -> ( # Hello + int +): + return 2*a + +def double(a: int) -> ( # Hello +): + return 2*a diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 1385b8ffa5..113b48ee93 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -67,7 +67,10 @@ pub(super) fn place_comment<'a>( handle_module_level_own_line_comment_before_class_or_function_comment(comment, locator) } AnyNodeRef::WithItem(_) => handle_with_item_comment(comment, locator), - AnyNodeRef::StmtFunctionDef(_) => handle_leading_function_with_decorators_comment(comment), + AnyNodeRef::StmtFunctionDef(function_def) => { + handle_leading_function_with_decorators_comment(comment) + .or_else(|comment| handle_leading_returns_comment(comment, function_def)) + } AnyNodeRef::StmtClassDef(class_def) => { handle_leading_class_with_decorators_comment(comment, class_def) } @@ -783,6 +786,40 @@ fn handle_leading_function_with_decorators_comment(comment: DecoratedComment) -> } } +/// Handles end-of-line comments between function parameters and the return type annotation, +/// attaching them as dangling comments to the function instead of making them trailing +/// parameter comments. +/// +/// ```python +/// def double(a: int) -> ( # Hello +/// int +/// ): +/// return 2*a +/// ``` +fn handle_leading_returns_comment<'a>( + comment: DecoratedComment<'a>, + function_def: &'a ast::StmtFunctionDef, +) -> CommentPlacement<'a> { + let parameters = function_def.parameters.as_ref(); + let Some(returns) = function_def.returns.as_deref() else { + return CommentPlacement::Default(comment); + }; + + let is_preceding_parameters = comment + .preceding_node() + .is_some_and(|node| node == parameters.into()); + + let is_following_returns = comment + .following_node() + .is_some_and(|node| node == returns.into()); + + if comment.line_position().is_end_of_line() && is_preceding_parameters && is_following_returns { + CommentPlacement::dangling(comment.enclosing_node(), comment) + } else { + CommentPlacement::Default(comment) + } +} + /// Handle comments between decorators and the decorated node. /// /// For example, given: diff --git a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs index 80a8da56ca..4533a6012c 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs @@ -61,17 +61,20 @@ impl FormatNodeRule for FormatStmtFunctionDef { write!(f, [item.parameters.format()])?; if let Some(return_annotation) = item.returns.as_ref() { - write!( - f, - [ - space(), - text("->"), - space(), - optional_parentheses( - &return_annotation.format().with_options(Parentheses::Never) - ) - ] - )?; + write!(f, [space(), text("->"), space()])?; + if return_annotation.is_tuple_expr() { + write!( + f, + [return_annotation.format().with_options(Parentheses::Never)] + )?; + } else { + write!( + f, + [optional_parentheses( + &return_annotation.format().with_options(Parentheses::Never), + )] + )?; + } } write!( diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index 8fba525759..7868120be5 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -377,6 +377,44 @@ def f( # first # third ): ... + +# Handle comments on empty tuple return types. +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + # comment +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1, 2 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + (1, 2) +): ... + +def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 + self, m: Match[str], data: str +) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: + ... + +def double(a: int # Hello +) -> (int): + return 2 * a + +def double(a: int) -> ( # Hello + int +): + return 2*a + +def double(a: int) -> ( # Hello +): + return 2*a ``` ## Output @@ -905,6 +943,89 @@ def f( # first /, # second ): ... + + +# Handle comments on empty tuple return types. +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> ( # type: ignore[override] +): + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> ( # type: ignore[override] + # comment +): + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> 1: # type: ignore[override] + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> ( # type: ignore[override] + 1, + 2, +): + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> (1, 2): # type: ignore[override] + ... + + +def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 + self, m: Match[str], data: str +) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: + ... + + +def double( + a: int, # Hello +) -> int: + return 2 * a + + +def double(a: int) -> int: # Hello + return 2 * a + + +def double(a: int) -> ( # Hello +): + return 2 * a ``` From 1b9fed83974b8e300ad2286c54eb3a00b78aa1c5 Mon Sep 17 00:00:00 2001 From: Tom Kuson Date: Tue, 8 Aug 2023 21:51:37 +0100 Subject: [PATCH 041/155] Error on zero tab width (#6429) ## Summary Error if `tab-size` is set to zero (it is used as a divisor). Closes #6423. Also fixes a typo. ## Test Plan Running ruff with a config ```toml [tool.ruff] tab-size = 0 ``` returns an error message to the user saying that `tab-size` must be greater than zero. --- crates/ruff/src/line_width.rs | 23 ++++++++++++----------- crates/ruff/src/message/text.rs | 4 +--- crates/ruff/src/rules/pycodestyle/mod.rs | 3 ++- crates/ruff/src/settings/options.rs | 4 ++-- crates/ruff_cache/src/cache_key.rs | 8 ++++++++ ruff.schema.json | 4 ++-- 6 files changed, 27 insertions(+), 19 deletions(-) diff --git a/crates/ruff/src/line_width.rs b/crates/ruff/src/line_width.rs index 8619b42aa3..a3db08416c 100644 --- a/crates/ruff/src/line_width.rs +++ b/crates/ruff/src/line_width.rs @@ -1,4 +1,5 @@ use serde::{Deserialize, Serialize}; +use std::num::NonZeroU8; use unicode_width::UnicodeWidthChar; use ruff_macros::CacheKey; @@ -83,7 +84,7 @@ impl LineWidth { } fn update(mut self, chars: impl Iterator) -> Self { - let tab_size: usize = self.tab_size.into(); + let tab_size: usize = self.tab_size.as_usize(); for c in chars { match c { '\t' => { @@ -144,22 +145,22 @@ impl PartialOrd for LineWidth { /// The size of a tab. #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, CacheKey)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct TabSize(pub u8); +pub struct TabSize(pub NonZeroU8); + +impl TabSize { + fn as_usize(self) -> usize { + self.0.get() as usize + } +} impl Default for TabSize { fn default() -> Self { - Self(4) + Self(NonZeroU8::new(4).unwrap()) } } -impl From for TabSize { - fn from(tab_size: u8) -> Self { +impl From for TabSize { + fn from(tab_size: NonZeroU8) -> Self { Self(tab_size) } } - -impl From for usize { - fn from(tab_size: TabSize) -> Self { - tab_size.0 as usize - } -} diff --git a/crates/ruff/src/message/text.rs b/crates/ruff/src/message/text.rs index 3aa5ebc545..31bbb614d6 100644 --- a/crates/ruff/src/message/text.rs +++ b/crates/ruff/src/message/text.rs @@ -293,12 +293,10 @@ impl Display for MessageCodeFrame<'_> { } fn replace_whitespace(source: &str, annotation_range: TextRange) -> SourceCode { - static TAB_SIZE: TabSize = TabSize(4); // TODO(jonathan): use `tab-size` - let mut result = String::new(); let mut last_end = 0; let mut range = annotation_range; - let mut line_width = LineWidth::new(TAB_SIZE); + let mut line_width = LineWidth::new(TabSize::default()); for (index, c) in source.char_indices() { let old_width = line_width.get(); diff --git a/crates/ruff/src/rules/pycodestyle/mod.rs b/crates/ruff/src/rules/pycodestyle/mod.rs index 9810feb01c..86eb5925c6 100644 --- a/crates/ruff/src/rules/pycodestyle/mod.rs +++ b/crates/ruff/src/rules/pycodestyle/mod.rs @@ -6,6 +6,7 @@ pub(crate) mod helpers; #[cfg(test)] mod tests { + use std::num::NonZeroU8; use std::path::Path; use anyhow::Result; @@ -204,7 +205,7 @@ mod tests { let diagnostics = test_path( Path::new("pycodestyle/E501_2.py"), &settings::Settings { - tab_size: tab_size.into(), + tab_size: NonZeroU8::new(tab_size).unwrap().into(), ..settings::Settings::for_rule(Rule::LineTooLong) }, )?; diff --git a/crates/ruff/src/settings/options.rs b/crates/ruff/src/settings/options.rs index 5e3ea14207..43d3618d77 100644 --- a/crates/ruff/src/settings/options.rs +++ b/crates/ruff/src/settings/options.rs @@ -312,13 +312,13 @@ pub struct Options { "# )] /// The line length to use when enforcing long-lines violations (like - /// `E501`). + /// `E501`). Must be greater than `0`. pub line_length: Option, #[option( default = "4", value_type = "int", example = r#" - tab_size = 8 + tab-size = 8 "# )] /// The tabulation size to calculate line length. diff --git a/crates/ruff_cache/src/cache_key.rs b/crates/ruff_cache/src/cache_key.rs index e015112bda..c62e580d1e 100644 --- a/crates/ruff_cache/src/cache_key.rs +++ b/crates/ruff_cache/src/cache_key.rs @@ -2,6 +2,7 @@ use std::borrow::Cow; use std::collections::hash_map::DefaultHasher; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::hash::{Hash, Hasher}; +use std::num::NonZeroU8; use std::ops::{Deref, DerefMut}; use std::path::{Path, PathBuf}; @@ -205,6 +206,13 @@ impl CacheKey for i8 { } } +impl CacheKey for NonZeroU8 { + #[inline] + fn cache_key(&self, state: &mut CacheKeyHasher) { + state.write_u8(self.get()); + } +} + macro_rules! impl_cache_key_tuple { () => ( impl CacheKey for () { diff --git a/ruff.schema.json b/ruff.schema.json index 2c5bfc3090..9d47d617dc 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -376,7 +376,7 @@ ] }, "line-length": { - "description": "The line length to use when enforcing long-lines violations (like `E501`).", + "description": "The line length to use when enforcing long-lines violations (like `E501`). Must be greater than `0`.", "anyOf": [ { "$ref": "#/definitions/LineLength" @@ -2741,7 +2741,7 @@ "description": "The size of a tab.", "type": "integer", "format": "uint8", - "minimum": 0.0 + "minimum": 1.0 }, "Version": { "type": "string" From a2758513de9d0a374ca13f6f7739fb9cd70cee75 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 8 Aug 2023 22:36:39 -0400 Subject: [PATCH 042/155] Fix false-positive in submodule resolution (#6435) Closes https://github.com/astral-sh/ruff/issues/6433. --- .../test/fixtures/pyflakes/F401_0.py | 7 ++++++ .../resources/test/fixtures/pyflakes/F823.py | 10 ++++++++ ...ules__pyflakes__tests__F401_F401_0.py.snap | 24 +++++++++++++++++++ .../pyupgrade/rules/use_pep695_type_alias.rs | 22 +++++++++-------- crates/ruff_python_semantic/src/binding.rs | 2 +- crates/ruff_python_semantic/src/model.rs | 14 ++++++++++- 6 files changed, 67 insertions(+), 12 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pyflakes/F401_0.py b/crates/ruff/resources/test/fixtures/pyflakes/F401_0.py index 79c56bc099..dcec5beed4 100644 --- a/crates/ruff/resources/test/fixtures/pyflakes/F401_0.py +++ b/crates/ruff/resources/test/fixtures/pyflakes/F401_0.py @@ -92,3 +92,10 @@ match *0, 1, *2: case 0,: import x import y + + +# Test: access a sub-importation via an alias. +import foo.bar as bop +import foo.bar.baz + +print(bop.baz.read_csv("test.csv")) diff --git a/crates/ruff/resources/test/fixtures/pyflakes/F823.py b/crates/ruff/resources/test/fixtures/pyflakes/F823.py index 343150143e..d6c5ee7d44 100644 --- a/crates/ruff/resources/test/fixtures/pyflakes/F823.py +++ b/crates/ruff/resources/test/fixtures/pyflakes/F823.py @@ -70,3 +70,13 @@ import requests_mock as rm def requests_mock(requests_mock: rm.Mocker): print(rm.ANY) + + +import sklearn.base +import mlflow.sklearn + + +def f(): + import sklearn + + mlflow diff --git a/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F401_F401_0.py.snap b/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F401_F401_0.py.snap index 67c97bb6ba..4996e8b899 100644 --- a/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F401_F401_0.py.snap +++ b/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F401_F401_0.py.snap @@ -151,6 +151,8 @@ F401_0.py:93:16: F401 [*] `x` imported but unused 92 92 | case 0,: 93 |- import x 94 93 | import y +95 94 | +96 95 | F401_0.py:94:16: F401 [*] `y` imported but unused | @@ -166,5 +168,27 @@ F401_0.py:94:16: F401 [*] `y` imported but unused 92 92 | case 0,: 93 93 | import x 94 |- import y +95 94 | +96 95 | +97 96 | # Test: access a sub-importation via an alias. + +F401_0.py:99:8: F401 [*] `foo.bar.baz` imported but unused + | + 97 | # Test: access a sub-importation via an alias. + 98 | import foo.bar as bop + 99 | import foo.bar.baz + | ^^^^^^^^^^^ F401 +100 | +101 | print(bop.baz.read_csv("test.csv")) + | + = help: Remove unused import: `foo.bar.baz` + +ℹ Fix +96 96 | +97 97 | # Test: access a sub-importation via an alias. +98 98 | import foo.bar as bop +99 |-import foo.bar.baz +100 99 | +101 100 | print(bop.baz.read_csv("test.csv")) diff --git a/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs b/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs index 3db1ec67df..4c51960ec9 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/use_pep695_type_alias.rs @@ -130,16 +130,18 @@ impl<'a> Visitor<'a> for TypeVarReferenceVisitor<'a> { fn visit_expr(&mut self, expr: &'a Expr) { match expr { Expr::Name(name) if name.ctx.is_load() => { - let Some(Stmt::Assign(StmtAssign { value, .. })) = - self.semantic.lookup_symbol(name.id.as_str()) - .and_then(|binding_id| { - self.semantic - .binding(binding_id) - .source - .map(|node_id| self.semantic.statement(node_id)) - }) else { - return; - }; + let Some(Stmt::Assign(StmtAssign { value, .. })) = self + .semantic + .lookup_symbol(name.id.as_str()) + .and_then(|binding_id| { + self.semantic + .binding(binding_id) + .source + .map(|node_id| self.semantic.statement(node_id)) + }) + else { + return; + }; match value.as_ref() { Expr::Subscript(ExprSubscript { diff --git a/crates/ruff_python_semantic/src/binding.rs b/crates/ruff_python_semantic/src/binding.rs index 8194640fff..1d910bbab3 100644 --- a/crates/ruff_python_semantic/src/binding.rs +++ b/crates/ruff_python_semantic/src/binding.rs @@ -585,7 +585,7 @@ impl<'a> Imported<'a> for FromImport<'a> { } /// A wrapper around an import [`BindingKind`] that can be any of the three types of imports. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, is_macro::Is)] pub enum AnyImport<'a> { Import(&'a Import<'a>), SubmoduleImport(&'a SubmoduleImport<'a>), diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index 262b66aa1c..b6e7faa3db 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -590,14 +590,26 @@ impl<'a> SemanticModel<'a> { // print(pa.csv.read_csv("test.csv")) // ``` let import = self.bindings[binding_id].as_any_import()?; + if !import.is_import() { + return None; + } + + // Grab, e.g., `pyarrow` from `import pyarrow as pa`. let call_path = import.call_path(); let segment = call_path.last()?; if *segment == symbol { return None; } + // Locate the submodule import (e.g., `pyarrow.csv`) that `pa` aliases. let binding_id = self.scopes[scope_id].get(segment)?; - if !self.bindings[binding_id].kind.is_submodule_import() { + let submodule = &self.bindings[binding_id].as_any_import()?; + if !submodule.is_submodule_import() { + return None; + } + + // Ensure that the submodule import and the aliased import are from the same module. + if import.module_name() != submodule.module_name() { return None; } From 887a47cad90dc3c7029e729ffc9dab1f7417ea05 Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Wed, 9 Aug 2023 10:22:31 +0530 Subject: [PATCH 043/155] Avoid `S108` if path is inside `tempfile.*` call (#6416) --- .../test/fixtures/flake8_bandit/S108.py | 16 +++++++ .../src/checkers/ast/analyze/expression.rs | 8 +--- .../rules/hardcoded_tmp_directory.rs | 46 +++++++++++++------ 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_bandit/S108.py b/crates/ruff/resources/test/fixtures/flake8_bandit/S108.py index d60b808cb5..1689af66e6 100644 --- a/crates/ruff/resources/test/fixtures/flake8_bandit/S108.py +++ b/crates/ruff/resources/test/fixtures/flake8_bandit/S108.py @@ -14,3 +14,19 @@ with open("/dev/shm/unit/test", "w") as f: # not ok by config with open("/foo/bar", "w") as f: f.write("def") + +# Using `tempfile` module should be ok +import tempfile +from tempfile import TemporaryDirectory + +with tempfile.NamedTemporaryFile(dir="/tmp") as f: + f.write(b"def") + +with tempfile.NamedTemporaryFile(dir="/var/tmp") as f: + f.write(b"def") + +with tempfile.TemporaryDirectory(dir="/dev/shm") as d: + pass + +with TemporaryDirectory(dir="/tmp") as d: + pass diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index 66e9678955..8589509796 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -1229,13 +1229,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { } } if checker.enabled(Rule::HardcodedTempFile) { - if let Some(diagnostic) = flake8_bandit::rules::hardcoded_tmp_directory( - expr, - value, - &checker.settings.flake8_bandit.hardcoded_tmp_directory, - ) { - checker.diagnostics.push(diagnostic); - } + flake8_bandit::rules::hardcoded_tmp_directory(checker, expr, value); } if checker.enabled(Rule::UnicodeKindPrefix) { pyupgrade::rules::unicode_kind_prefix(checker, expr, kind.as_deref()); diff --git a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs index 7993dd1b24..c677e9e909 100644 --- a/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs +++ b/crates/ruff/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs @@ -1,8 +1,10 @@ -use ruff_python_ast::{Expr, Ranged}; +use ruff_python_ast::{self as ast, Expr, Ranged}; use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; +use crate::checkers::ast::Checker; + /// ## What it does /// Checks for the use of hardcoded temporary file or directory paths. /// @@ -49,19 +51,33 @@ impl Violation for HardcodedTempFile { } /// S108 -pub(crate) fn hardcoded_tmp_directory( - expr: &Expr, - value: &str, - prefixes: &[String], -) -> Option { - if prefixes.iter().any(|prefix| value.starts_with(prefix)) { - Some(Diagnostic::new( - HardcodedTempFile { - string: value.to_string(), - }, - expr.range(), - )) - } else { - None +pub(crate) fn hardcoded_tmp_directory(checker: &mut Checker, expr: &Expr, value: &str) { + if !checker + .settings + .flake8_bandit + .hardcoded_tmp_directory + .iter() + .any(|prefix| value.starts_with(prefix)) + { + return; } + + if let Some(Expr::Call(ast::ExprCall { func, .. })) = + checker.semantic().current_expression_parent() + { + if checker + .semantic() + .resolve_call_path(func) + .is_some_and(|call_path| matches!(call_path.as_slice(), ["tempfile", ..])) + { + return; + } + } + + checker.diagnostics.push(Diagnostic::new( + HardcodedTempFile { + string: value.to_string(), + }, + expr.range(), + )); } From e257c5af32636657b570cd2715dc79eae2f012af Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Wed, 9 Aug 2023 10:28:52 +0530 Subject: [PATCH 044/155] Add support for help end IPython escape commands (#6358) ## Summary This PR adds support for a stricter version of help end escape commands[^1] in the parser. By stricter, I mean that the escape tokens are only at the end of the command and there are no tokens at the start. This makes it difficult to implement it in the lexer without having to do a lot of look aheads or keeping track of previous tokens. Now, as we're adding this in the parser, the lexer needs to recognize and emit a new token for `?`. So, `Question` token is added which will be recognized only in `Jupyter` mode. The conditions applied are the same as the ones in the original implementation in IPython codebase (which is a regex): * There can only be either 1 or 2 question mark(s) at the end * The node before the question mark can be a `Name`, `Attribute`, `Subscript` (only with integer constants in slice position), or any combination of the 3 nodes. ## Test Plan Added test cases for various combination of the possible nodes in the command value position and update the snapshots. fixes: #6359 fixes: #5030 (This is the final piece) [^1]: https://github.com/astral-sh/ruff/pull/6272#issue-1833094281 --- crates/ruff_python_parser/src/lexer.rs | 3 + crates/ruff_python_parser/src/parser.rs | 9 + crates/ruff_python_parser/src/python.lalrpop | 75 + crates/ruff_python_parser/src/python.rs | 74916 +++++++++------- ..._parser__parser__tests__jupyter_magic.snap | 51 +- crates/ruff_python_parser/src/token.rs | 6 + 6 files changed, 40274 insertions(+), 34786 deletions(-) diff --git a/crates/ruff_python_parser/src/lexer.rs b/crates/ruff_python_parser/src/lexer.rs index 48670d922b..2366471179 100644 --- a/crates/ruff_python_parser/src/lexer.rs +++ b/crates/ruff_python_parser/src/lexer.rs @@ -780,6 +780,9 @@ impl<'source> Lexer<'source> { self.lex_magic_command(kind) } + + '?' if self.mode == Mode::Jupyter => Tok::Question, + '/' => { if self.cursor.eat_char('=') { Tok::SlashEqual diff --git a/crates/ruff_python_parser/src/parser.rs b/crates/ruff_python_parser/src/parser.rs index d9edbbd7b1..b1b5b4488e 100644 --- a/crates/ruff_python_parser/src/parser.rs +++ b/crates/ruff_python_parser/src/parser.rs @@ -1180,6 +1180,15 @@ foo = %foo \ % foo foo = %foo # comment + +# Help end line magics +foo? +foo.bar?? +foo.bar.baz? +foo[0]?? +foo[0][1]? +foo.bar[0].baz[1]?? +foo.bar[0].baz[2].egg?? "# .trim(), Mode::Jupyter, diff --git a/crates/ruff_python_parser/src/python.lalrpop b/crates/ruff_python_parser/src/python.lalrpop index 3416ab6c09..a98a2317f3 100644 --- a/crates/ruff_python_parser/src/python.lalrpop +++ b/crates/ruff_python_parser/src/python.lalrpop @@ -14,6 +14,7 @@ use crate::{ string::parse_strings, token::{self, StringKind}, }; +use lalrpop_util::ParseError; grammar(mode: Mode); @@ -89,6 +90,7 @@ SmallStatement: ast::Stmt = { AssertStatement, TypeAliasStatement, LineMagicStatement, + HelpEndLineMagic, }; PassStatement: ast::Stmt = { @@ -366,6 +368,78 @@ LineMagicExpr: ast::Expr = { } } +HelpEndLineMagic: ast::Stmt = { + // We are permissive than the original implementation because we would allow whitespace + // between the expression and the suffix while the IPython implementation doesn't allow it. + // For example, `foo ?` would be valid in our case but invalid from IPython. + > =>? { + fn unparse_expr(expr: &ast::Expr, buffer: &mut String) -> Result<(), LexicalError> { + match expr { + ast::Expr::Name(ast::ExprName { id, .. }) => { + buffer.push_str(id.as_str()); + }, + ast::Expr::Subscript(ast::ExprSubscript { value, slice, range, .. }) => { + let ast::Expr::Constant(ast::ExprConstant { value: ast::Constant::Int(integer), .. }) = slice.as_ref() else { + return Err(LexicalError { + error: LexicalErrorType::OtherError("only integer constants are allowed in Subscript expressions in help end escape command".to_string()), + location: range.start(), + }); + }; + unparse_expr(value, buffer)?; + buffer.push('['); + buffer.push_str(&format!("{}", integer)); + buffer.push(']'); + }, + ast::Expr::Attribute(ast::ExprAttribute { value, attr, .. }) => { + unparse_expr(value, buffer)?; + buffer.push('.'); + buffer.push_str(attr.as_str()); + }, + _ => { + return Err(LexicalError { + error: LexicalErrorType::OtherError("only Name, Subscript and Attribute expressions are allowed in help end escape command".to_string()), + location: expr.range().start(), + }); + } + } + Ok(()) + } + + if mode != Mode::Jupyter { + return Err(ParseError::User { + error: LexicalError { + error: LexicalErrorType::OtherError("IPython escape commands are only allowed in Jupyter mode".to_string()), + location, + }, + }); + } + + let kind = match suffix.len() { + 1 => MagicKind::Help, + 2 => MagicKind::Help2, + _ => { + return Err(ParseError::User { + error: LexicalError { + error: LexicalErrorType::OtherError("maximum of 2 `?` tokens are allowed in help end escape command".to_string()), + location, + }, + }); + } + }; + + let mut value = String::new(); + unparse_expr(&e, &mut value)?; + + Ok(ast::Stmt::LineMagic( + ast::StmtLineMagic { + kind, + value, + range: (location..end_location).into() + } + )) + } +} + CompoundStatement: ast::Stmt = { MatchStatement, IfStatement, @@ -1732,6 +1806,7 @@ extern { Dedent => token::Tok::Dedent, StartModule => token::Tok::StartModule, StartExpression => token::Tok::StartExpression, + "?" => token::Tok::Question, "+" => token::Tok::Plus, "-" => token::Tok::Minus, "~" => token::Tok::Tilde, diff --git a/crates/ruff_python_parser/src/python.rs b/crates/ruff_python_parser/src/python.rs index 4ca7af8dfe..da4a9a1ce9 100644 --- a/crates/ruff_python_parser/src/python.rs +++ b/crates/ruff_python_parser/src/python.rs @@ -1,5 +1,5 @@ // auto-generated: "lalrpop 0.20.0" -// sha3: d713a7771107f8c20353ce5e890fba004b3c5491f513d28e9348a49cd510c59b +// sha3: dec845ec3261934e0c3a17a15f53b12d397b19cee9a45f9d8868c93484de3fe3 use num_bigint::BigInt; use ruff_text_size::TextSize; use ruff_python_ast::{self as ast, Ranged, MagicKind}; @@ -11,6 +11,7 @@ use crate::{ string::parse_strings, token::{self, StringKind}, }; +use lalrpop_util::ParseError; #[allow(unused_extern_crates)] extern crate lalrpop_util as __lalrpop_util; #[allow(unused_imports)] @@ -33,6 +34,7 @@ mod __parse__Top { string::parse_strings, token::{self, StringKind}, }; + use lalrpop_util::ParseError; #[allow(unused_extern_crates)] extern crate lalrpop_util as __lalrpop_util; #[allow(unused_imports)] @@ -140,2322 +142,2528 @@ mod __parse__Top { } const __ACTION: &[i16] = &[ // State 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, // State 1 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 2 - -743, 0, 0, 0, 0, 0, -743, 0, -743, 0, 0, 0, -743, 0, 0, -743, 0, 0, 0, -743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -743, 0, -743, -743, -743, -743, 0, 0, 0, 0, 0, -743, -743, -743, -743, 0, -743, -743, -743, -743, 0, 0, 0, 0, -743, -743, -743, -743, -743, 0, 0, -743, -743, -743, -743, 0, -743, -743, -743, -743, -743, -743, -743, -743, -743, 0, 0, 0, -743, 0, 0, 0, 0, -743, -743, -743, -743, -743, -743, + -792, 0, 0, 0, 0, 0, -792, 0, -792, 0, 0, 0, -792, 0, 0, -792, 0, 0, 0, -792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -792, 0, -792, -792, -792, -792, 0, 0, 0, 0, 0, -792, -792, -792, -792, 0, -792, -792, -792, -792, 0, 0, 0, 0, -792, -792, -792, -792, -792, 0, 0, -792, -792, -792, -792, 0, -792, -792, -792, -792, -792, -792, -792, -792, -792, 0, 0, 0, -792, 0, 0, 0, 0, -792, -792, -792, -792, -792, -792, // State 3 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 4 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 5 - -765, -765, 0, -765, -765, -765, 0, -765, 0, 0, -765, -765, 427, -765, -765, 428, -765, 0, 0, 0, 0, 0, -765, -765, -765, 0, -765, -765, -765, -765, -765, -765, -765, -765, -765, -765, -765, 0, -765, 0, 0, 0, 0, -765, -765, -765, -765, -765, 0, -765, 0, 0, 0, 0, 0, 0, 0, 0, -765, 0, 0, -765, -765, 0, -765, 0, -765, -765, 0, 0, 0, -765, -765, 0, 0, 0, 0, 0, 0, 0, 0, 0, -765, -765, -765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -816, -816, 0, -816, -816, -816, 0, -816, 0, 0, -816, -816, 463, -816, -816, 464, -816, 0, 0, 0, 0, 0, -816, -816, -816, 0, -816, -816, -816, -816, -816, -816, -816, -816, -816, -816, -816, -816, 0, -816, 0, 0, 0, 0, -816, -816, -816, -816, -816, 0, -816, 0, 0, 0, 0, 0, 0, 0, 0, -816, 0, 0, -816, -816, 0, -816, 0, -816, -816, 0, 0, 0, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - -246, -246, -246, -246, -246, -246, 23, -246, -246, -246, -246, -246, -246, -246, -246, -246, -246, 0, 24, 0, -246, -246, -246, -246, -246, 0, -246, -246, -246, -246, -246, -246, -246, -246, -246, -246, -246, -246, -246, 0, 0, 0, 25, -246, -246, -246, -246, -246, 0, -246, 0, 0, 0, 0, 0, 0, 0, 0, -246, 0, 0, -246, -246, 0, -246, 0, -246, -246, 0, 0, 0, -246, -246, 0, 0, 0, 0, 0, 0, 0, 0, 0, -246, -246, -246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -288, -288, -288, -288, -288, -288, 23, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, 0, 24, 0, -288, -288, -288, -288, -288, 0, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, 0, 0, 0, 25, -288, -288, -288, -288, -288, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, 0, -288, -288, 0, -288, 0, -288, -288, 0, 0, 0, -288, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, -288, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - -314, 430, 0, -314, 0, -314, 0, -314, 0, 0, -314, -314, 0, -314, -314, 0, -314, 0, 0, 0, 0, 0, -314, -314, -314, 0, -314, 431, 0, -314, 432, -314, 433, 434, 435, 0, -314, 0, -314, 0, 0, 0, 0, -314, 0, -314, -314, -314, 0, -314, 0, 0, 0, 0, 0, 0, 0, 0, -314, 0, 0, -314, -314, 0, -314, 0, 436, 437, 0, 0, 0, 438, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -314, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -356, 466, 0, -356, 0, -356, 0, -356, 0, 0, -356, -356, 0, -356, -356, 0, -356, 0, 0, 0, 0, 0, -356, -356, -356, 0, -356, 467, 0, -356, 468, -356, 469, 470, 471, 0, -356, 0, 0, -356, 0, 0, 0, 0, -356, 0, -356, -356, -356, 0, -356, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, 0, -356, -356, 0, -356, 0, 472, 473, 0, 0, 0, 474, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -356, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 8 - 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 9 - -153, -153, 0, -153, -153, -153, 0, -153, 0, 0, -153, -153, 0, -153, -153, 0, -153, 0, 0, 0, 0, 0, -153, -153, -153, 0, -153, -153, 442, -153, -153, -153, -153, -153, -153, 443, -153, 0, -153, 0, 0, 0, 0, -153, -153, -153, -153, -153, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, 0, -153, -153, 0, -153, 0, -153, -153, 0, 0, 0, -153, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, -153, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -158, -158, 0, -158, -158, -158, 0, -158, 0, 0, -158, -158, 0, -158, -158, 0, -158, 0, 0, 0, 0, 0, -158, -158, -158, 0, -158, -158, 478, -158, -158, -158, -158, -158, -158, 479, -158, -158, 0, -158, 0, 0, 0, 0, -158, -158, -158, -158, -158, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, -158, -158, 0, -158, 0, -158, -158, 0, 0, 0, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - -167, -167, 444, -167, -167, -167, 0, -167, 445, 0, -167, -167, -167, -167, -167, -167, -167, 0, 0, 0, 446, 447, -167, -167, -167, 0, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, 448, -167, 0, 0, 0, 0, -167, -167, -167, -167, -167, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, -167, -167, 0, -167, 0, -167, -167, 0, 0, 0, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -174, -174, 480, -174, -174, -174, 0, -174, 481, 0, -174, -174, -174, -174, -174, -174, -174, 0, 0, 0, 482, 483, -174, -174, -174, 0, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, 484, -174, 0, 0, 0, 0, -174, -174, -174, -174, -174, 0, -174, 0, 0, 0, 0, 0, 0, 0, 0, -174, 0, 0, -174, -174, 0, -174, 0, -174, -174, 0, 0, 0, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 12 - 0, 0, 0, 0, 0, 0, 13, 456, 14, 37, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 492, 14, 37, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 13 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 14 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 464, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 500, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 15 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 16 - 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 17 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 18 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 46, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 479, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 46, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 515, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 19 - 504, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 505, 16, 506, 0, 52, 507, 53, 54, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, 17, 60, 61, 18, 0, 508, 62, 63, 509, 64, 65, 66, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 557, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 562, 61, 563, 0, 62, 564, 63, 64, 0, 0, 0, 0, 65, 66, 67, 68, 69, 0, 0, 17, 70, 71, 18, 0, 565, 72, 73, 566, 74, 75, 76, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 20 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 21 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 22 - 0, 0, 0, 0, 0, 0, 13, 515, 71, 72, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 572, 82, 83, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 23 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 24 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 25 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 26 - -313, 430, 0, -313, 0, -313, 0, -313, 0, 0, -313, -313, 0, -313, -313, 0, -313, 0, 0, 0, 0, 0, -313, -313, -313, 0, -313, 431, 0, -313, 432, -313, 433, 434, 435, 0, -313, 0, -313, 0, 0, 0, 0, -313, 0, -313, -313, -313, 0, -313, 0, 0, 0, 0, 0, 0, 0, 0, -313, 0, 0, -313, -313, 0, -313, 0, 436, 437, 0, 0, 0, 438, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -355, 466, 0, -355, 0, -355, 0, -355, 0, 0, -355, -355, 0, -355, -355, 0, -355, 0, 0, 0, 0, 0, -355, -355, -355, 0, -355, 467, 0, -355, 468, -355, 469, 470, 471, 0, -355, 0, 0, -355, 0, 0, 0, 0, -355, 0, -355, -355, -355, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, -355, 0, 0, -355, -355, 0, -355, 0, 472, 473, 0, 0, 0, 474, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 27 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 28 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 29 - -418, 0, 0, -418, 0, -418, 13, -418, 14, 0, -418, -418, 411, -418, 0, 412, -418, 0, 0, 413, 0, 0, -418, -418, -418, 0, -418, 0, 0, -418, 0, -418, 0, 0, 0, 0, -418, 0, -418, 414, 415, 416, 15, 0, 0, -418, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, -418, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -464, 0, 0, -464, 0, -464, 13, -464, 14, 0, -464, -464, 447, -464, 0, 448, -464, 0, 0, 449, 0, 0, -464, -464, -464, 0, -464, 0, 0, -464, 0, -464, 0, 0, 0, 0, -464, 0, 0, -464, 450, 451, 452, 15, 0, 0, -464, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, -464, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 30 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 31 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 32 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 33 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 34 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 35 - 0, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 593, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 36 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 37 - -914, 0, 0, 0, 0, 0, 13, -914, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, -914, 0, 0, 0, 0, -914, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -970, 0, 0, 0, 0, 0, 13, -970, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, -970, 0, 0, 0, 0, -970, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 38 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 39 - -245, -245, -245, -245, -245, -245, 23, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, 0, 24, 0, -245, -245, -245, -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, 0, 0, 0, 25, -245, -245, -245, -245, -245, 0, -245, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, -245, -245, 0, -245, 0, -245, -245, 0, 0, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -287, -287, -287, -287, -287, -287, 23, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, 0, 24, 0, -287, -287, -287, -287, -287, 0, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, 0, 0, 0, 25, -287, -287, -287, -287, -287, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, 0, -287, -287, 0, -287, 0, -287, -287, 0, 0, 0, -287, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, -287, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 40 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, -705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, -752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 41 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -449, 0, 0, 0, 0, 0, 0, 0, 0, 0, -449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 42 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 43 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 44 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 45 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 46 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 47 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 91, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -816, -816, 0, -816, -816, -816, 0, 0, 0, 0, -816, -816, 463, -816, -816, 464, -816, 0, 0, 0, 0, 0, -816, -816, -816, 0, -816, -816, -816, -816, -816, -816, -816, -816, -816, -816, -816, 0, 0, -816, 0, 0, 0, 0, 0, -816, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, 0, -816, -816, 0, 0, 0, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 48 - -374, 0, 0, 557, 0, 558, 0, 0, 0, 0, 559, 560, 0, 561, 0, 0, 562, 0, 0, 0, 0, 0, 563, 564, 0, 0, -374, 0, 0, 565, 0, 95, 0, 0, 0, 0, 566, 0, 567, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -288, -288, -288, -288, -288, -288, 23, 0, -288, -288, -288, -288, -288, -288, -288, -288, -288, 0, 104, 0, -288, -288, -288, -288, -288, 0, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, -288, 0, -288, -288, 0, 0, 0, 105, 0, -288, -288, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, -288, -288, 0, 0, 0, -288, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 49 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 107, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 50 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 51 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + -356, 466, 0, -356, 0, -356, 0, 0, 0, 0, -356, -356, 0, -356, -356, 0, -356, 0, 0, 0, 0, 0, -356, -356, -356, 0, -356, 467, 0, -356, 468, -356, 469, 470, 471, 0, -356, 0, 0, -356, 0, 0, 0, 0, 0, 0, -356, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, 472, 473, 0, 0, 0, 474, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 52 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + -418, 0, 0, 617, 0, 618, 0, 0, 0, 0, 619, 620, 0, 621, 0, 0, 622, 0, 0, 0, 0, 0, 623, 624, 0, 0, -418, 0, 0, 625, 0, 112, 0, 0, 0, 0, 626, 0, 0, 627, 0, 0, 0, 0, 0, 0, 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 53 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -158, -158, 0, -158, -158, -158, 0, 0, 0, 0, -158, -158, 0, -158, -158, 0, -158, 0, 0, 0, 0, 0, -158, -158, -158, 0, -158, -158, 478, -158, -158, -158, -158, -158, -158, 479, -158, 0, 0, -158, 0, 0, 0, 0, 0, -158, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, -158, -158, 0, 0, 0, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 54 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -174, -174, 480, -174, -174, -174, 0, 0, 481, 0, -174, -174, -174, -174, -174, -174, -174, 0, 0, 0, 482, 483, -174, -174, -174, 0, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, -174, 0, 484, -174, 0, 0, 0, 0, 0, -174, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, 0, -174, -174, 0, 0, 0, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 55 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 56 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 635, 14, 119, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 57 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 58 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 638, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 59 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 60 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 61 - -750, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, -750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 62 - -386, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 63 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 64 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 65 - 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 628, 629, 116, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, // State 66 - -152, -152, 0, -152, -152, -152, 0, -152, 0, 0, -152, -152, 0, -152, -152, 0, -152, 0, 0, 0, 0, 0, -152, -152, -152, 0, -152, -152, 442, -152, -152, -152, -152, -152, -152, 443, -152, 0, -152, 0, 0, 0, 0, -152, -152, -152, -152, -152, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, 0, -152, -152, 0, -152, 0, -152, -152, 0, 0, 0, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 67 - -166, -166, 444, -166, -166, -166, 0, -166, 445, 0, -166, -166, -166, -166, -166, -166, -166, 0, 0, 0, 446, 447, -166, -166, -166, 0, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, 448, -166, 0, 0, 0, 0, -166, -166, -166, -166, -166, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, -166, -166, 0, -166, 0, -166, -166, 0, 0, 0, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 68 - 0, 0, 0, 0, 0, 0, 13, 631, 71, 72, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, // State 69 - 0, 0, 0, 0, 0, 0, 0, -410, 0, 0, 0, 0, 0, 0, -410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 70 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 71 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -799, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, -799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 72 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, -817, 412, 0, 0, 0, 413, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, -817, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -432, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, -432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 73 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 74 - -764, -764, 0, -764, -764, -764, 0, -764, 0, 0, -764, -764, 427, -764, -764, 428, -764, 0, 0, 0, 0, 0, -764, -764, -764, 0, -764, -764, -764, -764, -764, -764, -764, -764, -764, -764, -764, 0, -764, 0, 0, 0, 0, -764, -764, -764, -764, -764, 0, -764, 0, 0, 0, 0, 0, 0, 0, 0, -764, 0, 0, -764, -764, 0, -764, 0, -764, -764, 0, 0, 0, -764, -764, 0, 0, 0, 0, 0, 0, 0, 0, 0, -764, -764, -764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 75 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, 695, 141, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 76 - 0, 0, 0, 0, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -300, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 46, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 698, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 77 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -157, -157, 0, -157, -157, -157, 0, -157, 0, 0, -157, -157, 0, -157, -157, 0, -157, 0, 0, 0, 0, 0, -157, -157, -157, 0, -157, -157, 478, -157, -157, -157, -157, -157, -157, 479, -157, -157, 0, -157, 0, 0, 0, 0, -157, -157, -157, -157, -157, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, -157, -157, 0, -157, 0, -157, -157, 0, 0, 0, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 78 - 0, 0, 0, 0, 0, 0, 13, 646, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -173, -173, 480, -173, -173, -173, 0, -173, 481, 0, -173, -173, -173, -173, -173, -173, -173, 0, 0, 0, 482, 483, -173, -173, -173, 0, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, 484, -173, 0, 0, 0, 0, -173, -173, -173, -173, -173, 0, -173, 0, 0, 0, 0, 0, 0, 0, 0, -173, 0, 0, -173, -173, 0, -173, 0, -173, -173, 0, 0, 0, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, -173, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 79 - 0, 0, 0, 0, 0, 0, 13, 649, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 700, 82, 83, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 80 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -456, 0, 0, 0, 0, 0, 0, -456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 81 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, -454, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 82 - 0, 0, 0, 0, 0, 0, 0, 0, 130, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, -656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 83 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, -869, 448, 0, 0, 0, 449, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, -869, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 84 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 85 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, -704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -815, -815, 0, -815, -815, -815, 0, -815, 0, 0, -815, -815, 463, -815, -815, 464, -815, 0, 0, 0, 0, 0, -815, -815, -815, 0, -815, -815, -815, -815, -815, -815, -815, -815, -815, -815, -815, -815, 0, -815, 0, 0, 0, 0, -815, -815, -815, -815, -815, 0, -815, 0, 0, 0, 0, 0, 0, 0, 0, -815, 0, 0, -815, -815, 0, -815, 0, -815, -815, 0, 0, 0, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, -815, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 86 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 87 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 46, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, -345, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 88 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, -762, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 89 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 715, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 90 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 718, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 91 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 92 - -375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -375, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, -501, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 93 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 157, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 0, 0, 0, -703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 94 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 675, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 95 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 96 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, -751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 97 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 98 - 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 628, 629, 116, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 46, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, -387, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 99 - 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, -811, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 100 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 101 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 102 - -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 103 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 104 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 105 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 106 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 107 - 0, -765, 0, 0, -765, 0, 0, 0, 0, 0, 0, 0, 427, 0, -765, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -765, -765, 0, -765, 0, -765, -765, -765, -765, 0, 0, 0, 0, 0, 0, 0, 0, -765, 0, -765, -765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -765, 0, -765, -765, 0, 0, 0, -765, -765, 0, 0, 0, 0, 0, 0, 0, 0, 0, -765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 108 - 0, -246, -246, 0, -246, 0, 23, 0, -246, -246, 0, 0, -246, 0, -246, -246, 0, 0, 163, 0, -246, -246, 0, 0, 0, 0, 0, -246, -246, 0, -246, 0, -246, -246, -246, -246, 0, -246, 0, 0, 0, 0, 164, 0, -246, 0, -246, -246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -246, 0, -246, -246, 0, 0, 0, -246, -246, 0, 0, 0, 0, 0, 0, 0, 0, 0, -246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 109 - 0, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 432, 0, 433, 434, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -314, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -314, 0, 436, 437, 0, 0, 0, 438, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 110 - 0, -153, 0, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, 442, 0, -153, 0, -153, -153, -153, 443, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, -153, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, -153, -153, 0, 0, 0, -153, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 111 - 0, -167, 444, 0, -167, 0, 0, 0, 445, 0, 0, 0, -167, 0, -167, -167, 0, 0, 0, 0, 446, 447, 0, 0, 0, 0, 0, -167, -167, 0, -167, 0, -167, -167, -167, -167, 0, 448, 0, 0, 0, 0, 0, 0, -167, 0, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, -167, -167, 0, 0, 0, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 749, 457, 458, // State 112 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 113 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 114 - 0, 0, 0, 0, 0, 0, 13, 698, 14, 178, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 115 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 700, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 116 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 117 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 118 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 46, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 704, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 119 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 120 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, -819, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 121 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, -815, 412, 0, 0, 0, 413, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, -815, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 122 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, -820, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, 695, 141, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 123 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -287, -287, -287, -287, -287, -287, 23, 0, -287, -287, -287, -287, -287, -287, -287, -287, -287, 0, 24, 0, -287, -287, -287, -287, -287, 0, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, -287, -285, -287, -287, 0, 0, 0, 25, 0, -287, -287, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, -287, -287, 0, 0, 0, -287, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 124 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, -777, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, -777, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 125 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 126 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, // State 127 - 0, 0, 0, 0, 0, 0, 13, 716, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 128 - 0, 0, 0, 0, 0, 0, 0, 718, 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 129 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, -674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 130 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, -684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 131 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -699, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 132 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, -816, 0, 0, -816, 0, 0, 0, 0, 0, 0, 0, 463, 0, -816, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, -816, 0, -816, 0, -816, -816, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, 0, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, 0, -816, -816, 0, 0, 0, -816, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, -816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 133 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, -288, -288, 0, -288, 0, 23, 0, -288, -288, 0, 0, -288, 0, -288, -288, 0, 0, 195, 0, -288, -288, 0, 0, 0, 0, 0, -288, -288, 0, -288, 0, -288, -288, -288, -288, 0, 0, -288, 0, 0, 0, 0, 196, 0, -288, 0, -288, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, -288, -288, 0, 0, 0, -288, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 134 - 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 468, 0, 469, 470, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, 472, 473, 0, 0, 0, 474, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 135 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -158, 0, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 478, 0, -158, 0, -158, -158, -158, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, -158, -158, 0, 0, 0, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 136 - -378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -174, 480, 0, -174, 0, 0, 0, 481, 0, 0, 0, -174, 0, -174, -174, 0, 0, 0, 0, 482, 483, 0, 0, 0, 0, 0, -174, -174, 0, -174, 0, -174, -174, -174, -174, 0, 0, 484, 0, 0, 0, 0, 0, 0, -174, 0, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, 0, -174, -174, 0, 0, 0, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 137 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 138 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 139 - 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 782, 14, 210, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 38, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 140 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 784, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 141 - 0, 0, 0, 0, 0, 0, 0, 0, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 142 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 143 - 0, 0, 0, 0, 0, 0, 0, 744, 203, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 46, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 788, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 144 - -369, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, -369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 145 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 146 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 147 - 0, 0, 0, 0, 0, 0, 205, 0, 750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, -871, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 148 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, -867, 448, 0, 0, 0, 449, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, -867, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 149 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, -872, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 150 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 151 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, -828, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, -828, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 152 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 153 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 154 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 804, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 155 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 806, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 156 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, -721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 157 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, -731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 158 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 159 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 160 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -157, -157, 0, -157, -157, -157, 0, 0, 0, 0, -157, -157, 0, -157, -157, 0, -157, 0, 0, 0, 0, 0, -157, -157, -157, 0, -157, -157, 478, -157, -157, -157, -157, -157, -157, 479, -157, -155, 0, -157, 0, 0, 0, 0, 0, -157, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, -157, -157, 0, 0, 0, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 161 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -173, -173, 480, -173, -173, -173, 0, 0, 481, 0, -173, -173, -173, -173, -173, -173, -173, 0, 0, 0, 482, 483, -173, -173, -173, 0, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -173, -171, 484, -173, 0, 0, 0, 0, 0, -173, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -173, 0, -173, -173, 0, 0, 0, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 162 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 163 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 164 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 165 - 0, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, -315, 0, 0, 431, 0, 0, 432, 0, 433, 434, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, 0, 436, 437, 0, 0, 0, 438, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -815, -815, 0, -815, -815, -815, 0, 0, 0, 0, -815, -815, 463, -815, -815, 464, -815, 0, 0, 0, 0, 0, -815, -815, -815, 0, -815, -815, -815, -815, -815, -815, -815, -815, -815, -815, -815, -813, 0, -815, 0, 0, 0, 0, 0, -815, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -815, 0, -815, -815, 0, 0, 0, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 166 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -422, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 167 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 821, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 168 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 822, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 169 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 170 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 171 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 172 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 173 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 174 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 175 - 0, 0, 0, 0, 0, 0, 0, 783, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 839, 237, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 176 - 0, 0, 0, 0, 0, 0, 0, 786, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -413, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 177 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 178 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 179 - 0, -245, -245, 0, -245, 0, 23, 0, -245, -245, 0, 0, -245, 0, -245, -245, 0, 0, 24, 0, -245, -245, 0, 0, -247, 0, 0, -245, -245, 0, -245, 0, -245, -245, -245, -245, 0, -245, 0, 0, 0, 0, 25, 0, -245, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, -245, -245, 0, 0, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 239, 0, 845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 180 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 181 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 182 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 183 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 184 - 0, 0, 0, 0, 0, 0, 13, 797, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, // State 185 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, -671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 186 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 187 - 0, 0, 0, 0, 0, 0, 0, 0, 227, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 188 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 189 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 190 - 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 191 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 192 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 193 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 194 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 195 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 196 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 197 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, -357, 0, 0, 467, 0, 0, 468, 0, 469, 470, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, 0, 472, 473, 0, 0, 0, 474, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 198 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 199 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 200 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 201 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 202 - 0, 0, 0, 0, 0, 0, 0, -627, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 203 - 0, 0, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 204 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 205 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 206 - -424, 0, 0, 0, 0, 0, -424, 0, -424, 0, 0, 0, -424, 0, 0, -424, 0, 0, 0, -424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -424, 0, -424, -424, -424, -424, 0, 0, 0, 0, 0, -424, -424, -424, -424, 0, -424, -424, -424, -424, 248, 827, 0, 0, -424, -424, -424, -424, -424, 0, 0, -424, -424, -424, -424, 0, -424, -424, -424, -424, -424, -424, -424, -424, -424, 0, 0, 0, -424, -424, 0, 0, 0, -424, -424, -424, -424, -424, -424, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 207 - -855, 0, 0, 0, 0, 0, -855, 0, -855, 0, 0, 0, -855, 0, 0, -855, 0, 0, 0, -855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -855, 0, -855, -855, -855, -855, 0, 0, 0, 0, 0, -855, -855, -855, -855, 0, -855, -855, -855, -855, 0, 834, 252, 835, -855, -855, -855, -855, -855, 0, 0, -855, -855, -855, -855, 0, -855, -855, -855, -855, -855, -855, -855, -855, -855, 0, 0, 0, -855, -855, 0, 0, 0, -855, -855, -855, -855, -855, -855, + 0, 0, 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 208 - -859, 0, 0, 0, 0, 0, -859, 0, -859, 0, 0, 0, -859, 0, 0, -859, 0, 0, 0, -859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -859, 0, -859, -859, -859, -859, 0, 0, 0, 0, 0, -859, -859, -859, -859, 0, -859, -859, -859, -859, 0, 837, 838, 839, -859, -859, -859, -859, -859, 0, 0, -859, -859, -859, -859, 0, -859, -859, -859, -859, -859, -859, -859, -859, -859, 0, 0, 0, -859, -859, 0, 0, 0, -859, -859, -859, -859, -859, -859, + 0, 0, 0, 0, 0, 0, 0, 881, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 209 - 0, 0, 0, 0, 0, 0, 13, 0, 253, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 210 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 505, 16, 506, 0, 52, 507, 53, 54, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, 17, 60, 61, 18, 0, 508, 62, 63, 509, 64, 65, 66, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 211 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, -287, -287, 0, -287, 0, 23, 0, -287, -287, 0, 0, -287, 0, -287, -287, 0, 0, 24, 0, -287, -287, 0, 0, -289, 0, 0, -287, -287, 0, -287, 0, -287, -287, -287, -287, 0, 0, -287, 0, 0, 0, 0, 25, 0, -287, 0, -287, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, -287, -287, 0, 0, 0, -287, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 212 - 0, -152, 0, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0, -152, 442, 0, -152, 0, -152, -152, -152, 443, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, -152, -152, 0, 0, 0, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 213 - 0, -166, 444, 0, -166, 0, 0, 0, 445, 0, 0, 0, -166, 0, -166, -166, 0, 0, 0, 0, 446, 447, 0, 0, -168, 0, 0, -166, -166, 0, -166, 0, -166, -166, -166, -166, 0, 448, 0, 0, 0, 0, 0, 0, -166, 0, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, -166, -166, 0, 0, 0, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 214 - 0, -764, 0, 0, -764, 0, 0, 0, 0, 0, 0, 0, 427, 0, -764, 428, 0, 0, 0, 0, 0, 0, 0, 0, -766, 0, 0, -764, -764, 0, -764, 0, -764, -764, -764, -764, 0, 0, 0, 0, 0, 0, 0, 0, -764, 0, -764, -764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -764, 0, -764, -764, 0, 0, 0, -764, -764, 0, 0, 0, 0, 0, 0, 0, 0, 0, -764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 215 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 216 - 0, 0, 0, 0, 0, 0, 13, 849, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 894, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 217 - 0, 0, 0, 0, 0, 0, 13, 851, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, -718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 218 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 219 - 0, 0, 0, 0, 0, 0, 13, 854, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 261, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 220 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 221 - 0, 0, 0, 0, 0, 0, 0, -772, 0, 0, 0, 0, 0, 0, -772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -772, 0, 0, 0, 0, 0, -772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -772, 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 222 - 0, 0, 0, 0, 0, 0, 13, 860, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 223 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 224 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 225 - 0, 0, 0, 0, 0, 0, 0, 0, 268, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 905, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 226 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, -675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 227 - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 228 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 229 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 230 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 231 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 232 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 233 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 234 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 235 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 236 - 0, 0, 0, 0, 0, 0, 0, 0, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -674, 0, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 237 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 238 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 239 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 240 - 0, 0, 0, 0, 0, 0, 0, -578, 280, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + -471, 0, 0, 0, 0, 0, -471, 0, -471, 0, 0, 0, -471, 0, 0, -471, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -471, 0, -471, -471, -471, -471, 0, 0, 0, 0, 0, -471, -471, -471, -471, 0, -471, -471, -471, -471, 283, 927, 0, 0, -471, -471, -471, -471, -471, 0, 0, -471, -471, -471, -471, 0, -471, -471, -471, -471, -471, -471, -471, -471, -471, 0, 0, 0, -471, -471, 0, 0, 0, -471, -471, -471, -471, -471, -471, // State 241 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + -909, 0, 0, 0, 0, 0, -909, 0, -909, 0, 0, 0, -909, 0, 0, -909, 0, 0, 0, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -909, 0, -909, -909, -909, -909, 0, 0, 0, 0, 0, -909, -909, -909, -909, 0, -909, -909, -909, -909, 0, 934, 287, 935, -909, -909, -909, -909, -909, 0, 0, -909, -909, -909, -909, 0, -909, -909, -909, -909, -909, -909, -909, -909, -909, 0, 0, 0, -909, -909, 0, 0, 0, -909, -909, -909, -909, -909, -909, // State 242 - 0, 0, 0, 0, 0, 0, 0, -626, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -913, 0, 0, 0, 0, 0, -913, 0, -913, 0, 0, 0, -913, 0, 0, -913, 0, 0, 0, -913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -913, 0, -913, -913, -913, -913, 0, 0, 0, 0, 0, -913, -913, -913, -913, 0, -913, -913, -913, -913, 0, 937, 938, 939, -913, -913, -913, -913, -913, 0, 0, -913, -913, -913, -913, 0, -913, -913, -913, -913, -913, -913, -913, -913, -913, 0, 0, 0, -913, -913, 0, 0, 0, -913, -913, -913, -913, -913, -913, // State 243 - 0, 0, 0, 0, 0, 0, 0, -619, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 288, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 244 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 562, 61, 563, 0, 62, 564, 63, 64, 0, 0, 0, 0, 65, 66, 67, 68, 69, 0, 0, 17, 70, 71, 18, 0, 565, 72, 73, 566, 74, 75, 76, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 245 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 246 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, -157, 0, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, -159, 0, 0, -157, 478, 0, -157, 0, -157, -157, -157, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, -157, -157, 0, 0, 0, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 247 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, -173, 480, 0, -173, 0, 0, 0, 481, 0, 0, 0, -173, 0, -173, -173, 0, 0, 0, 0, 482, 483, 0, 0, -175, 0, 0, -173, -173, 0, -173, 0, -173, -173, -173, -173, 0, 0, 484, 0, 0, 0, 0, 0, 0, -173, 0, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -173, 0, -173, -173, 0, 0, 0, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 248 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, -815, 0, 0, -815, 0, 0, 0, 0, 0, 0, 0, 463, 0, -815, 464, 0, 0, 0, 0, 0, 0, 0, 0, -817, 0, 0, -815, -815, 0, -815, 0, -815, -815, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, -815, 0, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -815, 0, -815, -815, 0, 0, 0, -815, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, -815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 249 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 250 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 949, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 251 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 951, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 252 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 253 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 954, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 254 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 255 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -823, 0, 0, 0, 0, 0, 0, -823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -823, 0, 0, 0, 0, 0, -823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -823, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 256 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 505, 16, 506, 0, 52, 507, 53, 54, 0, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, 17, 60, 61, 18, 0, 508, 62, 63, 509, 64, 65, 66, 38, 19, 0, 0, 0, 417, 905, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 960, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 257 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 258 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 259 - 0, 0, 0, 0, 0, 0, 13, 908, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 303, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 260 - 0, 0, 0, 0, 0, 0, 0, 910, 0, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, 0, -722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 261 - 0, 0, 0, 0, 0, 0, 0, 912, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 262 - 0, 0, 0, 0, 0, 0, 13, 913, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 263 - 0, 0, 0, 0, 0, 0, 0, -770, 0, 0, 0, 0, 0, 0, -770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -770, 0, 0, 0, 0, 0, -770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -770, 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 264 - 0, 0, 0, 0, 0, 0, 0, -773, 0, 0, 0, 0, 0, 0, -773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -773, 0, 0, 0, 0, 0, -773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -773, 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 265 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 266 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 974, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 267 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, -676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 268 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, -672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 269 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 270 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 271 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 272 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 273 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 274 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 275 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -625, 316, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 276 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 277 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -673, 0, 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 278 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -666, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 279 - 0, 0, 0, 0, 0, 0, 0, -596, 0, 0, 0, 0, 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 280 - 0, 0, 0, 0, 0, 0, 0, -606, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 281 - 0, 0, 0, 0, 0, 0, 0, -621, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 282 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 283 - 0, 0, 0, 0, 0, 0, 0, -618, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 284 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 285 - 0, 0, 0, 0, 0, 0, 0, 943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 286 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 287 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 288 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 289 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 947, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 290 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 291 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 562, 61, 563, 0, 62, 564, 63, 64, 0, 0, 0, 0, 65, 66, 67, 68, 69, 0, 0, 17, 70, 71, 18, 0, 565, 72, 73, 566, 74, 75, 76, 38, 77, 0, 0, 0, 453, 1007, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 292 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 971, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 293 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 294 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 1010, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 295 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 296 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 1014, 0, 0, 0, 0, 0, 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 297 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 1015, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 298 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -821, 0, 0, 0, 0, 0, 0, -821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -821, 0, 0, 0, 0, 0, -821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -821, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 299 - 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -824, 0, 0, 0, 0, 0, 0, -824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -824, 0, 0, 0, 0, 0, -824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -824, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 300 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 301 - 0, 0, 0, 0, 0, 0, 13, 986, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 302 - 0, 0, 0, 0, 0, 0, 13, 988, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, -723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 303 - 0, 0, 0, 0, 0, 0, 0, -771, 0, 0, 0, 0, 0, 0, -771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -771, 0, 0, 0, 0, 0, -771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -771, 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, -719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 304 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, -673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 305 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 306 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 307 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 308 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 309 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 310 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 1031, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 311 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 312 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 313 - 0, 0, 0, 0, 0, 0, 0, -593, 0, 0, 0, 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 314 - 0, 0, 0, 0, 0, 0, 0, -569, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 315 - 0, 0, 0, 0, 0, 0, 0, -579, 343, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -643, 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 316 - 0, 0, 0, 0, 0, 0, 0, -620, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -653, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 317 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -668, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 318 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 319 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -665, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 320 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 321 - 0, 0, 0, 0, 0, 0, 0, -461, 0, 0, 0, 0, 427, 0, -461, 428, 0, 0, 0, 0, 0, 0, 0, 0, -461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -461, 0, 0, 0, -461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -461, 0, -461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 322 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 323 - 0, 0, 0, 0, 0, 0, 324, 1013, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 324 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 325 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1050, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 326 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 1017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 327 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1026, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1029, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 328 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1074, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 329 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 330 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 331 - 0, 0, 0, 0, 0, 0, 13, 1039, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 332 - 0, 0, 0, 0, 0, 0, 13, 1040, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 333 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 334 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 335 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 336 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 337 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 1089, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 338 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 1091, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 339 - 0, 0, 0, 0, 0, 0, 0, -575, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -822, 0, 0, 0, 0, 0, 0, -822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -822, 0, 0, 0, 0, 0, -822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -822, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 340 - 0, 0, 0, 0, 0, 0, 0, -566, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, -720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 341 - 0, 0, 0, 0, 0, 0, 0, -580, 367, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 342 - 0, 0, 0, 0, 0, 0, 0, -597, 0, 0, 0, 0, 0, 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 343 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 344 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 345 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 346 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 347 - 0, 0, 0, 0, 0, 0, 324, 1066, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 348 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 349 - 0, 0, 0, 0, 0, 0, 324, 1070, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -640, 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 350 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -616, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 351 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -626, 379, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 352 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, -735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -667, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 353 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 354 - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 355 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 356 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, -736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 357 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, -508, 0, 0, 0, 0, 463, 0, -508, 464, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, 0, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 358 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 1082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 359 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 428, 0, 0, 0, 0, 0, 0, 0, 0, -464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 1116, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 360 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 361 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 0, 0, // State 362 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 363 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1129, 1130, 1131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1132, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 364 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1133, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 365 - 0, 0, 0, 0, 0, 0, 0, -572, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 366 - 0, 0, 0, 0, 0, 0, 0, -598, 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 367 - 0, 0, 0, 0, 0, 0, 0, -594, 0, 0, 0, 0, 0, 0, 379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 1142, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 368 - 0, 0, 0, 0, 0, 0, 0, -570, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 1143, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 369 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 370 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 371 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1026, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1114, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 372 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 373 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 374 - 688, 0, 0, 0, 0, 0, 13, 0, 14, 0, 0, 0, 411, 0, 0, 412, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 416, 15, 0, 0, 0, 0, 0, 51, 0, 16, 506, 0, 0, 507, 0, 54, 0, 0, 0, 0, 0, 56, 57, 0, 59, 0, 0, 17, 0, 61, 18, 0, 508, 62, 63, 0, 64, 0, 0, 38, 19, 0, 0, 0, 417, 0, 0, 0, 0, 418, 419, 420, 510, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 375 - 0, 0, 0, 0, 0, 0, 0, -595, 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -622, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 376 - 0, 0, 0, 0, 0, 0, 0, -571, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -613, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 377 - 0, 0, 0, 0, 0, 0, 0, -576, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -627, 403, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 378 - 0, 0, 0, 0, 0, 0, 0, -567, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, -644, 0, 0, 0, 0, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 379 - 0, 0, 0, 0, 0, 0, 324, 0, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 380 - 0, 0, 0, 0, 0, 0, 0, 1130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 381 - 0, 0, 0, 0, 0, 0, 324, 1133, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 382 - 0, 0, 0, 0, 0, 0, 0, 1134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 0, 0, // State 383 - 0, 0, 0, 0, 0, 0, 324, 1136, 325, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 969, 970, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 418, 419, 420, 0, 421, 422, + 0, 0, 0, 0, 0, 0, 360, 1169, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 384 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 385 - 0, 0, 0, 0, 0, 0, 0, -577, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 360, 1173, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 386 - 0, 0, 0, 0, 0, 0, 0, -568, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 387 - 0, 0, 0, 0, 0, 0, 0, -573, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 388 - 0, 0, 0, 0, 0, 0, 0, -574, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, -782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 389 - 0, 0, 0, 0, 0, 0, 0, 1154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 390 - 0, 0, 0, 0, 0, 0, 0, 1155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 391 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 392 - -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, 0, -181, 0, -181, -181, -181, -181, -181, 0, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, -181, 0, 0, 0, -181, -181, -181, -181, -181, -181, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, -181, -181, 0, -181, 0, -181, -181, 0, 0, 0, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, -783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 393 - -910, -910, 0, -910, 21, -910, 0, -910, 0, 0, -910, -910, 0, -910, -910, 0, -910, 0, 0, 0, 0, 0, -910, -910, -910, 0, -910, -910, 0, -910, -910, -910, -910, -910, -910, 0, -910, 0, -910, 0, 0, 0, 0, -910, -910, -910, -910, -910, 0, -910, 0, 0, 0, 0, 0, 0, 0, 0, -910, 0, 0, -910, -910, 0, -910, 0, -910, -910, 0, 0, 0, -910, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, -910, -910, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 394 - -541, 0, 0, -541, 0, -541, 0, -541, 0, 0, -541, -541, 0, -541, -541, 0, -541, 0, 0, 0, 0, 0, -541, -541, -541, 0, -541, 0, 0, -541, 0, -541, 0, 0, 0, 0, -541, 0, -541, 0, 0, 0, 0, -541, 0, -541, 0, -541, 0, -541, 0, 0, 0, 0, 0, 0, 0, 0, -541, 0, 0, -541, -541, 0, -541, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -541, -541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 1185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 395 - -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, 0, -237, 0, -237, -237, -237, -237, -237, 0, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, 0, 0, 0, -237, -237, -237, -237, -237, -237, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, 0, -237, -237, 0, -237, 0, -237, -237, 0, 0, 0, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, -511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 396 - -740, -740, -740, -740, -740, -740, 0, -740, -740, 26, -740, -740, -740, -740, -740, -740, -740, 0, 0, 0, -740, -740, -740, -740, -740, 0, -740, -740, -740, -740, -740, -740, -740, -740, -740, -740, -740, -740, -740, 0, 0, 0, 0, -740, -740, -740, -740, -740, 0, -740, 0, 0, 0, 0, 0, 0, 0, 0, -740, 0, 0, -740, -740, 0, -740, 0, -740, -740, 0, 0, 0, -740, -740, 0, 0, 0, 0, 0, 0, 0, 0, 0, -740, -740, -740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 397 - -503, 0, 0, -503, 0, -503, 0, -503, 0, 0, -503, -503, 0, -503, -503, 0, -503, 0, 0, 0, 0, 0, -503, -503, -503, 0, -503, 0, 0, -503, 0, -503, 0, 0, 0, 0, -503, 0, -503, 0, 0, 0, 0, -503, 0, -503, -503, -503, 0, -503, 0, 0, 0, 0, 0, 0, 0, 0, -503, 0, 0, -503, -503, 0, -503, 0, 0, 0, 0, 0, 0, 0, -503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -503, -503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 398 - -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, 0, -182, 0, -182, -182, -182, -182, -182, 0, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, -182, 0, 0, 0, -182, -182, -182, -182, -182, -182, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, -182, -182, 0, -182, 0, -182, -182, 0, 0, 0, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -699, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 399 - -828, -828, -828, -828, -828, -828, 0, -828, -828, 0, -828, -828, -828, -828, -828, -828, -828, 0, 0, 0, -828, -828, -828, -828, -828, 0, -828, -828, -828, -828, -828, -828, -828, -828, -828, -828, -828, -828, -828, 0, 0, 0, 0, -828, -828, -828, -828, -828, 0, -828, 0, 0, 0, 0, 0, 0, 0, 0, -828, 0, 0, -828, -828, 0, -828, 0, -828, -828, 0, 0, 0, -828, -828, 0, 0, 0, 0, 0, 0, 0, 0, 0, -828, -828, -828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 400 - -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, 0, -183, 0, -183, -183, -183, -183, -183, 0, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, 0, 0, 0, -183, -183, -183, -183, -183, -183, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, -183, -183, 0, -183, 0, -183, -183, 0, 0, 0, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 401 - -833, 0, 0, -833, 0, -833, 0, -833, 0, 0, -833, -833, 0, -833, -833, 0, -833, 0, 0, 0, 0, 0, -833, -833, -833, 0, -833, 0, 0, -833, 0, -833, 0, 0, 0, 0, -833, 0, -833, 0, 0, 0, 0, -833, 0, -833, 0, -833, 0, -833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -833, -833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -833, -833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -619, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 402 - -157, 0, 0, -157, 0, -157, 0, -157, 0, 0, -157, -157, 0, -157, -157, 0, -157, 0, 0, 0, 0, 0, -157, -157, -157, 0, -157, 0, 0, -157, 0, -157, 0, 0, 0, 0, -157, 0, -157, 0, 0, 0, 0, -157, 0, -157, 441, -157, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, -157, -157, 0, -157, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -645, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 403 - -419, 0, 0, -419, 0, -419, 0, -419, 0, 0, -419, -419, 0, -419, 30, 0, -419, 0, 0, 0, 0, 0, -419, -419, -419, 0, -419, 0, 0, -419, 0, -419, 0, 0, 0, 0, -419, 0, -419, 0, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -641, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 404 - -832, 0, 0, -832, 0, -832, 0, -832, 0, 0, -832, -832, 0, -832, -832, 0, -832, 0, 0, 0, 0, 0, -832, -832, -832, 0, -832, 0, 0, -832, 0, -832, 0, 0, 0, 0, -832, 0, -832, 0, 0, 0, 0, -832, 0, -832, 0, -832, 0, -832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -832, -832, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -832, -832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -617, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 405 - -380, -380, -380, -380, -380, -380, 0, -380, -380, 0, -380, -380, -380, -380, -380, -380, -380, 0, 0, 0, -380, -380, -380, -380, -380, 0, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, -380, 0, 0, 0, 0, -380, -380, -380, -380, -380, 0, -380, 0, 0, 0, 0, 0, 0, 0, 0, -380, 0, 0, -380, -380, 0, -380, 0, -380, -380, 0, 0, 0, -380, -380, 0, 0, 0, 0, 0, 0, 0, 0, 0, -380, -380, -380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 406 - -845, 0, 0, -845, 0, -845, 0, -845, 0, 0, -845, -845, 0, -845, -845, 0, -845, 0, 0, 0, 0, 0, -845, -845, -845, 0, -845, 0, 0, -845, 0, -845, 0, 0, 0, 0, -845, 0, -845, 0, 0, 0, 0, 0, 0, -845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 407 - -844, 0, 0, -844, 0, -844, 0, -844, 0, 0, -844, -844, 0, -844, -844, 0, -844, 0, 0, 0, 0, 0, -844, -844, -844, 0, -844, 0, 0, -844, 0, -844, 0, 0, 0, 0, -844, 0, -844, 0, 0, 0, 0, 0, 0, -844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1129, 1130, 1131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1217, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 408 - -532, 0, 0, -532, 0, -532, 0, -532, 0, 0, -532, -532, 0, -532, -532, 0, -532, 0, 0, 0, 0, 0, -532, -532, -532, 0, -532, 0, 0, -532, 0, -532, 0, 0, 0, 0, -532, 0, -532, 0, 0, 0, 0, 0, 0, -532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 409 - -365, -365, 0, -365, 0, -365, 0, -365, 0, 0, -365, -365, 0, -365, -365, 0, -365, 0, 0, 0, 0, 0, -365, -365, -365, 0, -365, -365, 0, -365, -365, -365, -365, -365, -365, 0, -365, 0, -365, 0, 0, 0, 0, -365, 34, -365, -365, -365, 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, 0, -365, -365, 0, -365, 0, -365, -365, 0, 0, 0, -365, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, -365, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 410 - 0, 0, 0, 0, 0, 0, -882, 0, 0, 0, 0, 0, -882, 0, 0, -882, 0, 0, 0, -882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -882, -882, -882, -882, 0, 0, 0, 0, 0, 0, 0, -882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -882, 0, 0, 0, -882, 0, 0, 0, 0, -882, -882, -882, 0, -882, -882, + 772, 0, 0, 0, 0, 0, 57, 0, 14, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 560, 561, 59, 0, 0, 0, 0, 0, 60, 0, 61, 563, 0, 0, 564, 0, 64, 0, 0, 0, 0, 0, 66, 67, 0, 69, 0, 0, 17, 0, 71, 18, 0, 565, 72, 73, 0, 74, 0, 0, 38, 77, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 567, 457, 458, // State 411 - 0, 0, 0, 0, 0, 0, -883, 0, 0, 0, 0, 0, -883, 0, 0, -883, 0, 0, 0, -883, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -883, -883, -883, -883, 0, 0, 0, 0, 0, 0, 0, -883, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -883, 0, 0, 0, -883, 0, 0, 0, 0, -883, -883, -883, 0, -883, -883, + 0, 0, 0, 0, 0, 0, 0, -642, 0, 0, 0, 0, 0, 0, 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 412 - -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, 0, -209, 0, -209, -209, -209, -209, -209, 0, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, -209, 0, 0, 0, -209, -209, -209, -209, -209, -209, 0, -209, 0, 0, 0, 0, 0, 0, 0, 0, -209, 0, 0, -209, -209, 0, -209, 0, -209, -209, 0, 0, 0, -209, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, -209, -209, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -618, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 413 - -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, 0, -207, 0, -207, -207, -207, -207, -207, 0, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, -207, 0, 0, 0, -207, -207, -207, -207, -207, -207, 0, -207, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, 0, -207, -207, 0, -207, 0, -207, -207, 0, 0, 0, -207, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, -207, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -623, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 414 - -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, 0, -208, 0, -208, -208, -208, -208, -208, 0, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, 0, 0, 0, -208, -208, -208, -208, -208, -208, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, -208, -208, 0, -208, 0, -208, -208, 0, 0, 0, -208, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, -208, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -614, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 415 - -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, 0, -206, 0, -206, -206, -206, -206, -206, 0, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, -206, 0, 0, 0, -206, -206, -206, -206, -206, -206, 0, -206, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 0, -206, -206, 0, -206, 0, -206, -206, 0, 0, 0, -206, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, -206, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 0, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 416 - 0, 0, 0, 0, 0, 0, -884, 0, 0, 0, 0, 0, -884, 0, 0, -884, 0, 0, 0, -884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -884, -884, -884, -884, 0, 0, 0, 0, 0, 0, 0, -884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -884, 0, 0, 0, -884, 0, 0, 0, 0, -884, -884, -884, 0, -884, -884, + 0, 0, 0, 0, 0, 0, 0, 1233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 417 - -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, 0, -332, 0, -332, -332, -332, -332, -332, 0, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, -332, 0, 0, 0, -332, -332, -332, -332, -332, -332, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, -332, 0, 0, -332, -332, 0, -332, 0, -332, -332, 0, 0, 0, -332, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, -332, -332, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 1236, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 418 - -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, 0, -331, 0, -331, -331, -331, -331, -331, 0, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, -331, 0, 0, 0, -331, -331, -331, -331, -331, -331, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, -331, 0, 0, -331, -331, 0, -331, 0, -331, -331, 0, 0, 0, -331, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, -331, -331, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 419 - -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, 0, -330, 0, -330, -330, -330, -330, -330, 0, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, -330, 0, 0, 0, -330, -330, -330, -330, -330, -330, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, -330, 0, 0, -330, -330, 0, -330, 0, -330, -330, 0, 0, 0, -330, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, -330, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 360, 1239, 361, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1071, 1072, 1073, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 420 - -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, 0, -422, 0, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, -422, 0, 0, 0, -422, -422, -422, -422, -422, -422, 0, -422, 0, 0, 0, 0, 0, 0, 0, 0, -422, 0, 0, -422, -422, 0, -422, -422, -422, -422, 0, 0, 0, -422, -422, 0, 0, 0, 0, 0, 0, 0, 0, 0, -422, -422, -422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 421 - -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, 0, -136, 0, -136, -136, -136, -136, -136, 0, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, -136, 0, 0, 0, -136, -136, -136, -136, -136, -136, 0, -136, 0, 0, 0, 0, 0, 0, 0, 0, -136, 0, 0, -136, -136, 0, -136, 0, -136, -136, 0, 0, 0, -136, -136, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136, -136, -136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136, + 0, 0, 0, 0, 0, 0, 0, -624, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 422 - -540, 0, 0, -540, 0, -540, 0, -540, 0, 0, -540, -540, 0, -540, -540, 0, -540, 0, 0, 0, 0, 0, -540, -540, -540, 0, -540, 0, 0, -540, 0, -540, 0, 0, 0, 0, -540, 0, -540, 0, 0, 0, 0, -540, 0, -540, 0, -540, 0, -540, 0, 0, 0, 0, 0, 0, 0, 0, -540, 0, 0, -540, -540, 0, -540, 0, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -540, -540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -615, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 423 - -156, 0, 0, -156, 0, -156, 0, -156, 0, 0, -156, -156, 0, -156, -156, 0, -156, 0, 0, 0, 0, 0, -156, -156, -156, 0, -156, 0, 0, -156, 0, -156, 0, 0, 0, 0, -156, 0, -156, 0, 0, 0, 0, -156, 0, -156, 512, -156, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, -156, -156, 0, -156, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -620, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 424 - -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, 0, -137, 0, -137, -137, -137, -137, -137, 0, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, -137, 0, 0, 0, -137, -137, -137, -137, -137, -137, 0, -137, 0, 0, 0, 0, 0, 0, 0, 0, -137, 0, 0, -137, -137, 0, -137, 0, -137, -137, 0, 0, 0, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, + 0, 0, 0, 0, 0, 0, 0, -621, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 425 - 0, 0, 0, 0, 0, 0, -108, 0, 0, 0, 0, 0, -108, 0, 0, -108, 0, 0, 0, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, -108, -108, -108, 0, 0, 0, 0, 0, 0, 0, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, 0, 0, 0, -108, 0, 0, 0, 0, -108, -108, -108, 0, -108, -108, + 0, 0, 0, 0, 0, 0, 0, 1257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 426 - 0, 0, 0, 0, 0, 0, -149, 0, 0, 0, 0, 0, -149, 0, 0, -149, 0, 0, 0, -149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149, -149, -149, -149, 0, 0, 0, 0, 0, 0, 0, -149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149, 0, 0, 0, -149, 0, 0, 0, 0, -149, -149, -149, 0, -149, -149, + 0, 0, 0, 0, 0, 0, 0, 1258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 427 - 0, 0, 0, 0, 0, 0, -150, 0, 0, 0, 0, 0, -150, 0, 0, -150, 0, 0, 0, -150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -150, -150, -150, -150, 0, 0, 0, 0, 0, 0, 0, -150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -150, 0, 0, 0, -150, 0, 0, 0, 0, -150, -150, -150, 0, -150, -150, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 428 - -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, 0, -238, 0, -238, -238, -238, -238, -238, 0, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, 0, 0, 0, -238, -238, -238, -238, -238, -238, 0, -238, 0, 0, 0, 0, 0, 0, 0, 0, -238, 0, 0, -238, -238, 0, -238, 0, -238, -238, 0, 0, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, 0, -217, 0, -217, -217, -217, -217, -217, 0, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, 0, 0, 0, -217, -217, -217, -217, -217, -217, 0, -217, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0, 0, -217, -217, 0, -217, 0, -217, -217, 0, 0, 0, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, // State 429 - 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, -304, 0, 0, -304, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, -304, -304, -304, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, -304, 0, 0, 0, 0, -304, -304, -304, 0, -304, -304, + -966, -966, 0, -966, 21, -966, 0, -966, 0, 0, -966, -966, 0, -966, -966, 0, -966, 0, 0, 0, 0, 0, -966, -966, -966, 0, -966, -966, 0, -966, -966, -966, -966, -966, -966, 0, -966, -966, 0, -966, 0, 0, 0, 0, -966, -966, -966, -966, -966, 0, -966, 0, 0, 0, 0, 0, 0, 0, 0, -966, 0, 0, -966, -966, 0, -966, 0, -966, -966, 0, 0, 0, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 430 - 0, 0, 0, 0, 0, 0, -305, 0, 0, 0, 0, 0, -305, 0, 0, -305, 0, 0, 0, -305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305, -305, -305, -305, 0, 0, 0, 0, 0, 0, 0, -305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305, 0, 0, 0, -305, 0, 0, 0, 0, -305, -305, -305, 0, -305, -305, + -588, 0, 0, -588, 0, -588, 0, -588, 0, 0, -588, -588, 0, -588, -588, 0, -588, 0, 0, 0, 0, 0, -588, -588, -588, 0, -588, 0, 0, -588, 0, -588, 0, 0, 0, 0, -588, 0, 0, -588, 0, 0, 0, 0, -588, 0, -588, 0, -588, 0, -588, 0, 0, 0, 0, 0, 0, 0, 0, -588, 0, 0, -588, -588, 0, -588, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -588, -588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 431 - 0, 0, 0, 0, 0, 0, -306, 0, 0, 0, 0, 0, -306, 0, 0, -306, 0, 0, 0, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -306, -306, -306, -306, 0, 0, 0, 0, 0, 0, 0, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -306, 0, 0, 0, -306, 0, 0, 0, 0, -306, -306, -306, 0, -306, -306, + -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, 0, -277, 0, -277, -277, -277, -277, -277, 0, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, 0, 0, 0, -277, -277, -277, -277, -277, -277, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, 0, -277, -277, 0, -277, 0, -277, -277, 0, 0, 0, -277, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, -277, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 432 - 0, 0, 0, 0, 0, 0, -303, 0, 0, 0, 0, 0, -303, 0, 0, -303, 0, 0, 0, -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -303, -303, -303, -303, 0, 0, 0, 0, 0, 0, 0, -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -303, 0, 0, 0, -303, 0, 0, 0, 0, -303, -303, -303, 0, -303, -303, + -789, -789, -789, -789, -789, -789, 0, -789, -789, 26, -789, -789, -789, -789, -789, -789, -789, 0, 0, 0, -789, -789, -789, -789, -789, 0, -789, -789, -789, -789, -789, -789, -789, -789, -789, -789, -789, -789, -789, -789, 0, 0, 0, 0, -789, -789, -789, -789, -789, 0, -789, 0, 0, 0, 0, 0, 0, 0, 0, -789, 0, 0, -789, -789, 0, -789, 0, -789, -789, 0, 0, 0, -789, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, -789, -789, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 433 - 0, 0, 0, 0, 0, 0, -307, 0, 0, 0, 0, 0, -307, 0, 0, -307, 0, 0, 0, -307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -307, -307, -307, -307, 0, 0, 0, 0, 0, 0, 0, -307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -307, 0, 0, 0, -307, 0, 0, 0, 0, -307, -307, -307, 0, -307, -307, + -550, 0, 0, -550, 0, -550, 0, -550, 0, 0, -550, -550, 0, -550, -550, 0, -550, 0, 0, 0, 0, 0, -550, -550, -550, 0, -550, 0, 0, -550, 0, -550, 0, 0, 0, 0, -550, 0, 0, -550, 0, 0, 0, 0, -550, 0, -550, -550, -550, 0, -550, 0, 0, 0, 0, 0, 0, 0, 0, -550, 0, 0, -550, -550, 0, -550, 0, 0, 0, 0, 0, 0, 0, -550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -550, -550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 434 - 0, 0, 0, 0, 0, 0, -308, 0, 0, 0, 0, 0, -308, 0, 0, -308, 0, 0, 0, -308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -308, -308, -308, -308, 0, 0, 0, 0, 0, 0, 0, -308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -308, 0, 0, 0, -308, 0, 0, 0, 0, -308, -308, -308, 0, -308, -308, + -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, 0, -218, 0, -218, -218, -218, -218, -218, 0, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, 0, 0, 0, -218, -218, -218, -218, -218, -218, 0, -218, 0, 0, 0, 0, 0, 0, 0, 0, -218, 0, 0, -218, -218, 0, -218, 0, -218, -218, 0, 0, 0, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 435 - 0, 0, 0, 0, 0, 0, -309, 0, 0, 0, 0, 0, -309, 0, 0, -309, 0, 0, 0, -309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -309, -309, -309, -309, 0, 0, 0, 0, 0, 0, 0, -309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -309, 0, 0, 0, -309, 0, 0, 0, 0, -309, -309, -309, 0, -309, -309, + -882, -882, -882, -882, -882, -882, 0, -882, -882, 0, -882, -882, -882, -882, -882, -882, -882, 0, 0, 0, -882, -882, -882, -882, -882, 0, -882, -882, -882, -882, -882, -882, -882, -882, -882, -882, -882, -882, -882, -882, 0, 0, 0, 0, -882, -882, -882, -882, -882, 0, -882, 0, 0, 0, 0, 0, 0, 0, 0, -882, 0, 0, -882, -882, 0, -882, 0, -882, -882, 0, 0, 0, -882, -882, 0, 0, 0, 0, 0, 0, 0, 0, 0, -882, -882, -882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 436 - 0, 0, 0, 0, 0, 0, -311, 0, 0, 0, 0, 0, -311, 0, 0, -311, 0, 0, 0, -311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -311, -311, -311, -311, 0, 0, 0, 0, 0, 0, 0, -311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, -311, 0, 0, 0, -311, 0, 0, 0, 0, -311, -311, -311, 0, -311, -311, + -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, 0, -219, 0, -219, -219, -219, -219, -219, 0, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, 0, 0, 0, -219, -219, -219, -219, -219, -219, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, -219, -219, 0, -219, 0, -219, -219, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 437 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -887, 0, 0, -887, 0, -887, 0, -887, 0, 0, -887, -887, 0, -887, -887, 0, -887, 0, 0, 0, 0, 0, -887, -887, -887, 0, -887, 0, 0, -887, 0, -887, 0, 0, 0, 0, -887, 0, 0, -887, 0, 0, 0, 0, -887, 0, -887, 0, -887, 0, -887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -887, -887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -887, -887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 438 - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -162, 0, 0, -162, 0, -162, 0, -162, 0, 0, -162, -162, 0, -162, -162, 0, -162, 0, 0, 0, 0, 0, -162, -162, -162, 0, -162, 0, 0, -162, 0, -162, 0, 0, 0, 0, -162, 0, 0, -162, 0, 0, 0, 0, -162, 0, -162, 477, -162, 0, -162, 0, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, -162, -162, 0, -162, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 439 - -85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -465, 0, 0, -465, 0, -465, 0, -465, 0, 0, -465, -465, 0, -465, 30, 0, -465, 0, 0, 0, 0, 0, -465, -465, -465, 0, -465, 0, 0, -465, 0, -465, 0, 0, 0, 0, -465, 0, 0, -465, 0, 0, 0, 0, 0, 0, -465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 440 - 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, 0, 0, -116, 0, 0, -116, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, -116, -116, -116, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, -116, 0, 0, 0, 0, -116, -116, -116, 0, -116, -116, + -886, 0, 0, -886, 0, -886, 0, -886, 0, 0, -886, -886, 0, -886, -886, 0, -886, 0, 0, 0, 0, 0, -886, -886, -886, 0, -886, 0, 0, -886, 0, -886, 0, 0, 0, 0, -886, 0, 0, -886, 0, 0, 0, 0, -886, 0, -886, 0, -886, 0, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -886, -886, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -886, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 441 - 0, 0, 0, 0, 0, 0, -768, 0, 0, 0, 0, 0, -768, 0, 0, -768, 0, 0, 0, -768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -768, -768, -768, -768, 0, 0, 0, 0, 0, 0, 0, -768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -768, 0, 0, 0, -768, 0, 0, 0, 0, -768, -768, -768, 0, -768, -768, + -426, -426, -426, -426, -426, -426, 0, -426, -426, 0, -426, -426, -426, -426, -426, -426, -426, 0, 0, 0, -426, -426, -426, -426, -426, 0, -426, -426, -426, -426, -426, -426, -426, -426, -426, -426, -426, -426, -426, -426, 0, 0, 0, 0, -426, -426, -426, -426, -426, 0, -426, 0, 0, 0, 0, 0, 0, 0, 0, -426, 0, 0, -426, -426, 0, -426, 0, -426, -426, 0, 0, 0, -426, -426, 0, 0, 0, 0, 0, 0, 0, 0, 0, -426, -426, -426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 442 - 0, 0, 0, 0, 0, 0, -769, 0, 0, 0, 0, 0, -769, 0, 0, -769, 0, 0, 0, -769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -769, -769, -769, -769, 0, 0, 0, 0, 0, 0, 0, -769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -769, 0, 0, 0, -769, 0, 0, 0, 0, -769, -769, -769, 0, -769, -769, + -899, 0, 0, -899, 0, -899, 0, -899, 0, 0, -899, -899, 0, -899, -899, 0, -899, 0, 0, 0, 0, 0, -899, -899, -899, 0, -899, 0, 0, -899, 0, -899, 0, 0, 0, 0, -899, 0, 0, -899, 0, 0, 0, 0, 0, 0, -899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 443 - 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, -494, 0, 0, -494, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -494, -494, -494, -494, 0, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, -494, 0, 0, 0, 0, -494, -494, -494, 0, -494, -494, + -898, 0, 0, -898, 0, -898, 0, -898, 0, 0, -898, -898, 0, -898, -898, 0, -898, 0, 0, 0, 0, 0, -898, -898, -898, 0, -898, 0, 0, -898, 0, -898, 0, 0, 0, 0, -898, 0, 0, -898, 0, 0, 0, 0, 0, 0, -898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 444 - 0, 0, 0, 0, 0, 0, -491, 0, 0, 0, 0, 0, -491, 0, 0, -491, 0, 0, 0, -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -491, -491, -491, -491, 0, 0, 0, 0, 0, 0, 0, -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -491, 0, 0, 0, -491, 0, 0, 0, 0, -491, -491, -491, 0, -491, -491, + -579, 0, 0, -579, 0, -579, 0, -579, 0, 0, -579, -579, 0, -579, -579, 0, -579, 0, 0, 0, 0, 0, -579, -579, -579, 0, -579, 0, 0, -579, 0, -579, 0, 0, 0, 0, -579, 0, 0, -579, 0, 0, 0, 0, 0, 0, -579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 445 - 0, 0, 0, 0, 0, 0, -492, 0, 0, 0, 0, 0, -492, 0, 0, -492, 0, 0, 0, -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -492, -492, -492, -492, 0, 0, 0, 0, 0, 0, 0, -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -492, 0, 0, 0, -492, 0, 0, 0, 0, -492, -492, -492, 0, -492, -492, + -409, -409, 0, -409, 0, -409, 0, -409, 0, 0, -409, -409, 0, -409, -409, 0, -409, 0, 0, 0, 0, 0, -409, -409, -409, 0, -409, -409, 0, -409, -409, -409, -409, -409, -409, 0, -409, 0, 0, -409, 0, 0, 0, 0, -409, 34, -409, -409, -409, 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, -409, -409, 0, -409, 0, -409, -409, 0, 0, 0, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 446 - 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, -493, 0, 0, -493, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -493, -493, -493, -493, 0, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, -493, 0, 0, 0, 0, -493, -493, -493, 0, -493, -493, + 0, 0, 0, 0, 0, 0, -936, 0, 0, 0, 0, 0, -936, 0, 0, -936, 0, 0, 0, -936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -936, -936, -936, -936, 0, 0, 0, 0, 0, 0, 0, -936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -936, 0, 0, 0, -936, 0, 0, 0, 0, -936, -936, -936, 0, -936, -936, // State 447 - 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, -495, 0, 0, -495, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, -495, -495, -495, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, -495, 0, 0, 0, 0, -495, -495, -495, 0, -495, -495, + 0, 0, 0, 0, 0, 0, -937, 0, 0, 0, 0, 0, -937, 0, 0, -937, 0, 0, 0, -937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -937, -937, -937, -937, 0, 0, 0, 0, 0, 0, 0, -937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -937, 0, 0, 0, -937, 0, 0, 0, 0, -937, -937, -937, 0, -937, -937, // State 448 - -379, -379, -379, -379, -379, -379, 0, -379, -379, 0, -379, -379, -379, -379, -379, -379, -379, 0, 0, 0, -379, -379, -379, -379, -379, 0, -379, -379, -379, -379, -379, -379, -379, -379, -379, -379, -379, -379, -379, 0, 0, 0, 0, -379, -379, -379, -379, -379, 0, -379, 0, 0, 0, 0, 0, 0, 0, 0, -379, 0, 0, -379, -379, 0, -379, 0, -379, -379, 0, 0, 0, -379, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, -379, -379, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, 0, -245, 0, -245, -245, -245, -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, 0, 0, 0, -245, -245, -245, -245, -245, -245, 0, -245, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, -245, -245, 0, -245, 0, -245, -245, 0, 0, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 449 - -183, -183, -183, 0, -183, 0, -183, -183, -183, -183, 0, 0, -183, 0, -183, -183, 0, 0, -183, 0, -183, -183, 0, 0, -183, 76, 0, -183, -183, 0, -183, 0, -183, -183, -183, -183, 0, -183, 0, 0, 0, 0, -183, -183, -183, 0, -183, -183, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, -183, 0, -183, -183, 0, 0, 0, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, 0, -243, 0, -243, -243, -243, -243, -243, 0, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, 0, 0, 0, -243, -243, -243, -243, -243, -243, 0, -243, 0, 0, 0, 0, 0, 0, 0, 0, -243, 0, 0, -243, -243, 0, -243, 0, -243, -243, 0, 0, 0, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 450 - 0, 0, 0, 0, 0, 0, 0, -499, 0, 0, 0, 0, 0, 0, -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, 0, -244, 0, -244, -244, -244, -244, -244, 0, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, 0, 0, 0, -244, -244, -244, -244, -244, -244, 0, -244, 0, 0, 0, 0, 0, 0, 0, 0, -244, 0, 0, -244, -244, 0, -244, 0, -244, -244, 0, 0, 0, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 451 - 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, 0, -242, 0, -242, -242, -242, -242, -242, 0, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, 0, 0, 0, -242, -242, -242, -242, -242, -242, 0, -242, 0, 0, 0, 0, 0, 0, 0, 0, -242, 0, 0, -242, -242, 0, -242, 0, -242, -242, 0, 0, 0, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, -242, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 452 - 0, 0, 0, 0, 0, 0, 0, -500, 0, 0, 0, 0, 0, 0, -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -938, 0, 0, 0, 0, 0, -938, 0, 0, -938, 0, 0, 0, -938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -938, -938, -938, -938, 0, 0, 0, 0, 0, 0, 0, -938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -938, 0, 0, 0, -938, 0, 0, 0, 0, -938, -938, -938, 0, -938, -938, // State 453 - 0, 0, 0, 0, 0, 0, 0, -530, 0, 0, 0, 0, 0, 0, -530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, 0, -374, 0, -374, -374, -374, -374, -374, 0, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, 0, 0, 0, -374, -374, -374, -374, -374, -374, 0, -374, 0, 0, 0, 0, 0, 0, 0, 0, -374, 0, 0, -374, -374, 0, -374, 0, -374, -374, 0, 0, 0, -374, -374, 0, 0, 0, 0, 0, 0, 0, 0, 0, -374, -374, -374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 454 - 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, 0, -373, 0, -373, -373, -373, -373, -373, 0, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, 0, 0, 0, -373, -373, -373, -373, -373, -373, 0, -373, 0, 0, 0, 0, 0, 0, 0, 0, -373, 0, 0, -373, -373, 0, -373, 0, -373, -373, 0, 0, 0, -373, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, -373, -373, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 455 - -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, 0, -197, 0, -197, -197, -197, -197, -197, 0, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, -197, 0, 0, 0, -197, -197, -197, -197, -197, -197, 0, -197, 0, 0, 0, 0, 0, 0, 0, 0, -197, 0, 0, -197, -197, 0, -197, 0, -197, -197, 0, 0, 0, -197, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, -197, -197, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, 0, -372, 0, -372, -372, -372, -372, -372, 0, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, 0, 0, 0, -372, -372, -372, -372, -372, -372, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, 0, -372, -372, 0, -372, 0, -372, -372, 0, 0, 0, -372, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, -372, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 456 - -790, 0, 0, -790, 0, -790, 0, -790, 0, 0, -790, -790, 0, -790, -790, 0, -790, 0, 0, 0, 0, 0, -790, -790, -790, 0, -790, 0, 0, -790, 0, -790, 0, 0, 0, 0, -790, 0, -790, 0, 0, 0, 0, -790, 0, -790, 0, 0, 0, -790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -790, 0, 0, 0, 0, -790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -790, -790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, 0, -469, 0, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, 0, 0, 0, -469, -469, -469, -469, -469, -469, 0, -469, 0, 0, 0, 0, 0, 0, 0, 0, -469, 0, 0, -469, -469, 0, -469, -469, -469, -469, 0, 0, 0, -469, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, -469, -469, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 457 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, 0, -139, 0, -139, -139, -139, -139, -139, 0, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, 0, 0, 0, -139, -139, -139, -139, -139, -139, 0, -139, 0, 0, 0, 0, 0, 0, 0, 0, -139, 0, 0, -139, -139, 0, -139, 0, -139, -139, 0, 0, 0, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, -139, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -139, // State 458 - -497, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -587, 0, 0, -587, 0, -587, 0, -587, 0, 0, -587, -587, 0, -587, -587, 0, -587, 0, 0, 0, 0, 0, -587, -587, -587, 0, -587, 0, 0, -587, 0, -587, 0, 0, 0, 0, -587, 0, 0, -587, 0, 0, 0, 0, -587, 0, -587, 0, -587, 0, -587, 0, 0, 0, 0, 0, 0, 0, 0, -587, 0, 0, -587, -587, 0, -587, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -587, -587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 459 - 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -161, 0, 0, -161, 0, -161, 0, -161, 0, 0, -161, -161, 0, -161, -161, 0, -161, 0, 0, 0, 0, 0, -161, -161, -161, 0, -161, 0, 0, -161, 0, -161, 0, 0, 0, 0, -161, 0, 0, -161, 0, 0, 0, 0, -161, 0, -161, 569, -161, 0, -161, 0, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, -161, -161, 0, -161, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 460 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, 0, -140, 0, -140, -140, -140, -140, -140, 0, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, -140, 0, 0, 0, -140, -140, -140, -140, -140, -140, 0, -140, 0, 0, 0, 0, 0, 0, 0, 0, -140, 0, 0, -140, -140, 0, -140, 0, -140, -140, 0, 0, 0, -140, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, -140, -140, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -140, // State 461 - 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, 0, 0, -111, 0, 0, -111, 0, 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, -111, -111, -111, 0, 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, 0, 0, 0, -111, 0, 0, 0, 0, -111, -111, -111, 0, -111, -111, // State 462 - -498, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -152, 0, 0, 0, 0, 0, -152, 0, 0, -152, 0, 0, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, -152, -152, -152, 0, 0, 0, 0, 0, 0, 0, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, 0, 0, 0, -152, 0, 0, 0, 0, -152, -152, -152, 0, -152, -152, // State 463 - -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, 0, -185, 0, -185, -185, -185, -185, -185, 0, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, 0, 0, 0, -185, -185, -185, -185, -185, -185, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, 0, -185, -185, 0, -185, 0, -185, -185, 0, 0, 0, -185, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, -185, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -153, 0, 0, 0, 0, 0, -153, 0, 0, -153, 0, 0, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, -153, -153, -153, 0, 0, 0, 0, 0, 0, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153, 0, 0, 0, -153, 0, 0, 0, 0, -153, -153, -153, 0, -153, -153, // State 464 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -885, 0, 0, 0, 0, 0, 0, 0, 0, 0, -885, 0, 0, 0, 0, 0, 0, -885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, 0, -278, 0, -278, -278, -278, -278, -278, 0, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, 0, 0, 0, -278, -278, -278, -278, -278, -278, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, -278, -278, 0, -278, 0, -278, -278, 0, 0, 0, -278, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, -278, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 465 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, -709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -346, 0, 0, 0, 0, 0, -346, 0, 0, -346, 0, 0, 0, -346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -346, -346, -346, -346, 0, 0, 0, 0, 0, 0, 0, -346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -346, 0, 0, 0, -346, 0, 0, 0, 0, -346, -346, -346, 0, -346, -346, // State 466 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, -683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -347, 0, 0, 0, 0, 0, -347, 0, 0, -347, 0, 0, 0, -347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -347, -347, -347, -347, 0, 0, 0, 0, 0, 0, 0, -347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -347, 0, 0, 0, -347, 0, 0, 0, 0, -347, -347, -347, 0, -347, -347, // State 467 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -526, 0, 0, 0, 0, 0, 0, 0, 0, 0, -526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -348, 0, 0, 0, 0, 0, -348, 0, 0, -348, 0, 0, 0, -348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -348, -348, -348, -348, 0, 0, 0, 0, 0, 0, 0, -348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -348, 0, 0, 0, -348, 0, 0, 0, 0, -348, -348, -348, 0, -348, -348, // State 468 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -345, 0, 0, 0, 0, 0, -345, 0, 0, -345, 0, 0, 0, -345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -345, -345, -345, -345, 0, 0, 0, 0, 0, 0, 0, -345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -345, 0, 0, 0, -345, 0, 0, 0, 0, -345, -345, -345, 0, -345, -345, // State 469 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -546, 0, 0, 0, 0, 0, 0, 0, 0, 0, -546, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, 0, 0, -349, 0, 0, -349, 0, 0, 0, -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -349, -349, -349, -349, 0, 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -349, 0, 0, 0, -349, 0, 0, 0, 0, -349, -349, -349, 0, -349, -349, // State 470 - -502, 0, 0, -502, 0, -502, 0, -502, 0, 0, -502, -502, 0, -502, -502, 0, -502, 0, 0, 0, 0, 0, -502, -502, -502, 0, -502, 0, 0, -502, 0, -502, 0, 0, 0, 0, -502, 0, -502, 0, 0, 0, 0, -502, 0, -502, -502, -502, 0, -502, 0, 0, 0, 0, 0, 0, 0, 0, -502, 0, 0, -502, -502, 0, -502, 0, 0, 0, 0, 0, 0, 0, -502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -502, -502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, 0, 0, -350, 0, 0, -350, 0, 0, 0, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, -350, -350, -350, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, -350, 0, 0, 0, 0, -350, -350, -350, 0, -350, -350, // State 471 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -351, 0, 0, 0, 0, 0, -351, 0, 0, -351, 0, 0, 0, -351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -351, -351, -351, -351, 0, 0, 0, 0, 0, 0, 0, -351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -351, 0, 0, 0, -351, 0, 0, 0, 0, -351, -351, -351, 0, -351, -351, // State 472 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 0, 0, -353, 0, 0, -353, 0, 0, 0, -353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -353, -353, -353, -353, 0, 0, 0, 0, 0, 0, 0, -353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, -353, 0, 0, 0, -353, 0, 0, 0, 0, -353, -353, -353, 0, -353, -353, // State 473 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 474 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 475 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 476 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, -119, 0, 0, -119, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, -119, -119, -119, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, 0, 0, 0, -119, 0, 0, 0, 0, -119, -119, -119, 0, -119, -119, // State 477 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -819, 0, 0, 0, 0, 0, -819, 0, 0, -819, 0, 0, 0, -819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -819, -819, -819, -819, 0, 0, 0, 0, 0, 0, 0, -819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -819, 0, 0, 0, -819, 0, 0, 0, 0, -819, -819, -819, 0, -819, -819, // State 478 - -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, 0, -202, 0, -202, -202, -202, -202, -202, 0, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, -202, 0, 0, 0, -202, -202, -202, -202, -202, -202, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, -202, -202, 0, -202, 0, -202, -202, 0, 0, 0, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -820, 0, 0, 0, 0, 0, -820, 0, 0, -820, 0, 0, 0, -820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -820, -820, -820, -820, 0, 0, 0, 0, 0, 0, 0, -820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -820, 0, 0, 0, -820, 0, 0, 0, 0, -820, -820, -820, 0, -820, -820, // State 479 - -787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -541, 0, 0, 0, 0, 0, -541, 0, 0, -541, 0, 0, 0, -541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -541, -541, -541, -541, 0, 0, 0, 0, 0, 0, 0, -541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -541, 0, 0, 0, -541, 0, 0, 0, 0, -541, -541, -541, 0, -541, -541, // State 480 - -324, 0, 0, 0, 0, 0, -324, 0, -324, 0, 0, 0, -324, 0, 0, -324, 0, 0, 0, -324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -324, 0, -324, -324, -324, -324, 0, 0, 0, 0, 0, -324, -324, -324, -324, 0, -324, -324, -324, -324, 0, 0, 0, 0, -324, -324, -324, -324, -324, 0, 0, -324, -324, -324, -324, 0, -324, -324, -324, -324, -324, -324, -324, -324, -324, 0, 0, 0, -324, -324, 0, 0, 0, -324, -324, -324, -324, -324, -324, + 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, 0, 0, -538, 0, 0, -538, 0, 0, 0, -538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -538, -538, -538, -538, 0, 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, -538, 0, 0, 0, 0, -538, -538, -538, 0, -538, -538, // State 481 - -744, 0, 0, 0, 0, 0, -744, 0, -744, 0, 0, 0, -744, 0, 0, -744, 0, 0, 0, -744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -744, 0, -744, -744, -744, -744, 0, 0, 0, 0, 0, -744, -744, -744, -744, 0, -744, -744, -744, -744, 0, 0, 0, 0, -744, -744, -744, -744, -744, 0, 0, -744, -744, -744, -744, 0, -744, -744, -744, -744, -744, -744, -744, -744, -744, 0, 0, 0, -744, 0, 0, 0, 0, -744, -744, -744, -744, -744, -744, + 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, 0, 0, -539, 0, 0, -539, 0, 0, 0, -539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -539, -539, -539, -539, 0, 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, -539, 0, 0, 0, 0, -539, -539, -539, 0, -539, -539, // State 482 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -339, 0, 0, 0, -339, 0, -339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -540, 0, 0, 0, 0, 0, -540, 0, 0, -540, 0, 0, 0, -540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -540, -540, -540, -540, 0, 0, 0, 0, 0, 0, 0, -540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -540, 0, 0, 0, -540, 0, 0, 0, 0, -540, -540, -540, 0, -540, -540, // State 483 - -782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -542, 0, 0, 0, 0, 0, -542, 0, 0, -542, 0, 0, 0, -542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -542, -542, -542, -542, 0, 0, 0, 0, 0, 0, 0, -542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -542, 0, 0, 0, -542, 0, 0, 0, 0, -542, -542, -542, 0, -542, -542, // State 484 - -780, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -780, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -425, -425, -425, -425, -425, -425, 0, -425, -425, 0, -425, -425, -425, -425, -425, -425, -425, 0, 0, 0, -425, -425, -425, -425, -425, 0, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, 0, 0, 0, 0, -425, -425, -425, -425, -425, 0, -425, 0, 0, 0, 0, 0, 0, 0, 0, -425, 0, 0, -425, -425, 0, -425, 0, -425, -425, 0, 0, 0, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 485 - -783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -219, -219, -219, 0, -219, 0, -219, -219, -219, -219, 0, 0, -219, 0, -219, -219, 0, 0, -219, 0, -219, -219, 0, 0, -219, 87, 0, -219, -219, 0, -219, 0, -219, -219, -219, -219, 0, 0, -219, 0, 0, 0, 0, -219, -219, -219, 0, -219, -219, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, -219, 0, -219, -219, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 486 - -320, 0, 0, 0, 0, 0, -320, 0, -320, 0, 0, 0, -320, 0, 0, -320, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -320, 0, -320, -320, -320, -320, 0, 0, 0, 0, 0, -320, -320, -320, -320, 0, -320, -320, -320, -320, 0, 0, 0, 0, -320, -320, -320, -320, -320, 0, 0, -320, -320, -320, -320, 0, -320, -320, -320, -320, -320, -320, -320, -320, -320, 0, 0, 0, -320, -320, 0, 0, 0, -320, -320, -320, -320, -320, -320, + 0, 0, 0, 0, 0, 0, 0, -546, 0, 0, 0, 0, 0, 0, -546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 487 - -323, 0, 0, 0, 0, 0, -323, 0, -323, 0, 0, 0, -323, 0, 0, -323, 0, 0, 0, -323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -323, 0, -323, -323, -323, -323, 0, 0, 0, 0, 0, -323, -323, -323, -323, 0, -323, -323, -323, -323, 0, 0, 0, 0, -323, -323, -323, -323, -323, 0, 0, -323, -323, -323, -323, 0, -323, -323, -323, -323, -323, -323, -323, -323, -323, 0, 0, 0, -323, -323, 0, 0, 0, -323, -323, -323, -323, -323, -323, + 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 488 - -785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -547, 0, 0, 0, 0, 0, 0, -547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 489 - -318, 0, 0, 0, 0, 0, -318, 0, -318, 0, 0, 0, -318, 0, 0, -318, 0, 0, 0, -318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -318, 0, -318, -318, -318, -318, 0, 0, 0, 0, 0, -318, -318, -318, -318, 0, -318, -318, -318, -318, 0, 0, 0, 0, -318, -318, -318, -318, -318, 0, 0, -318, -318, -318, -318, 0, -318, -318, -318, -318, -318, -318, -318, -318, -318, 0, 0, 0, -318, -318, 0, 0, 0, -318, -318, -318, -318, -318, -318, + 0, 0, 0, 0, 0, 0, 0, -577, 0, 0, 0, 0, 0, 0, -577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 490 - -784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 491 - -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, 0, -233, 0, -233, -233, -233, -233, -233, 0, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, 0, 0, 0, -233, -233, -233, -233, -233, -233, 0, -233, 0, 0, 0, 0, 0, 0, 0, 0, -233, 0, 0, -233, -233, 0, -233, 0, -233, -233, 0, 0, 0, -233, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, -233, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 492 - -317, 0, 0, 0, 0, 0, -317, 0, -317, 0, 0, 0, -317, 0, 0, -317, 0, 0, 0, -317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -317, 0, -317, -317, -317, -317, 0, 0, 0, 0, 0, -317, -317, -317, -317, 0, -317, -317, -317, -317, 0, 0, 0, 0, -317, -317, -317, -317, -317, 0, 0, -317, -317, -317, -317, 0, -317, -317, -317, -317, -317, -317, -317, -317, -317, 0, 0, 0, -317, -317, 0, 0, 0, -317, -317, -317, -317, -317, -317, + -842, 0, 0, -842, 0, -842, 0, -842, 0, 0, -842, -842, 0, -842, -842, 0, -842, 0, 0, 0, 0, 0, -842, -842, -842, 0, -842, 0, 0, -842, 0, -842, 0, 0, 0, 0, -842, 0, 0, -842, 0, 0, 0, 0, -842, 0, -842, 0, 0, 0, -842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -842, 0, 0, 0, 0, -842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -842, -842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 493 - -786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 494 - -781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -544, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 495 - -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 496 - 570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 497 - -844, 0, 0, -844, 0, -844, 0, 0, 0, 0, -844, -844, 0, -844, -844, 0, -844, 0, 0, 0, 0, 0, -844, -844, 96, 0, -844, 0, 0, -844, 0, -844, 0, 0, 0, 0, -844, 0, -844, 0, 0, 0, 0, 0, 0, -844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 498 - -321, 0, 0, 0, 0, 0, -321, 0, -321, 0, 0, 0, -321, 0, 0, -321, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -321, 0, -321, -321, -321, -321, 0, 0, 0, 0, 0, -321, -321, -321, -321, 0, -321, -321, -321, -321, 0, 0, 0, 0, -321, -321, -321, -321, -321, 0, 0, -321, -321, -321, -321, 0, -321, -321, -321, -321, -321, -321, -321, -321, -321, 0, 0, 0, -321, -321, 0, 0, 0, -321, -321, -321, -321, -321, -321, + -545, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 499 - -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, 0, -221, 0, -221, -221, -221, -221, -221, 0, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, 0, 0, 0, -221, -221, -221, -221, -221, -221, 0, -221, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, 0, -221, -221, 0, -221, 0, -221, -221, 0, 0, 0, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 500 - -319, 0, 0, 0, 0, 0, -319, 0, -319, 0, 0, 0, -319, 0, 0, -319, 0, 0, 0, -319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -319, 0, -319, -319, -319, -319, 0, 0, 0, 0, 0, -319, -319, -319, -319, 0, -319, -319, -319, -319, 0, 0, 0, 0, -319, -319, -319, -319, -319, 0, 0, -319, -319, -319, -319, 0, -319, -319, -319, -319, -319, -319, -319, -319, -319, 0, 0, 0, -319, -319, 0, 0, 0, -319, -319, -319, -319, -319, -319, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -939, 0, 0, 0, 0, 0, 0, 0, 0, 0, -939, 0, 0, 0, 0, 0, 0, -939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 501 - -322, 0, 0, 0, 0, 0, -322, 0, -322, 0, 0, 0, -322, 0, 0, -322, 0, 0, 0, -322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -322, 0, -322, -322, -322, -322, 0, 0, 0, 0, 0, -322, -322, -322, -322, 0, -322, -322, -322, -322, 0, 0, 0, 0, -322, -322, -322, -322, -322, 0, 0, -322, -322, -322, -322, 0, -322, -322, -322, -322, -322, -322, -322, -322, -322, 0, 0, 0, -322, -322, 0, 0, 0, -322, -322, -322, -322, -322, -322, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, -756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 502 - -387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, -730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 503 - -749, 0, 0, 0, 0, 0, -749, 0, -749, 0, 0, 0, -749, 0, 0, -749, 0, 0, 0, -749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -749, 0, -749, -749, -749, -749, 0, 0, 0, 0, 0, -749, -749, -749, -749, 0, -749, -749, -749, -749, 0, 0, 0, 0, -749, -749, -749, -749, -749, 0, 0, -749, -749, -749, -749, 0, -749, -749, -749, -749, -749, -749, -749, -749, -749, 0, 0, 0, -749, 0, 0, 0, 0, -749, -749, -749, -749, -749, -749, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -573, 0, 0, 0, 0, 0, 0, 0, 0, 0, -573, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 504 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 505 - -383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -593, 0, 0, 0, 0, 0, 0, 0, 0, 0, -593, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 506 - -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -549, 0, 0, -549, 0, -549, 0, -549, 0, 0, -549, -549, 0, -549, -549, 0, -549, 0, 0, 0, 0, 0, -549, -549, -549, 0, -549, 0, 0, -549, 0, -549, 0, 0, 0, 0, -549, 0, 0, -549, 0, 0, 0, 0, -549, 0, -549, -549, -549, 0, -549, 0, 0, 0, 0, 0, 0, 0, 0, -549, 0, 0, -549, -549, 0, -549, 0, 0, 0, 0, 0, 0, 0, -549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -549, -549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 507 - -730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 508 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 509 - -453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 510 - 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, 0, 0, -109, 0, 0, -109, 0, 0, 0, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, -109, -109, -109, 0, 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, -109, 0, 0, 0, 0, -109, -109, -109, 0, -109, -109, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 511 - 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, -117, 0, 0, -117, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, -117, -117, -117, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, -117, 0, 0, 0, 0, -117, -117, -117, 0, -117, -117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 512 - 0, 0, 0, 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 513 - 0, -183, -183, 0, -183, 0, -183, -183, -183, -183, 0, 0, -183, 0, -183, -183, 0, 0, -183, 0, -183, -183, 0, 0, 0, 76, 0, -183, -183, 0, -183, 120, -183, -183, -183, -183, 0, -183, 0, 0, 0, 0, -183, 0, -183, 0, -183, 0, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, -183, 0, -183, -183, 0, 0, 0, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 514 - -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, 0, -161, 0, -161, -161, -161, -161, -161, 0, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, -161, 0, 0, 0, -161, -161, -161, -161, -161, -161, 0, -161, 0, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, -161, -161, 0, -161, 0, -161, -161, 0, 0, 0, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, 0, -238, 0, -238, -238, -238, -238, -238, 0, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, 0, 0, 0, -238, -238, -238, -238, -238, -238, 0, -238, 0, 0, 0, 0, 0, 0, 0, 0, -238, 0, 0, -238, -238, 0, -238, 0, -238, -238, 0, 0, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 515 - -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, 0, -240, 0, -240, -240, -240, -240, -240, 0, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, 0, 0, 0, -240, -240, -240, -240, -240, -240, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, 0, -240, -240, 0, -240, 0, -240, -240, 0, 0, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -217, -217, -217, -217, -217, -217, -217, 0, -217, -217, -217, -217, -217, -217, -217, -217, -217, 0, -217, 0, -217, -217, -217, -217, -217, 0, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -217, -188, -217, -217, 0, 0, 0, -217, 0, -217, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0, -217, -217, 0, 0, 0, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, // State 516 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 517 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -966, -966, 0, -966, 102, -966, 0, 0, 0, 0, -966, -966, 0, -966, -966, 0, -966, 0, 0, 0, 0, 0, -966, -966, -966, 0, -966, -966, 0, -966, -966, -966, -966, -966, -966, 0, -966, 0, 0, -966, 0, 0, 0, 0, 0, -966, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, 0, -966, -966, 0, 0, 0, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 518 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 519 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 520 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 521 - -739, -739, -739, -739, -739, -739, 0, -739, -739, 0, -739, -739, -739, -739, -739, -739, -739, 0, 0, 0, -739, -739, -739, -739, -739, 0, -739, -739, -739, -739, -739, -739, -739, -739, -739, -739, -739, -739, -739, 0, 0, 0, 0, -739, -739, -739, -739, -739, 0, -739, 0, 0, 0, 0, 0, 0, 0, 0, -739, 0, 0, -739, -739, 0, -739, 0, -739, -739, 0, 0, 0, -739, -739, 0, 0, 0, 0, 0, 0, 0, 0, 0, -739, -739, -739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 522 - -139, -139, 0, -139, 0, -139, 0, -139, 0, 0, -139, -139, 0, -139, -139, 0, -139, 0, 0, 0, 0, 0, -139, -139, -139, 0, -139, -139, 0, -139, -139, -139, -139, -139, -139, 0, -139, 0, -139, 0, 0, 0, 0, -139, 0, -139, -139, -139, 0, -139, 0, 0, 0, 0, 0, 0, 0, 0, -139, 0, 0, -139, -139, 0, -139, 0, -139, -139, 0, 0, 0, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 523 - 0, 0, 0, 0, 0, 0, -312, 0, 0, 0, 0, 0, -312, 0, 0, -312, 0, 0, 0, -312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -312, -312, -312, -312, 0, 0, 0, 0, 0, 0, 0, -312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -312, 0, 0, 0, -312, 0, 0, 0, 0, -312, -312, -312, 0, -312, -312, + -789, -789, -789, -789, -789, -789, 0, 0, -789, 106, -789, -789, -789, -789, -789, -789, -789, 0, 0, 0, -789, -789, -789, -789, -789, 0, -789, -789, -789, -789, -789, -789, -789, -789, -789, -789, -789, 0, -789, -789, 0, 0, 0, 0, 0, -789, -789, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -789, 0, -789, -789, 0, 0, 0, -789, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, -789, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 524 - 0, 0, 0, 0, 0, 0, -310, 0, 0, 0, 0, 0, -310, 0, 0, -310, 0, 0, 0, -310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -310, -310, -310, -310, 0, 0, 0, 0, 0, 0, 0, -310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -310, 0, 0, 0, -310, 0, 0, 0, 0, -310, -310, -310, 0, -310, -310, + -366, 0, 0, 0, 0, 0, -366, 0, -366, 0, 0, 0, -366, 0, 0, -366, 0, 0, 0, -366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -366, 0, -366, -366, -366, -366, 0, 0, 0, 0, 0, -366, -366, -366, -366, 0, -366, -366, -366, -366, 0, 0, 0, 0, -366, -366, -366, -366, -366, 0, 0, -366, -366, -366, -366, 0, -366, -366, -366, -366, -366, -366, -366, -366, -366, 0, 0, 0, -366, -366, 0, 0, 0, -366, -366, -366, -366, -366, -366, // State 525 - -364, -364, 0, -364, 0, -364, 0, -364, 0, 0, -364, -364, 0, -364, -364, 0, -364, 0, 0, 0, 0, 0, -364, -364, -364, 0, -364, -364, 0, -364, -364, -364, -364, -364, -364, 0, -364, 0, -364, 0, 0, 0, 0, -364, 34, -364, -364, -364, 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, 0, -364, -364, 0, -364, 0, -364, -364, 0, 0, 0, -364, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, -364, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -793, 0, 0, 0, 0, 0, -793, 0, -793, 0, 0, 0, -793, 0, 0, -793, 0, 0, 0, -793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -793, 0, -793, -793, -793, -793, 0, 0, 0, 0, 0, -793, -793, -793, -793, 0, -793, -793, -793, -793, 0, 0, 0, 0, -793, -793, -793, -793, -793, 0, 0, -793, -793, -793, -793, 0, -793, -793, -793, -793, -793, -793, -793, -793, -793, 0, 0, 0, -793, 0, 0, 0, 0, -793, -793, -793, -793, -793, -793, // State 526 - -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -218, -218, -218, -218, -218, -218, -218, 0, -218, -218, -218, -218, -218, -218, -218, -218, -218, 0, -218, 0, -218, -218, -218, -218, -218, 0, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -218, -189, -218, -218, 0, 0, 0, -218, 0, -218, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, 0, -218, -218, 0, 0, 0, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 527 - -533, 0, 0, -533, 0, -533, 0, -533, 0, 0, -533, -533, 0, -533, -533, 0, -533, 0, 0, 0, 0, 0, -533, -533, -533, 0, -533, 0, 0, -533, 0, -533, 0, 0, 0, 0, -533, 0, -533, 0, 0, 0, 0, 0, 0, -533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -381, 0, 0, 0, -381, 0, -381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 528 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 529 - -827, -827, -827, -827, -827, -827, 0, -827, -827, 0, -827, -827, -827, -827, -827, -827, -827, 0, 0, 0, -827, -827, -827, -827, -827, 0, -827, -827, -827, -827, -827, -827, -827, -827, -827, -827, -827, -827, -827, 0, 0, 0, 0, -827, -827, -827, -827, -827, 0, -827, 0, 0, 0, 0, 0, 0, 0, 0, -827, 0, 0, -827, -827, 0, -827, 0, -827, -827, 0, 0, 0, -827, -827, 0, 0, 0, 0, 0, 0, 0, 0, 0, -827, -827, -827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 530 - -909, -909, 0, -909, 21, -909, 0, -909, 0, 0, -909, -909, 0, -909, -909, 0, -909, 0, 0, 0, 0, 0, -909, -909, -909, 0, -909, -909, 0, -909, -909, -909, -909, -909, -909, 0, -909, 0, -909, 0, 0, 0, 0, -909, -909, -909, -909, -909, 0, -909, 0, 0, 0, 0, 0, 0, 0, 0, -909, 0, 0, -909, -909, 0, -909, 0, -909, -909, 0, 0, 0, -909, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, -909, -909, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 531 - 0, 0, 0, 0, 0, 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 532 - 0, 0, 0, 0, 0, 0, 0, -774, 0, 0, 0, 0, 0, 0, -774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -774, 0, 0, 0, 0, 0, -774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, -362, 0, 0, -362, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, -362, -362, -362, -362, 0, 0, 0, 0, 0, -362, -362, -362, -362, 0, -362, -362, -362, -362, 0, 0, 0, 0, -362, -362, -362, -362, -362, 0, 0, -362, -362, -362, -362, 0, -362, -362, -362, -362, -362, -362, -362, -362, -362, 0, 0, 0, -362, -362, 0, 0, 0, -362, -362, -362, -362, -362, -362, // State 533 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -365, 0, 0, 0, 0, 0, -365, 0, -365, 0, 0, 0, -365, 0, 0, -365, 0, 0, 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, -365, -365, -365, -365, 0, 0, 0, 0, 0, -365, -365, -365, -365, 0, -365, -365, -365, -365, 0, 0, 0, 0, -365, -365, -365, -365, -365, 0, 0, -365, -365, -365, -365, 0, -365, -365, -365, -365, -365, -365, -365, -365, -365, 0, 0, 0, -365, -365, 0, 0, 0, -365, -365, -365, -365, -365, -365, // State 534 - 0, 0, 0, 0, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 535 - -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, 0, -194, 0, -194, -194, -194, -194, -194, 0, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, -194, 0, 0, 0, -194, -194, -194, -194, -194, -194, 0, -194, 0, 0, 0, 0, 0, 0, 0, 0, -194, 0, 0, -194, -194, 0, -194, 0, -194, -194, 0, 0, 0, -194, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, -194, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 536 - -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, 0, -188, 0, -188, -188, -188, -188, -188, 0, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, 0, 0, 0, -188, -188, -188, -188, -188, -188, 0, -188, 0, 0, 0, 0, 0, 0, 0, 0, -188, 0, 0, -188, -188, 0, -188, 0, -188, -188, 0, 0, 0, -188, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, -188, -188, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -219, -219, -219, -219, -219, -219, -219, 0, -219, -219, -219, -219, -219, -219, -219, -219, -219, 0, -219, 0, -219, -219, -219, -219, -219, 0, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -190, -219, -219, 0, 0, 0, -219, 0, -219, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, -219, -219, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 537 - -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, 0, -198, 0, -198, -198, -198, -198, -198, 0, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, -198, 0, 0, 0, -198, -198, -198, -198, -198, -198, 0, -198, 0, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0, -198, -198, 0, -198, 0, -198, -198, 0, 0, 0, -198, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, -198, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -360, 0, 0, 0, 0, 0, -360, 0, -360, 0, 0, 0, -360, 0, 0, -360, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -360, 0, -360, -360, -360, -360, 0, 0, 0, 0, 0, -360, -360, -360, -360, 0, -360, -360, -360, -360, 0, 0, 0, 0, -360, -360, -360, -360, -360, 0, 0, -360, -360, -360, -360, 0, -360, -360, -360, -360, -360, -360, -360, -360, -360, 0, 0, 0, -360, -360, 0, 0, 0, -360, -360, -360, -360, -360, -360, // State 538 - 0, 0, 0, 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 539 - -913, 0, 0, 0, 0, 0, 0, -913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -913, 0, 0, 0, 0, -913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -840, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -840, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 540 - -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, 0, -184, 0, -184, -184, -184, -184, -184, 0, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, -184, 0, 0, 0, -184, -184, -184, -184, -184, -184, 0, -184, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, 0, -184, -184, 0, -184, 0, -184, -184, 0, 0, 0, -184, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, -184, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -359, 0, 0, 0, 0, 0, -359, 0, -359, 0, 0, 0, -359, 0, 0, -359, 0, 0, 0, -359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -359, 0, -359, -359, -359, -359, 0, 0, 0, 0, 0, -359, -359, -359, -359, 0, -359, -359, -359, -359, 0, 0, 0, 0, -359, -359, -359, -359, -359, 0, 0, -359, -359, -359, -359, 0, -359, -359, -359, -359, -359, -359, -359, -359, -359, 0, 0, 0, -359, -359, 0, 0, 0, -359, -359, -359, -359, -359, -359, // State 541 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 542 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 543 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, -707, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 544 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -796, 0, 0, 0, 0, 0, 0, 0, 0, 0, -796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 545 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -448, 0, 0, 0, 0, 0, 0, 0, 0, 0, -448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 546 - -451, 0, 0, -451, 0, -451, 0, -451, 0, 0, -451, -451, 0, -451, -451, 0, -451, 0, 0, 0, 0, 0, -451, -451, -451, 0, -451, 0, 0, -451, 0, -451, 0, 0, 0, 0, -451, 0, -451, 0, 0, 0, 0, -451, 0, -451, 0, -451, 0, -451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -451, -451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -451, -451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 547 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 548 - -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, 0, -201, 0, -201, -201, -201, -201, -201, 0, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, -201, 0, 0, 0, -201, -201, -201, -201, -201, -201, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, -201, -201, 0, -201, 0, -201, -201, 0, 0, 0, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -898, 0, 0, -898, 0, -898, 0, 0, 0, 0, -898, -898, 0, -898, -898, 0, -898, 0, 0, 0, 0, 0, -898, -898, 115, 0, -898, 0, 0, -898, 0, -898, 0, 0, 0, 0, -898, 0, 0, -898, 0, 0, 0, 0, 0, 0, -898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 549 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -363, 0, 0, 0, 0, 0, -363, 0, -363, 0, 0, 0, -363, 0, 0, -363, 0, 0, 0, -363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -363, 0, -363, -363, -363, -363, 0, 0, 0, 0, 0, -363, -363, -363, -363, 0, -363, -363, -363, -363, 0, 0, 0, 0, -363, -363, -363, -363, -363, 0, 0, -363, -363, -363, -363, 0, -363, -363, -363, -363, -363, -363, -363, -363, -363, 0, 0, 0, -363, -363, 0, 0, 0, -363, -363, -363, -363, -363, -363, // State 550 - -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, 0, -204, 0, -204, -204, -204, -204, -204, 0, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, -204, 0, 0, 0, -204, -204, -204, -204, -204, -204, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, -204, -204, 0, -204, 0, -204, -204, 0, 0, 0, -204, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, -204, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 551 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, -343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -361, 0, 0, 0, 0, 0, -361, 0, -361, 0, 0, 0, -361, 0, 0, -361, 0, 0, 0, -361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 0, -361, -361, -361, -361, 0, 0, 0, 0, 0, -361, -361, -361, -361, 0, -361, -361, -361, -361, 0, 0, 0, 0, -361, -361, -361, -361, -361, 0, 0, -361, -361, -361, -361, 0, -361, -361, -361, -361, -361, -361, -361, -361, -361, 0, 0, 0, -361, -361, 0, 0, 0, -361, -361, -361, -361, -361, -361, // State 552 - 667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -364, 0, 0, 0, 0, 0, -364, 0, -364, 0, 0, 0, -364, 0, 0, -364, 0, 0, 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, -364, -364, -364, -364, 0, 0, 0, 0, 0, -364, -364, -364, -364, 0, -364, -364, -364, -364, 0, 0, 0, 0, -364, -364, -364, -364, -364, 0, 0, -364, -364, -364, -364, 0, -364, -364, -364, -364, -364, -364, -364, -364, -364, 0, 0, 0, -364, -364, 0, 0, 0, -364, -364, -364, -364, -364, -364, // State 553 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -340, 0, 0, 0, -340, 0, -340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 554 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -409, -409, 0, -409, 0, -409, 0, 0, 0, 0, -409, -409, 0, -409, -409, 0, -409, 0, 0, 0, 0, 0, -409, -409, -409, 0, -409, -409, 0, -409, -409, -409, -409, -409, -409, 0, -409, 0, 0, -409, 0, 0, 0, 0, 0, 116, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, -409, -409, 0, 0, 0, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 555 - -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 556 - 0, 0, 0, 0, 0, 0, -254, 0, -254, 0, 0, 0, -254, 0, 0, -254, 0, 0, 0, -254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -254, -254, -254, -254, 0, 0, 0, 0, 0, 0, 0, -254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -254, 0, 0, -254, 0, 0, 0, 0, 0, 0, 0, 0, -254, -254, 0, 0, 0, -254, 0, 0, 0, 0, -254, -254, -254, 0, -254, -254, + -798, 0, 0, 0, 0, 0, -798, 0, -798, 0, 0, 0, -798, 0, 0, -798, 0, 0, 0, -798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -798, 0, -798, -798, -798, -798, 0, 0, 0, 0, 0, -798, -798, -798, -798, 0, -798, -798, -798, -798, 0, 0, 0, 0, -798, -798, -798, -798, -798, 0, 0, -798, -798, -798, -798, 0, -798, -798, -798, -798, -798, -798, -798, -798, -798, 0, 0, 0, -798, 0, 0, 0, 0, -798, -798, -798, -798, -798, -798, // State 557 - 0, 0, 0, 0, 0, 0, -255, 0, -255, 0, 0, 0, -255, 0, 0, -255, 0, 0, 0, -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, -255, -255, -255, 0, 0, 0, 0, 0, 0, 0, -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 0, 0, -255, 0, 0, 0, 0, 0, 0, 0, 0, -255, -255, 0, 0, 0, -255, 0, 0, 0, 0, -255, -255, -255, 0, -255, -255, + -245, -245, -245, -245, -245, -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, -245, -245, 0, -245, 0, -245, -245, -245, -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, -216, -245, -245, 0, 0, 0, -245, 0, -245, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, -245, -245, 0, 0, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 558 - 0, 0, 0, 0, 0, 0, -260, 0, -260, 0, 0, 0, -260, 0, 0, -260, 0, 0, 0, -260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -260, -260, -260, -260, 0, 0, 0, 0, 0, 0, 0, -260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -260, 0, 0, -260, 0, 0, 0, 0, 0, 0, 0, 0, -260, -260, 0, 0, 0, -260, 0, 0, 0, 0, -260, -260, -260, 0, -260, -260, + -243, -243, -243, -243, -243, -243, -243, 0, -243, -243, -243, -243, -243, -243, -243, -243, -243, 0, -243, 0, -243, -243, -243, -243, -243, 0, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -243, -214, -243, -243, 0, 0, 0, -243, 0, -243, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, 0, -243, -243, 0, 0, 0, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 559 - 0, 0, 0, 0, 0, 0, -251, 0, -251, 0, 0, 0, -251, 0, 0, -251, 0, 0, 0, -251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -251, -251, -251, -251, 0, 0, 0, 0, 0, 0, 0, -251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -251, 0, 0, -251, 0, 0, 0, 0, 0, 0, 0, 0, -251, -251, 0, 0, 0, -251, 0, 0, 0, 0, -251, -251, -251, 0, -251, -251, + -244, -244, -244, -244, -244, -244, -244, 0, -244, -244, -244, -244, -244, -244, -244, -244, -244, 0, -244, 0, -244, -244, -244, -244, -244, 0, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -244, -215, -244, -244, 0, 0, 0, -244, 0, -244, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, 0, -244, -244, 0, 0, 0, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 560 - 0, 0, 0, 0, 0, 0, -249, 0, -249, 0, 0, 0, -249, 0, 0, -249, 0, 0, 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -249, -249, -249, -249, 0, 0, 0, 0, 0, 0, 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -249, 0, 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, -249, -249, 0, 0, 0, -249, 0, 0, 0, 0, -249, -249, -249, 0, -249, -249, + -242, -242, -242, -242, -242, -242, -242, 0, -242, -242, -242, -242, -242, -242, -242, -242, -242, 0, -242, 0, -242, -242, -242, -242, -242, 0, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, -213, -242, -242, 0, 0, 0, -242, 0, -242, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -242, 0, -242, -242, 0, 0, 0, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 561 - 0, 0, 0, 0, 0, 0, -250, 0, -250, 0, 0, 0, -250, 0, 0, -250, 0, 0, 0, -250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -250, -250, -250, -250, 0, 0, 0, 0, 0, 0, 0, -250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -250, 0, 0, -250, 0, 0, 0, 0, 0, 0, 0, 0, -250, -250, 0, 0, 0, -250, 0, 0, 0, 0, -250, -250, -250, 0, -250, -250, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 562 - 0, 0, 0, 0, 0, 0, -261, 0, -261, 0, 0, 0, -261, 0, 0, -261, 0, 0, 0, -261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -261, -261, -261, -261, 0, 0, 0, 0, 0, 0, 0, -261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -261, 0, 0, -261, 0, 0, 0, 0, 0, 0, 0, 0, -261, -261, 0, 0, 0, -261, 0, 0, 0, 0, -261, -261, -261, 0, -261, -261, + -429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 563 - 0, 0, 0, 0, 0, 0, -253, 0, -253, 0, 0, 0, -253, 0, 0, -253, 0, 0, 0, -253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -253, -253, -253, -253, 0, 0, 0, 0, 0, 0, 0, -253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -253, 0, 0, -253, 0, 0, 0, 0, 0, 0, 0, 0, -253, -253, 0, 0, 0, -253, 0, 0, 0, 0, -253, -253, -253, 0, -253, -253, + -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 564 - 0, 0, 0, 0, 0, 0, -258, 0, -258, 0, 0, 0, -258, 0, 0, -258, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258, -258, -258, -258, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, 0, -258, -258, 0, 0, 0, -258, 0, 0, 0, 0, -258, -258, -258, 0, -258, -258, + -777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 565 - 0, 0, 0, 0, 0, 0, -259, 0, -259, 0, 0, 0, -259, 0, 0, -259, 0, 0, 0, -259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -259, -259, -259, -259, 0, 0, 0, 0, 0, 0, 0, -259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -259, 0, 0, -259, 0, 0, 0, 0, 0, 0, 0, 0, -259, -259, 0, 0, 0, -259, 0, 0, 0, 0, -259, -259, -259, 0, -259, -259, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 566 - 0, 0, 0, 0, 0, 0, -252, 0, -252, 0, 0, 0, -252, 0, 0, -252, 0, 0, 0, -252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -252, -252, -252, -252, 0, 0, 0, 0, 0, 0, 0, -252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -252, 0, 0, -252, 0, 0, 0, 0, 0, 0, 0, 0, -252, -252, 0, 0, 0, -252, 0, 0, 0, 0, -252, -252, -252, 0, -252, -252, + -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 567 - 0, 0, 0, 0, 0, 0, -257, 0, -257, 0, 0, 0, -257, 0, 0, -257, 0, 0, 0, -257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -257, -257, -257, -257, 0, 0, 0, 0, 0, 0, 0, -257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -257, 0, 0, -257, 0, 0, 0, 0, 0, 0, 0, 0, -257, -257, 0, 0, 0, -257, 0, 0, 0, 0, -257, -257, -257, 0, -257, -257, + 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, 0, -112, 0, 0, -112, 0, 0, 0, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, -112, -112, -112, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, -112, 0, 0, 0, 0, -112, -112, -112, 0, -112, -112, // State 568 - 0, 0, 0, 0, 0, 0, -256, 0, -256, 0, 0, 0, -256, 0, 0, -256, 0, 0, 0, -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256, -256, -256, -256, 0, 0, 0, 0, 0, 0, 0, -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256, 0, 0, -256, 0, 0, 0, 0, 0, 0, 0, 0, -256, -256, 0, 0, 0, -256, 0, 0, 0, 0, -256, -256, -256, 0, -256, -256, + 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, 0, 0, -120, 0, 0, -120, 0, 0, 0, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120, -120, -120, -120, 0, 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120, 0, 0, 0, -120, 0, 0, 0, 0, -120, -120, -120, 0, -120, -120, // State 569 - -747, 0, 0, 0, 0, 0, -747, 0, -747, 0, 0, 0, -747, 0, 0, -747, 0, 0, 0, -747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -747, 0, -747, -747, -747, -747, 0, 0, 0, 0, 0, -747, -747, -747, -747, 0, -747, -747, -747, -747, 0, 0, 0, 0, -747, -747, -747, -747, -747, 0, 0, -747, -747, -747, -747, 0, -747, -747, -747, -747, -747, -747, -747, -747, -747, 0, 0, 0, -747, 0, 0, 0, 0, -747, -747, -747, -747, -747, -747, + 0, 0, 0, 0, 0, 0, 0, 701, 0, 0, 0, 0, 0, 0, 702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 570 - 676, 0, 0, 0, 0, 0, -129, 0, -129, 0, 0, 0, -129, 0, 0, -129, 0, 0, 0, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, -129, -129, -129, 0, 0, 0, 0, 0, -129, 0, -129, -129, 0, 0, -129, 0, -129, 0, 0, 0, 0, 0, -129, -129, 0, -129, 0, 0, -129, 0, -129, -129, 0, -129, -129, -129, 0, -129, 0, 0, -129, -129, 0, 0, 0, -129, 0, 0, 0, 0, -129, -129, -129, -129, -129, -129, + 0, -219, -219, 0, -219, 0, -219, -219, -219, -219, 0, 0, -219, 0, -219, -219, 0, 0, -219, 0, -219, -219, 0, 0, 0, 87, 0, -219, -219, 0, -219, 147, -219, -219, -219, -219, 0, 0, -219, 0, 0, 0, 0, -219, 0, -219, 0, -219, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, -219, 0, -219, -219, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 571 - 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, 0, -166, 0, -166, -166, -166, -166, -166, 0, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, 0, 0, 0, -166, -166, -166, -166, -166, -166, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, -166, -166, 0, -166, 0, -166, -166, 0, 0, 0, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 572 - -172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, 0, -280, 0, -280, -280, -280, -280, -280, 0, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, 0, 0, 0, -280, -280, -280, -280, -280, -280, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, -280, -280, 0, -280, 0, -280, -280, 0, 0, 0, -280, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, -280, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 573 - -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 574 - -341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 575 - -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 576 - -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 577 - -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 578 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -788, -788, -788, -788, -788, -788, 0, -788, -788, 0, -788, -788, -788, -788, -788, -788, -788, 0, 0, 0, -788, -788, -788, -788, -788, 0, -788, -788, -788, -788, -788, -788, -788, -788, -788, -788, -788, -788, -788, -788, 0, 0, 0, 0, -788, -788, -788, -788, -788, 0, -788, 0, 0, 0, 0, 0, 0, 0, 0, -788, 0, 0, -788, -788, 0, -788, 0, -788, -788, 0, 0, 0, -788, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, -788, -788, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 579 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -142, -142, 0, -142, 0, -142, 0, -142, 0, 0, -142, -142, 0, -142, -142, 0, -142, 0, 0, 0, 0, 0, -142, -142, -142, 0, -142, -142, 0, -142, -142, -142, -142, -142, -142, 0, -142, 0, 0, -142, 0, 0, 0, 0, -142, 0, -142, -142, -142, 0, -142, 0, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, -142, -142, 0, -142, 0, -142, -142, 0, 0, 0, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 580 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 0, 0, -354, 0, 0, -354, 0, 0, 0, -354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -354, -354, -354, -354, 0, 0, 0, 0, 0, 0, 0, -354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -354, 0, 0, 0, -354, 0, 0, 0, 0, -354, -354, -354, 0, -354, -354, // State 581 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -352, 0, 0, 0, 0, 0, -352, 0, 0, -352, 0, 0, 0, -352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -352, -352, -352, -352, 0, 0, 0, 0, 0, 0, 0, -352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -352, 0, 0, 0, -352, 0, 0, 0, 0, -352, -352, -352, 0, -352, -352, // State 582 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439, -439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439, 0, + -408, -408, 0, -408, 0, -408, 0, -408, 0, 0, -408, -408, 0, -408, -408, 0, -408, 0, 0, 0, 0, 0, -408, -408, -408, 0, -408, -408, 0, -408, -408, -408, -408, -408, -408, 0, -408, 0, 0, -408, 0, 0, 0, 0, -408, 34, -408, -408, -408, 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, -408, -408, 0, -408, 0, -408, -408, 0, 0, 0, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 583 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 584 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -436, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -436, 0, + -580, 0, 0, -580, 0, -580, 0, -580, 0, 0, -580, -580, 0, -580, -580, 0, -580, 0, 0, 0, 0, 0, -580, -580, -580, 0, -580, 0, 0, -580, 0, -580, 0, 0, 0, 0, -580, 0, 0, -580, 0, 0, 0, 0, 0, 0, -580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 585 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -435, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -435, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 586 - -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -881, -881, -881, -881, -881, -881, 0, -881, -881, 0, -881, -881, -881, -881, -881, -881, -881, 0, 0, 0, -881, -881, -881, -881, -881, 0, -881, -881, -881, -881, -881, -881, -881, -881, -881, -881, -881, -881, -881, -881, 0, 0, 0, 0, -881, -881, -881, -881, -881, 0, -881, 0, 0, 0, 0, 0, 0, 0, 0, -881, 0, 0, -881, -881, 0, -881, 0, -881, -881, 0, 0, 0, -881, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, -881, -881, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 587 - -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -965, -965, 0, -965, 21, -965, 0, -965, 0, 0, -965, -965, 0, -965, -965, 0, -965, 0, 0, 0, 0, 0, -965, -965, -965, 0, -965, -965, 0, -965, -965, -965, -965, -965, -965, 0, -965, -965, 0, -965, 0, 0, 0, 0, -965, -965, -965, -965, -965, 0, -965, 0, 0, 0, 0, 0, 0, 0, 0, -965, 0, 0, -965, -965, 0, -965, 0, -965, -965, 0, 0, 0, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, -965, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 588 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 589 - -513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -825, 0, 0, 0, 0, 0, 0, -825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -825, 0, 0, 0, 0, 0, -825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 590 - -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 591 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 713, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 592 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, 0, -230, 0, -230, -230, -230, -230, -230, 0, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, 0, 0, 0, -230, -230, -230, -230, -230, -230, 0, -230, 0, 0, 0, 0, 0, 0, 0, 0, -230, 0, 0, -230, -230, 0, -230, 0, -230, -230, 0, 0, 0, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 593 - -501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, 0, -224, 0, -224, -224, -224, -224, -224, 0, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, 0, 0, 0, -224, -224, -224, -224, -224, -224, 0, -224, 0, 0, 0, 0, 0, 0, 0, 0, -224, 0, 0, -224, -224, 0, -224, 0, -224, -224, 0, 0, 0, -224, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, -224, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 594 - -752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, 0, -234, 0, -234, -234, -234, -234, -234, 0, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, 0, 0, 0, -234, -234, -234, -234, -234, -234, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, 0, -234, -234, 0, -234, 0, -234, -234, 0, 0, 0, -234, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, -234, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 595 - -385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 596 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -969, 0, 0, 0, 0, 0, 0, -969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -969, 0, 0, 0, 0, -969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 597 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, 0, -220, 0, -220, -220, -220, -220, -220, 0, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, 0, 0, 0, -220, -220, -220, -220, -220, -220, 0, -220, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, 0, -220, -220, 0, -220, 0, -220, -220, 0, 0, 0, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 598 - 0, -181, -181, 0, -181, 0, -181, 0, -181, -181, 0, 0, -181, 0, -181, -181, 0, 0, -181, 0, -181, -181, 0, 0, -210, 0, 0, -181, -181, 0, -181, 0, -181, -181, -181, -181, 0, -181, 0, 0, 0, 0, -181, 0, -181, 0, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, -181, -181, 0, 0, 0, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 599 - 0, -910, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -910, 0, 0, -910, 0, -910, -910, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, -910, 0, -910, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -910, 0, -910, -910, 0, 0, 0, -910, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 600 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, -754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 601 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 602 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 603 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -498, 0, 0, -498, 0, -498, 0, -498, 0, 0, -498, -498, 0, -498, -498, 0, -498, 0, 0, 0, 0, 0, -498, -498, -498, 0, -498, 0, 0, -498, 0, -498, 0, 0, 0, 0, -498, 0, 0, -498, 0, 0, 0, 0, -498, 0, -498, 0, -498, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 604 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 605 - 0, -740, -740, 0, -740, 0, 0, 0, -740, 165, 0, 0, -740, 0, -740, -740, 0, 0, 0, 0, -740, -740, 0, 0, 0, 0, 0, -740, -740, 0, -740, 0, -740, -740, -740, -740, 0, -740, 0, 0, 0, 0, 0, 0, -740, 0, -740, -740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -740, 0, -740, -740, 0, 0, 0, -740, -740, 0, 0, 0, 0, 0, 0, 0, 0, 0, -740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, 0, -237, 0, -237, -237, -237, -237, -237, 0, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, 0, 0, 0, -237, -237, -237, -237, -237, -237, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, 0, -237, -237, 0, -237, 0, -237, -237, 0, 0, 0, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 606 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 607 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, 0, -240, 0, -240, -240, -240, -240, -240, 0, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, 0, 0, 0, -240, -240, -240, -240, -240, -240, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, 0, -240, -240, 0, -240, 0, -240, -240, 0, 0, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 608 - 0, -182, -182, 0, -182, 0, -182, 0, -182, -182, 0, 0, -182, 0, -182, -182, 0, 0, -182, 0, -182, -182, 0, 0, -211, 0, 0, -182, -182, 0, -182, 0, -182, -182, -182, -182, 0, -182, 0, 0, 0, 0, -182, 0, -182, 0, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, -182, -182, 0, 0, 0, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, -385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 609 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 610 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -278, -278, -278, -278, -278, -278, -278, 0, -278, -278, -278, -278, -278, -278, -278, -278, -278, 0, -278, 0, -278, -278, -278, -278, -278, 0, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, -274, -278, -278, 0, 0, 0, -278, 0, -278, -278, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, -278, -278, 0, 0, 0, -278, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 611 - 0, -183, -183, 0, -183, 0, -183, 0, -183, -183, 0, 0, -183, 0, -183, -183, 0, 0, -183, 0, -183, -183, 0, 0, -212, 0, 0, -183, -183, 0, -183, 0, -183, -183, -183, -183, 0, -183, 0, 0, 0, 0, -183, 0, -183, 0, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, -183, -183, 0, 0, 0, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -382, 0, 0, 0, -382, 0, -382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 612 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -833, 0, 0, 0, 0, 0, 0, 0, 0, 0, -838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 613 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 614 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 615 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, 0, 0, 0, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 616 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -296, 0, -296, 0, 0, 0, -296, 0, 0, -296, 0, 0, 0, -296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -296, -296, -296, -296, 0, 0, 0, 0, 0, 0, 0, -296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -296, 0, 0, -296, 0, 0, 0, 0, 0, 0, 0, 0, -296, -296, 0, 0, 0, -296, 0, 0, 0, 0, -296, -296, -296, 0, -296, -296, // State 617 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -297, 0, -297, 0, 0, 0, -297, 0, 0, -297, 0, 0, 0, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -297, -297, -297, -297, 0, 0, 0, 0, 0, 0, 0, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -297, 0, 0, -297, 0, 0, 0, 0, 0, 0, 0, 0, -297, -297, 0, 0, 0, -297, 0, 0, 0, 0, -297, -297, -297, 0, -297, -297, // State 618 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -302, 0, -302, 0, 0, 0, -302, 0, 0, -302, 0, 0, 0, -302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -302, -302, -302, -302, 0, 0, 0, 0, 0, 0, 0, -302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -302, 0, 0, -302, 0, 0, 0, 0, 0, 0, 0, 0, -302, -302, 0, 0, 0, -302, 0, 0, 0, 0, -302, -302, -302, 0, -302, -302, // State 619 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -293, 0, -293, 0, 0, 0, -293, 0, 0, -293, 0, 0, 0, -293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -293, -293, -293, -293, 0, 0, 0, 0, 0, 0, 0, -293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -293, 0, 0, -293, 0, 0, 0, 0, 0, 0, 0, 0, -293, -293, 0, 0, 0, -293, 0, 0, 0, 0, -293, -293, -293, 0, -293, -293, // State 620 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -291, 0, -291, 0, 0, 0, -291, 0, 0, -291, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -291, -291, -291, -291, 0, 0, 0, 0, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -291, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, -291, -291, 0, 0, 0, -291, 0, 0, 0, 0, -291, -291, -291, 0, -291, -291, // State 621 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -292, 0, -292, 0, 0, 0, -292, 0, 0, -292, 0, 0, 0, -292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -292, -292, -292, -292, 0, 0, 0, 0, 0, 0, 0, -292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -292, 0, 0, -292, 0, 0, 0, 0, 0, 0, 0, 0, -292, -292, 0, 0, 0, -292, 0, 0, 0, 0, -292, -292, -292, 0, -292, -292, // State 622 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -303, 0, -303, 0, 0, 0, -303, 0, 0, -303, 0, 0, 0, -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -303, -303, -303, -303, 0, 0, 0, 0, 0, 0, 0, -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -303, 0, 0, -303, 0, 0, 0, 0, 0, 0, 0, 0, -303, -303, 0, 0, 0, -303, 0, 0, 0, 0, -303, -303, -303, 0, -303, -303, // State 623 - 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, 0, -365, 0, -365, -365, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, -365, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, -365, -365, 0, 0, 0, -365, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, -365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -295, 0, -295, 0, 0, 0, -295, 0, 0, -295, 0, 0, 0, -295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -295, -295, -295, -295, 0, 0, 0, 0, 0, 0, 0, -295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -295, 0, 0, -295, 0, 0, 0, 0, 0, 0, 0, 0, -295, -295, 0, 0, 0, -295, 0, 0, 0, 0, -295, -295, -295, 0, -295, -295, // State 624 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -300, 0, -300, 0, 0, 0, -300, 0, 0, -300, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -300, -300, -300, -300, 0, 0, 0, 0, 0, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -300, 0, 0, -300, 0, 0, 0, 0, 0, 0, 0, 0, -300, -300, 0, 0, 0, -300, 0, 0, 0, 0, -300, -300, -300, 0, -300, -300, // State 625 - 0, -209, -209, 0, -209, 0, -209, 0, -209, -209, 0, 0, -209, 0, -209, -209, 0, 0, -209, 0, -209, -209, 0, 0, -236, 0, 0, -209, -209, 0, -209, 0, -209, -209, -209, -209, 0, -209, 0, 0, 0, 0, -209, 0, -209, 0, -209, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -209, 0, -209, -209, 0, 0, 0, -209, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, -209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -301, 0, -301, 0, 0, 0, -301, 0, 0, -301, 0, 0, 0, -301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -301, -301, -301, -301, 0, 0, 0, 0, 0, 0, 0, -301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -301, 0, 0, -301, 0, 0, 0, 0, 0, 0, 0, 0, -301, -301, 0, 0, 0, -301, 0, 0, 0, 0, -301, -301, -301, 0, -301, -301, // State 626 - 0, -207, -207, 0, -207, 0, -207, 0, -207, -207, 0, 0, -207, 0, -207, -207, 0, 0, -207, 0, -207, -207, 0, 0, -234, 0, 0, -207, -207, 0, -207, 0, -207, -207, -207, -207, 0, -207, 0, 0, 0, 0, -207, 0, -207, 0, -207, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, -207, -207, 0, 0, 0, -207, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -294, 0, -294, 0, 0, 0, -294, 0, 0, -294, 0, 0, 0, -294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -294, -294, -294, -294, 0, 0, 0, 0, 0, 0, 0, -294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -294, 0, 0, -294, 0, 0, 0, 0, 0, 0, 0, 0, -294, -294, 0, 0, 0, -294, 0, 0, 0, 0, -294, -294, -294, 0, -294, -294, // State 627 - 0, -208, -208, 0, -208, 0, -208, 0, -208, -208, 0, 0, -208, 0, -208, -208, 0, 0, -208, 0, -208, -208, 0, 0, -235, 0, 0, -208, -208, 0, -208, 0, -208, -208, -208, -208, 0, -208, 0, 0, 0, 0, -208, 0, -208, 0, -208, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, -208, -208, 0, 0, 0, -208, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -299, 0, -299, 0, 0, 0, -299, 0, 0, -299, 0, 0, 0, -299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -299, -299, -299, -299, 0, 0, 0, 0, 0, 0, 0, -299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -299, 0, 0, -299, 0, 0, 0, 0, 0, 0, 0, 0, -299, -299, 0, 0, 0, -299, 0, 0, 0, 0, -299, -299, -299, 0, -299, -299, // State 628 - 0, -206, -206, 0, -206, 0, -206, 0, -206, -206, 0, 0, -206, 0, -206, -206, 0, 0, -206, 0, -206, -206, 0, 0, -233, 0, 0, -206, -206, 0, -206, 0, -206, -206, -206, -206, 0, -206, 0, 0, 0, 0, -206, 0, -206, 0, -206, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, -206, -206, 0, 0, 0, -206, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -298, 0, -298, 0, 0, 0, -298, 0, 0, -298, 0, 0, 0, -298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298, -298, -298, -298, 0, 0, 0, 0, 0, 0, 0, -298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298, 0, 0, -298, 0, 0, 0, 0, 0, 0, 0, 0, -298, -298, 0, 0, 0, -298, 0, 0, 0, 0, -298, -298, -298, 0, -298, -298, // State 629 - 0, 0, 0, 0, 0, 0, 0, 705, 0, 0, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -796, 0, 0, 0, 0, 0, -796, 0, -796, 0, 0, 0, -796, 0, 0, -796, 0, 0, 0, -796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -796, 0, -796, -796, -796, -796, 0, 0, 0, 0, 0, -796, -796, -796, -796, 0, -796, -796, -796, -796, 0, 0, 0, 0, -796, -796, -796, -796, -796, 0, 0, -796, -796, -796, -796, 0, -796, -796, -796, -796, -796, -796, -796, -796, -796, 0, 0, 0, -796, 0, 0, 0, 0, -796, -796, -796, -796, -796, -796, // State 630 - -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, 0, -163, 0, -163, -163, -163, -163, -163, 0, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, -163, 0, 0, 0, -163, -163, -163, -163, -163, -163, 0, -163, 0, 0, 0, 0, 0, 0, 0, 0, -163, 0, 0, -163, -163, 0, -163, 0, -163, -163, 0, 0, 0, -163, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, -163, -163, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 750, 0, 0, 0, 0, 0, -132, 0, -132, 0, 0, 0, -132, 0, 0, -132, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132, 0, 0, 0, 0, 0, -132, 0, -132, -132, 0, 0, -132, 0, -132, 0, 0, 0, 0, 0, -132, -132, 0, -132, 0, 0, -132, 0, -132, -132, 0, -132, -132, -132, 0, -132, 0, 0, -132, -132, 0, 0, 0, -132, 0, 0, 0, 0, -132, -132, -132, -132, -132, -132, // State 631 - -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, 0, -160, 0, -160, -160, -160, -160, -160, 0, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, -160, 0, 0, 0, -160, -160, -160, -160, -160, -160, 0, -160, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, -160, -160, 0, -160, 0, -160, -160, 0, 0, 0, -160, -160, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, -160, -160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -425, -425, -425, -425, -425, -425, 0, 0, -425, 0, -425, -425, -425, -425, -425, -425, -425, 0, 0, 0, -425, -425, -425, -425, -425, 0, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -423, -425, -425, 0, 0, 0, 0, 0, -425, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, 0, -425, -425, 0, 0, 0, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 632 - 0, 0, 0, 0, 0, 0, -113, -113, -113, -113, 0, 0, -113, 0, 0, -113, 0, 0, 0, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113, -113, -113, -113, 0, 0, 0, 0, 0, 0, 0, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113, 0, 0, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113, 0, 0, 0, -113, 0, 0, 0, 0, -113, -113, -113, 0, -113, -113, + 0, 0, 0, 0, 0, 0, 0, 756, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 633 - 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, 0, 0, 0, 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 634 - 0, 0, 0, 0, 0, 0, 0, -412, 0, 0, 0, 0, 0, 0, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -233, -233, -233, -233, -233, -233, -233, 0, -233, -233, -233, -233, -233, -233, -233, -233, -233, 0, -233, 0, -233, -233, -233, -233, -233, 0, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, -204, -233, -233, 0, 0, 0, -233, 0, -233, -233, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, 0, -233, -233, 0, 0, 0, -233, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 635 - 0, 0, 0, 0, 0, 0, 0, -413, 0, 0, 0, 0, 0, 0, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 636 - -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, 0, -239, 0, -239, -239, -239, -239, -239, 0, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, 0, 0, 0, -239, -239, -239, -239, -239, -239, 0, -239, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, 0, -239, -239, 0, -239, 0, -239, -239, 0, 0, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 637 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -221, -221, -221, -221, -221, -221, -221, 0, -221, -221, -221, -221, -221, -221, -221, -221, -221, 0, -221, 0, -221, -221, -221, -221, -221, 0, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -221, -192, -221, -221, 0, 0, 0, -221, 0, -221, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, -221, -221, 0, 0, 0, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 638 - -140, -140, 0, -140, 0, -140, 0, -140, 0, 0, -140, -140, 0, -140, -140, 0, -140, 0, 0, 0, 0, 0, -140, -140, -140, 0, -140, -140, 0, -140, -140, -140, -140, -140, -140, 0, -140, 0, -140, 0, 0, 0, 0, -140, 0, -140, -140, -140, 0, -140, 0, 0, 0, 0, 0, 0, 0, 0, -140, 0, 0, -140, -140, 0, -140, 0, -140, -140, 0, 0, 0, -140, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -140, -140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 639 - -496, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 640 - -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, 0, -199, 0, -199, -199, -199, -199, -199, 0, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, -199, 0, 0, 0, -199, -199, -199, -199, -199, -199, 0, -199, 0, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, -199, -199, 0, -199, 0, -199, -199, 0, 0, 0, -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, -199, -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 641 - 0, 0, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 642 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 643 - -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, 0, -196, 0, -196, -196, -196, -196, -196, 0, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, 0, 0, 0, -196, -196, -196, -196, -196, -196, 0, -196, 0, 0, 0, 0, 0, 0, 0, 0, -196, 0, 0, -196, -196, 0, -196, 0, -196, -196, 0, 0, 0, -196, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, -196, -196, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 644 - 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, 0, 0, 0, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 645 - -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, 0, -190, 0, -190, -190, -190, -190, -190, 0, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, -190, 0, 0, 0, -190, -190, -190, -190, -190, -190, 0, -190, 0, 0, 0, 0, 0, 0, 0, 0, -190, 0, 0, -190, -190, 0, -190, 0, -190, -190, 0, 0, 0, -190, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, -190, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 646 - 0, 0, 0, 0, 0, 0, 0, -499, 0, 0, 0, 0, 0, 0, -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 647 - 0, 0, 0, 0, 0, 0, 0, -531, 0, 0, 0, 0, 0, 0, -531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 648 - -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, 0, -187, 0, -187, -187, -187, -187, -187, 0, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, -187, 0, 0, 0, -187, -187, -187, -187, -187, -187, 0, -187, 0, 0, 0, 0, 0, 0, 0, 0, -187, 0, 0, -187, -187, 0, -187, 0, -187, -187, 0, 0, 0, -187, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, -187, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, // State 649 - -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, 0, -200, 0, -200, -200, -200, -200, -200, 0, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, -200, 0, 0, 0, -200, -200, -200, -200, -200, -200, 0, -200, 0, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, -200, -200, 0, -200, 0, -200, -200, 0, 0, 0, -200, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, -200, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 650 - -915, 0, 0, 0, 0, 0, 0, -915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -915, 0, 0, 0, 0, -915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, -483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, 0, // State 651 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, -482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, // State 652 - -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, 0, -186, 0, -186, -186, -186, -186, -186, 0, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, 0, 0, 0, -186, -186, -186, -186, -186, -186, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, 0, -186, -186, 0, -186, 0, -186, -186, 0, 0, 0, -186, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, -186, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 653 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, -689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 654 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -527, 0, 0, 0, 0, 0, 0, 0, 0, 0, -527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 655 - -450, 0, 0, -450, 0, -450, 0, -450, 0, 0, -450, -450, 0, -450, -450, 0, -450, 0, 0, 0, 0, 0, -450, -450, -450, 0, -450, 0, 0, -450, 0, -450, 0, 0, 0, 0, -450, 0, -450, 0, 0, 0, 0, -450, 0, -450, 0, -450, 0, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -450, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -450, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 656 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -547, 0, 0, 0, 0, 0, 0, 0, 0, 0, -547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 657 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, -706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 658 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, -701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 659 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 660 - -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, 0, -203, 0, -203, -203, -203, -203, -203, 0, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, -203, 0, 0, 0, -203, -203, -203, -203, -203, -203, 0, -203, 0, 0, 0, 0, 0, 0, 0, 0, -203, 0, 0, -203, -203, 0, -203, 0, -203, -203, 0, 0, 0, -203, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, -203, -203, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 661 - -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, 0, -205, 0, -205, -205, -205, -205, -205, 0, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, -205, 0, 0, 0, -205, -205, -205, -205, -205, -205, 0, -205, 0, 0, 0, 0, 0, 0, 0, 0, -205, 0, 0, -205, -205, 0, -205, 0, -205, -205, 0, 0, 0, -205, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, -205, -205, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 662 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 663 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 664 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -217, -217, 0, -217, 0, -217, 0, -217, -217, 0, 0, -217, 0, -217, -217, 0, 0, -217, 0, -217, -217, 0, 0, -246, 0, 0, -217, -217, 0, -217, 0, -217, -217, -217, -217, 0, 0, -217, 0, 0, 0, 0, -217, 0, -217, 0, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0, -217, -217, 0, 0, 0, -217, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, -217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, // State 665 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -966, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, 0, 0, -966, 0, -966, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, 0, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, 0, -966, -966, 0, 0, 0, -966, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, -966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 666 - -748, 0, 0, 0, 0, 0, -748, 0, -748, 0, 0, 0, -748, 0, 0, -748, 0, 0, 0, -748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -748, 0, -748, -748, -748, -748, 0, 0, 0, 0, 0, -748, -748, -748, -748, 0, -748, -748, -748, -748, 0, 0, 0, 0, -748, -748, -748, -748, -748, 0, 0, -748, -748, -748, -748, 0, -748, -748, -748, -748, -748, -748, -748, -748, -748, 0, 0, 0, -748, 0, 0, 0, 0, -748, -748, -748, -748, -748, -748, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 667 - 726, 0, 0, 0, 0, 0, -130, 0, -130, 0, 0, 0, -130, 0, 0, -130, 0, 0, 0, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -130, -130, -130, -130, 0, 0, 0, 0, 0, -130, 0, -130, -130, 0, 0, -130, 0, -130, 0, 0, 0, 0, 0, -130, -130, 0, -130, 0, 0, -130, 0, -130, -130, 0, -130, -130, -130, 0, -130, 0, 0, -130, -130, 0, 0, 0, -130, 0, 0, 0, 0, -130, -130, -130, -130, -130, -130, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 668 - -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 669 - -842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -842, 0, 0, 0, 0, -842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 670 - -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 671 - -843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -843, 0, 0, 0, 0, -843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -789, -789, 0, -789, 0, 0, 0, -789, 197, 0, 0, -789, 0, -789, -789, 0, 0, 0, 0, -789, -789, 0, 0, 0, 0, 0, -789, -789, 0, -789, 0, -789, -789, -789, -789, 0, 0, -789, 0, 0, 0, 0, 0, 0, -789, 0, -789, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -789, 0, -789, -789, 0, 0, 0, -789, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, -789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 672 - -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, 0, 0, 0, 0, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 673 - -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -173, 0, 0, 0, 0, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 674 - -452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -452, 0, 0, 0, 0, -452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -218, -218, 0, -218, 0, -218, 0, -218, -218, 0, 0, -218, 0, -218, -218, 0, 0, -218, 0, -218, -218, 0, 0, -247, 0, 0, -218, -218, 0, -218, 0, -218, -218, -218, -218, 0, 0, -218, 0, 0, 0, 0, -218, 0, -218, 0, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, 0, -218, -218, 0, 0, 0, -218, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, -218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 675 - -745, 0, 0, 0, 0, 0, -745, 0, -745, 0, 0, 0, -745, 0, 0, -745, 0, 0, 0, -745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -745, 0, -745, -745, -745, -745, 0, 0, 0, 0, 0, -745, -745, -745, -745, 0, -745, -745, -745, -745, 0, 0, 0, 0, -745, -745, -745, -745, -745, 0, 0, -745, -745, -745, -745, 0, -745, -745, -745, -745, -745, -745, -745, -745, -745, 0, 0, 0, -745, 0, 0, 0, 0, -745, -745, -745, -745, -745, -745, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 676 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -336, 0, 0, 0, -336, 0, -336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 677 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -219, -219, 0, -219, 0, -219, 0, -219, -219, 0, 0, -219, 0, -219, -219, 0, 0, -219, 0, -219, -219, 0, 0, -248, 0, 0, -219, -219, 0, -219, 0, -219, -219, -219, -219, 0, 0, -219, 0, 0, 0, 0, -219, 0, -219, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, -219, -219, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 678 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -887, 0, 0, 0, 0, 0, 0, 0, 0, 0, -892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 679 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 680 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 681 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -891, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 682 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -440, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -440, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 683 - -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, 206, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 684 - 757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 685 - 760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 686 - 763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 687 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 688 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 689 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -540, 0, 0, 0, 0, 0, 0, 0, 0, 0, -542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -540, 0, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, -409, 0, -409, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, -409, -409, 0, 0, 0, -409, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, -409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 690 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 691 - 0, -238, -238, 0, -238, 0, -238, 0, -238, -238, 0, 0, -238, 0, -238, -238, 0, 0, -238, 0, -238, -238, 0, 0, -242, 0, 0, -238, -238, 0, -238, 0, -238, -238, -238, -238, 0, -238, 0, 0, 0, 0, -238, 0, -238, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, 0, -238, -238, 0, 0, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -245, -245, 0, -245, 0, -245, 0, -245, -245, 0, 0, -245, 0, -245, -245, 0, 0, -245, 0, -245, -245, 0, 0, -272, 0, 0, -245, -245, 0, -245, 0, -245, -245, -245, -245, 0, 0, -245, 0, 0, 0, 0, -245, 0, -245, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, -245, -245, 0, 0, 0, -245, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 692 - 0, -379, -379, 0, -379, 0, 0, 0, -379, 0, 0, 0, -379, 0, -379, -379, 0, 0, 0, 0, -379, -379, 0, 0, -381, 0, 0, -379, -379, 0, -379, 0, -379, -379, -379, -379, 0, -379, 0, 0, 0, 0, 0, 0, -379, 0, -379, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -379, 0, -379, -379, 0, 0, 0, -379, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, -379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -243, -243, 0, -243, 0, -243, 0, -243, -243, 0, 0, -243, 0, -243, -243, 0, 0, -243, 0, -243, -243, 0, 0, -270, 0, 0, -243, -243, 0, -243, 0, -243, -243, -243, -243, 0, 0, -243, 0, 0, 0, 0, -243, 0, -243, 0, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, 0, -243, -243, 0, 0, 0, -243, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, -243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 693 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, -905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -244, -244, 0, -244, 0, -244, 0, -244, -244, 0, 0, -244, 0, -244, -244, 0, 0, -244, 0, -244, -244, 0, 0, -271, 0, 0, -244, -244, 0, -244, 0, -244, -244, -244, -244, 0, 0, -244, 0, 0, 0, 0, -244, 0, -244, 0, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, 0, -244, -244, 0, 0, 0, -244, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, -244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 694 - 0, 0, 0, 0, 0, 0, 0, 784, 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -242, -242, 0, -242, 0, -242, 0, -242, -242, 0, 0, -242, 0, -242, -242, 0, 0, -242, 0, -242, -242, 0, 0, -269, 0, 0, -242, -242, 0, -242, 0, -242, -242, -242, -242, 0, 0, -242, 0, 0, 0, 0, -242, 0, -242, 0, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -242, 0, -242, -242, 0, 0, 0, -242, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 695 - 0, 0, 0, 0, 0, 0, 0, -530, 0, 0, 0, 0, 0, 0, -530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 696 - 0, 0, 0, 0, 0, 0, 0, 787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 697 - 0, -197, -197, 0, -197, 0, -197, 0, -197, -197, 0, 0, -197, 0, -197, -197, 0, 0, -197, 0, -197, -197, 0, 0, -224, 0, 0, -197, -197, 0, -197, 0, -197, -197, -197, -197, 0, -197, 0, 0, 0, 0, -197, 0, -197, 0, -197, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -197, 0, -197, -197, 0, 0, 0, -197, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, -197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -238, -238, -238, -238, -238, -238, -238, 0, -238, -238, -238, -238, -238, -238, -238, -238, -238, 0, -238, 0, -238, -238, -238, -238, -238, 0, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -238, -209, -238, -238, 0, 0, 0, -238, 0, -238, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, 0, -238, -238, 0, 0, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 698 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, 794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 699 - 0, -185, -185, 0, -185, 0, -185, 0, -185, -185, 0, 0, -185, 0, -185, -185, 0, 0, -185, 0, -185, -185, 0, 0, -214, 0, 0, -185, -185, 0, -185, 0, -185, -185, -185, -185, 0, -185, 0, 0, 0, 0, -185, 0, -185, 0, -185, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, -185, -185, 0, 0, 0, -185, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, 0, -168, 0, -168, -168, -168, -168, -168, 0, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, -168, 0, 0, 0, -168, -168, -168, -168, -168, -168, 0, -168, 0, 0, 0, 0, 0, 0, 0, 0, -168, 0, 0, -168, -168, 0, -168, 0, -168, -168, 0, 0, 0, -168, -168, 0, 0, 0, 0, 0, 0, 0, 0, 0, -168, -168, -168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 700 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -502, 0, 0, 0, 0, 0, 0, 0, 0, 0, -504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -502, -502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -502, 0, 0, 0, 0, 0, 0, 0, -502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, 0, -165, 0, -165, -165, -165, -165, -165, 0, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, -165, 0, 0, 0, -165, -165, -165, -165, -165, -165, 0, -165, 0, 0, 0, 0, 0, 0, 0, 0, -165, 0, 0, -165, -165, 0, -165, 0, -165, -165, 0, 0, 0, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 701 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -116, -116, -116, -116, 0, 0, -116, 0, 0, -116, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, -116, -116, -116, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, 0, 0, 0, -116, 0, 0, 0, 0, -116, -116, -116, 0, -116, -116, // State 702 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -455, 0, 0, 0, 0, 0, 0, -455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 703 - 0, -202, -202, 0, -202, 0, -202, 0, -202, -202, 0, 0, -202, 0, -202, -202, 0, 0, -202, 0, -202, -202, 0, 0, -229, 0, 0, -202, -202, 0, -202, 0, -202, -202, -202, -202, 0, -202, 0, 0, 0, 0, -202, 0, -202, 0, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, -202, -202, 0, 0, 0, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 704 - -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, 0, -162, 0, -162, -162, -162, -162, -162, 0, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, -162, 0, 0, 0, -162, -162, -162, -162, -162, -162, 0, -162, 0, 0, 0, 0, 0, 0, 0, 0, -162, 0, 0, -162, -162, 0, -162, 0, -162, -162, 0, 0, 0, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, -162, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 705 - 0, 0, 0, 0, 0, 0, -114, -114, -114, -114, 0, 0, -114, 0, 0, -114, 0, 0, 0, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114, -114, -114, -114, 0, 0, 0, 0, 0, 0, 0, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114, 0, 0, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114, 0, 0, 0, -114, 0, 0, 0, 0, -114, -114, -114, 0, -114, -114, + -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, 0, -279, 0, -279, -279, -279, -279, -279, 0, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, 0, 0, 0, -279, -279, -279, -279, -279, -279, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, 0, -279, -279, 0, -279, 0, -279, -279, 0, 0, 0, -279, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, -279, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 706 - 0, 0, 0, 0, 0, 0, 0, -411, 0, 0, 0, 0, 0, 0, -411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 707 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -143, -143, 0, -143, 0, -143, 0, -143, 0, 0, -143, -143, 0, -143, -143, 0, -143, 0, 0, 0, 0, 0, -143, -143, -143, 0, -143, -143, 0, -143, -143, -143, -143, -143, -143, 0, -143, 0, 0, -143, 0, 0, 0, 0, -143, 0, -143, -143, -143, 0, -143, 0, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, -143, -143, 0, -143, 0, -143, -143, 0, 0, 0, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 708 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -543, 0, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 709 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, 0, -235, 0, -235, -235, -235, -235, -235, 0, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, 0, 0, 0, -235, -235, -235, -235, -235, -235, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, -235, -235, 0, -235, 0, -235, -235, 0, 0, 0, -235, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, -235, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 710 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -826, 0, 0, 0, 0, 0, 0, -826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -826, 0, 0, 0, 0, 0, -826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 711 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 712 - -831, 0, 0, -831, 0, -831, 0, -831, 0, 0, -831, -831, 0, -831, -831, 0, -831, 0, 0, 0, 0, 0, -831, -831, -831, 0, -831, 0, 0, -831, 0, -831, 0, 0, 0, 0, -831, 0, -831, 0, 0, 0, 0, -831, 0, -831, 0, -831, 0, -831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -831, -831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -831, -831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, 0, -232, 0, -232, -232, -232, -232, -232, 0, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, 0, 0, 0, -232, -232, -232, -232, -232, -232, 0, -232, 0, 0, 0, 0, 0, 0, 0, 0, -232, 0, 0, -232, -232, 0, -232, 0, -232, -232, 0, 0, 0, -232, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, -232, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 713 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, 0, 0, 0, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 714 - 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, 0, 0, 0, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, 0, -226, 0, -226, -226, -226, -226, -226, 0, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, 0, 0, 0, -226, -226, -226, -226, -226, -226, 0, -226, 0, 0, 0, 0, 0, 0, 0, 0, -226, 0, 0, -226, -226, 0, -226, 0, -226, -226, 0, 0, 0, -226, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, -226, -226, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 715 - -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, 0, -192, 0, -192, -192, -192, -192, -192, 0, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, -192, 0, 0, 0, -192, -192, -192, -192, -192, -192, 0, -192, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, 0, -192, -192, 0, -192, 0, -192, -192, 0, 0, 0, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -546, 0, 0, 0, 0, 0, 0, -546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 716 - 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -578, 0, 0, 0, 0, 0, 0, -578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 717 - -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, 0, -193, 0, -193, -193, -193, -193, -193, 0, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, -193, 0, 0, 0, -193, -193, -193, -193, -193, -193, 0, -193, 0, 0, 0, 0, 0, 0, 0, 0, -193, 0, 0, -193, -193, 0, -193, 0, -193, -193, 0, 0, 0, -193, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, -193, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, 0, -223, 0, -223, -223, -223, -223, -223, 0, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, 0, 0, 0, -223, -223, -223, -223, -223, -223, 0, -223, 0, 0, 0, 0, 0, 0, 0, 0, -223, 0, 0, -223, -223, 0, -223, 0, -223, -223, 0, 0, 0, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, -223, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 718 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, 0, -236, 0, -236, -236, -236, -236, -236, 0, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, 0, 0, 0, -236, -236, -236, -236, -236, -236, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, 0, -236, -236, 0, -236, 0, -236, -236, 0, 0, 0, -236, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, -236, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 719 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, -680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -971, 0, 0, 0, 0, 0, 0, -971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -971, 0, 0, 0, 0, -971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 720 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, -685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 721 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 801, 0, 0, 0, 0, 0, 0, 0, 0, 0, -703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, 0, -222, 0, -222, -222, -222, -222, -222, 0, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, 0, 0, 0, -222, -222, -222, -222, -222, -222, 0, -222, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, 0, -222, -222, 0, -222, 0, -222, -222, 0, 0, 0, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 722 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 807, 0, 0, 0, 0, 0, 0, 0, 0, 0, -736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 723 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, -700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -574, 0, 0, 0, 0, 0, 0, 0, 0, 0, -574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 724 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -497, 0, 0, -497, 0, -497, 0, -497, 0, 0, -497, -497, 0, -497, -497, 0, -497, 0, 0, 0, 0, 0, -497, -497, -497, 0, -497, 0, 0, -497, 0, -497, 0, 0, 0, 0, -497, 0, 0, -497, 0, 0, 0, 0, -497, 0, -497, 0, -497, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 725 - -746, 0, 0, 0, 0, 0, -746, 0, -746, 0, 0, 0, -746, 0, 0, -746, 0, 0, 0, -746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -746, 0, -746, -746, -746, -746, 0, 0, 0, 0, 0, -746, -746, -746, -746, 0, -746, -746, -746, -746, 0, 0, 0, 0, -746, -746, -746, -746, -746, 0, 0, -746, -746, -746, -746, 0, -746, -746, -746, -746, -746, -746, -746, -746, -746, 0, 0, 0, -746, 0, 0, 0, 0, -746, -746, -746, -746, -746, -746, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -594, 0, 0, 0, 0, 0, 0, 0, 0, 0, -594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 726 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, -753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 727 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, -748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 728 - -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 729 - -171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, 0, -239, 0, -239, -239, -239, -239, -239, 0, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, 0, 0, 0, -239, -239, -239, -239, -239, -239, 0, -239, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, 0, -239, -239, 0, -239, 0, -239, -239, 0, 0, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 730 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, 0, -241, 0, -241, -241, -241, -241, -241, 0, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, 0, 0, 0, -241, -241, -241, -241, -241, -241, 0, -241, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, 0, -241, -241, 0, -241, 0, -241, -241, 0, 0, 0, -241, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, -241, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 731 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 732 - -268, 0, 0, 0, 0, 0, -268, 0, -268, 0, 0, 0, -268, 0, 0, -268, 0, 0, 0, -268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -268, 0, -268, -268, -268, -268, 0, 0, 0, 0, 0, -268, -268, -268, -268, 0, -268, -268, -268, -268, 0, 0, 0, 0, -268, -268, -268, -268, -268, 0, 0, -268, -268, -268, -268, 0, -268, -268, -268, -268, -268, -268, -268, -268, -268, 0, 0, 0, -268, -268, 0, 0, 0, -268, -268, -268, -268, -268, -268, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 733 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 734 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 735 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -797, 0, 0, 0, 0, 0, -797, 0, -797, 0, 0, 0, -797, 0, 0, -797, 0, 0, 0, -797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -797, 0, -797, -797, -797, -797, 0, 0, 0, 0, 0, -797, -797, -797, -797, 0, -797, -797, -797, -797, 0, 0, 0, 0, -797, -797, -797, -797, -797, 0, 0, -797, -797, -797, -797, 0, -797, -797, -797, -797, -797, -797, -797, -797, -797, 0, 0, 0, -797, 0, 0, 0, 0, -797, -797, -797, -797, -797, -797, // State 736 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 814, 0, 0, 0, 0, 0, -133, 0, -133, 0, 0, 0, -133, 0, 0, -133, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133, 0, 0, 0, 0, 0, -133, 0, -133, -133, 0, 0, -133, 0, -133, 0, 0, 0, 0, 0, -133, -133, 0, -133, 0, 0, -133, 0, -133, -133, 0, -133, -133, -133, 0, -133, 0, 0, -133, -133, 0, 0, 0, -133, 0, 0, 0, 0, -133, -133, -133, -133, -133, -133, // State 737 - 0, 0, 0, 0, 0, 0, 0, -881, 0, 0, 0, 0, 0, 0, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -280, -280, -280, -280, -280, -280, -280, 0, -280, -280, -280, -280, -280, -280, -280, -280, -280, 0, -280, 0, -280, -280, -280, -280, -280, 0, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -280, -276, -280, -280, 0, 0, 0, -280, 0, -280, -280, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, -280, -280, 0, 0, 0, -280, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 738 - 0, 0, 0, 0, 0, 0, 0, -631, 0, 0, 0, 0, 0, 0, 818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 739 - 0, 0, 0, 0, 0, 0, 0, -605, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -788, -788, -788, -788, -788, -788, 0, 0, -788, 0, -788, -788, -788, -788, -788, -788, -788, 0, 0, 0, -788, -788, -788, -788, -788, 0, -788, -788, -788, -788, -788, -788, -788, -788, -788, -788, -788, -786, -788, -788, 0, 0, 0, 0, 0, -788, -788, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -788, 0, -788, -788, 0, 0, 0, -788, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, -788, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 740 - 0, 0, 0, 0, 0, 0, 0, -524, 0, 0, 0, 0, 0, 0, -524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 741 - 0, 0, 0, 0, 0, 0, 0, 819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -408, -408, 0, -408, 0, -408, 0, 0, 0, 0, -408, -408, 0, -408, -408, 0, -408, 0, 0, 0, 0, 0, -408, -408, -408, 0, -408, -408, 0, -408, -408, -408, -408, -408, -408, 0, -408, -406, 0, -408, 0, 0, 0, 0, 0, 34, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, -408, -408, 0, 0, 0, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 742 - 0, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, -544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, 0, 0, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 743 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -729, 0, 0, 0, 0, 0, 0, -729, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -896, 0, 0, 0, 0, -896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 744 - -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 745 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -897, 0, 0, 0, 0, -897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 746 - -517, 0, 0, 0, 0, 0, 0, -517, 0, 0, 0, 0, 0, 0, -517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 747 - -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 748 - -431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -499, 0, 0, 0, 0, -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 749 - -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -794, 0, 0, 0, 0, 0, -794, 0, -794, 0, 0, 0, -794, 0, 0, -794, 0, 0, 0, -794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -794, 0, -794, -794, -794, -794, 0, 0, 0, 0, 0, -794, -794, -794, -794, 0, -794, -794, -794, -794, 0, 0, 0, 0, -794, -794, -794, -794, -794, 0, 0, -794, -794, -794, -794, 0, -794, -794, -794, -794, -794, -794, -794, -794, -794, 0, 0, 0, -794, 0, 0, 0, 0, -794, -794, -794, -794, -794, -794, // State 750 - -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -881, -881, -881, -881, -881, -881, 0, 0, -881, 0, -881, -881, -881, -881, -881, -881, -881, 0, 0, 0, -881, -881, -881, -881, -881, 0, -881, -881, -881, -881, -881, -881, -881, -881, -881, -881, -881, -879, -881, -881, 0, 0, 0, 0, 0, -881, -881, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -881, 0, -881, -881, 0, 0, 0, -881, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, -881, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 751 - -511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -965, -965, 0, -965, 21, -965, 0, 0, 0, 0, -965, -965, 0, -965, -965, 0, -965, 0, 0, 0, 0, 0, -965, -965, -965, 0, -965, -965, 0, -965, -965, -965, -965, -965, -965, 0, -965, -963, 0, -965, 0, 0, 0, 0, 0, -965, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -965, 0, -965, -965, 0, 0, 0, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 752 - -512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 753 - -515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 820, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 754 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -867, 0, 0, 0, 0, 0, 0, 0, 0, 0, -867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -230, -230, -230, -230, -230, -230, -230, 0, -230, -230, -230, -230, -230, -230, -230, -230, -230, 0, -230, 0, -230, -230, -230, -230, -230, 0, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -201, -230, -230, 0, 0, 0, -230, 0, -230, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, 0, -230, -230, 0, 0, 0, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 755 - 828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -224, -224, -224, -224, -224, -224, -224, 0, -224, -224, -224, -224, -224, -224, -224, -224, -224, 0, -224, 0, -224, -224, -224, -224, -224, 0, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -224, -195, -224, -224, 0, 0, 0, -224, 0, -224, -224, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, 0, -224, -224, 0, 0, 0, -224, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 756 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, + -234, -234, -234, -234, -234, -234, -234, 0, -234, -234, -234, -234, -234, -234, -234, -234, -234, 0, -234, 0, -234, -234, -234, -234, -234, 0, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, -205, -234, -234, 0, 0, 0, -234, 0, -234, -234, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, -234, -234, 0, 0, 0, -234, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 757 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -868, 0, 0, 0, 0, 0, 0, 0, 0, 0, -868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 758 - 829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -378, 0, 0, 0, -378, 0, -378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 759 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, + -220, -220, -220, -220, -220, -220, -220, 0, -220, -220, -220, -220, -220, -220, -220, -220, -220, 0, -220, 0, -220, -220, -220, -220, -220, 0, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -220, -191, -220, -220, 0, 0, 0, -220, 0, -220, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, -220, -220, 0, 0, 0, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 760 - -751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 761 - 830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 762 - -824, 0, 0, 0, 0, 0, -824, 0, -824, 0, 0, 0, -824, 0, 0, -824, 0, 0, 0, -824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -824, 0, -824, -824, -824, -824, 0, 0, 0, 0, 0, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, -824, 0, 0, -824, -824, -824, -824, 0, -824, -824, -824, -824, -824, -824, -824, -824, -824, 0, 0, 0, -824, -824, 0, 0, 0, -824, -824, -824, -824, -824, -824, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 763 - 832, 0, 0, 0, 0, 0, -129, 0, -129, 0, 0, 0, -129, 0, 0, -129, 0, 0, 0, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, -129, -129, -129, 0, 0, 0, 0, 0, -129, 0, -129, -129, 0, 0, -129, 0, -129, 0, 0, 0, 0, 0, -129, -129, 0, -129, 0, 0, -129, 0, -129, -129, 0, -129, -129, -129, 0, -129, 0, 0, -129, -129, 0, 0, 0, -129, 0, 0, 0, 0, -129, -129, -129, -129, -129, -129, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 764 - -358, 0, 0, 0, 0, 0, -358, 0, -358, 0, 0, 0, -358, 0, 0, -358, 0, 0, 0, -358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -358, 0, -358, -358, -358, -358, 0, 0, 0, 0, 0, -358, -358, -358, -358, 0, -358, -358, -358, -358, 0, -358, -358, -358, -358, -358, -358, -358, -358, 0, 0, -358, -358, -358, -358, 0, -358, -358, -358, -358, -358, -358, -358, -358, -358, 0, 0, 0, -358, -358, 0, 0, 0, -358, -358, -358, -358, -358, -358, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 765 - -362, 0, 0, 0, 0, 0, -362, 0, -362, 0, 0, 0, -362, 0, 0, -362, 0, 0, 0, -362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362, 0, -362, -362, -362, -362, 0, 0, 0, 0, 0, -362, -362, -362, -362, 0, -362, -362, -362, -362, 0, -362, -362, -362, -362, -362, -362, -362, -362, 0, 0, -362, -362, -362, -362, 0, -362, -362, -362, -362, -362, -362, -362, -362, -362, 0, 0, 0, -362, -362, 0, 0, 0, -362, -362, -362, -362, -362, -362, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 766 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, -487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, 0, // State 767 - -871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 768 - -888, 0, 0, 0, 0, 0, -888, 0, -888, 0, 0, 0, -888, 0, 0, -888, 0, 0, 0, -888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -888, 0, -888, -888, -888, -888, 0, 0, 0, 0, 0, -888, -888, -888, -888, 0, -888, -888, -888, -888, 0, 844, 0, 0, -888, -888, -888, -888, -888, 0, 0, -888, -888, -888, -888, 0, -888, -888, -888, -888, -888, -888, -888, -888, -888, 0, 0, 0, -888, -888, 0, 0, 0, -888, -888, -888, -888, -888, -888, + 852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 769 - 0, -240, -240, 0, -240, 0, -240, 0, -240, -240, 0, 0, -240, 0, -240, -240, 0, 0, -240, 0, -240, -240, 0, 0, -244, 0, 0, -240, -240, 0, -240, 0, -240, -240, -240, -240, 0, -240, 0, 0, 0, 0, -240, 0, -240, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, -240, -240, 0, 0, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 770 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 771 - 0, -739, -739, 0, -739, 0, 0, 0, -739, 0, 0, 0, -739, 0, -739, -739, 0, 0, 0, 0, -739, -739, 0, 0, -741, 0, 0, -739, -739, 0, -739, 0, -739, -739, -739, -739, 0, -739, 0, 0, 0, 0, 0, 0, -739, 0, -739, -739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -739, 0, -739, -739, 0, 0, 0, -739, -739, 0, 0, 0, 0, 0, 0, 0, 0, 0, -739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, // State 772 - 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, -366, 0, 0, -364, 0, 0, -364, 0, -364, -364, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, -364, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, -364, -364, 0, 0, 0, -364, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, -364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 773 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -587, 0, 0, 0, 0, 0, 0, 0, 0, 0, -589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -587, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 774 - 0, -827, -827, 0, -827, 0, 0, 0, -827, 0, 0, 0, -827, 0, -827, -827, 0, 0, 0, 0, -827, -827, 0, 0, -829, 0, 0, -827, -827, 0, -827, 0, -827, -827, -827, -827, 0, -827, 0, 0, 0, 0, 0, 0, -827, 0, -827, -827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -827, 0, -827, -827, 0, 0, 0, -827, -827, 0, 0, 0, 0, 0, 0, 0, 0, 0, -827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 569, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, 0, 0, 0, 0, 0, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 775 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -890, 0, 0, 0, 0, 0, 0, 0, 0, 0, -893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -278, -278, 0, -278, 0, -278, 0, -278, -278, 0, 0, -278, 0, -278, -278, 0, 0, -278, 0, -278, -278, 0, 0, -282, 0, 0, -278, -278, 0, -278, 0, -278, -278, -278, -278, 0, 0, -278, 0, 0, 0, 0, -278, 0, -278, 0, -278, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, -278, -278, 0, 0, 0, -278, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 776 - 0, 0, 0, 0, 0, 0, 0, -889, 0, 0, 0, 0, 0, 0, -889, 0, 0, 0, 0, 0, 0, 0, 0, 0, -889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -425, -425, 0, -425, 0, 0, 0, -425, 0, 0, 0, -425, 0, -425, -425, 0, 0, 0, 0, -425, -425, 0, 0, -427, 0, 0, -425, -425, 0, -425, 0, -425, -425, -425, -425, 0, 0, -425, 0, 0, 0, 0, 0, 0, -425, 0, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, 0, -425, -425, 0, 0, 0, -425, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 777 - 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, 0, 0, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, -959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 778 - -908, 0, 0, 0, 0, 0, -908, 0, -908, 0, 0, 0, -908, 0, 0, -908, 0, 0, 0, -908, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -908, 0, -908, -908, -908, -908, 0, 0, 0, 0, 0, -908, -908, -908, -908, 0, -908, -908, -908, -908, 0, 0, 0, 0, -908, -908, -908, -908, -908, 0, 0, -908, -908, -908, -908, 0, -908, -908, -908, -908, -908, -908, -908, -908, -908, 0, 0, 0, -908, -908, 0, 0, 0, -908, -908, -908, -908, -908, -908, + 0, 0, 0, 0, 0, 0, 0, 879, 0, 0, 0, 0, 0, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 779 - 0, -909, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, -911, 0, 0, -909, 0, 0, -909, 0, -909, -909, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, -909, 0, -909, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -909, 0, -909, -909, 0, 0, 0, -909, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -577, 0, 0, 0, 0, 0, 0, -577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 780 - 0, 0, 0, 0, 0, 0, 0, 847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 781 - 0, 0, 0, 0, 0, 0, 0, 848, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -233, -233, 0, -233, 0, -233, 0, -233, -233, 0, 0, -233, 0, -233, -233, 0, 0, -233, 0, -233, -233, 0, 0, -260, 0, 0, -233, -233, 0, -233, 0, -233, -233, -233, -233, 0, 0, -233, 0, 0, 0, 0, -233, 0, -233, 0, -233, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, 0, -233, -233, 0, 0, 0, -233, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 782 - 0, -194, -194, 0, -194, 0, -194, 0, -194, -194, 0, 0, -194, 0, -194, -194, 0, 0, -194, 0, -194, -194, 0, 0, -221, 0, 0, -194, -194, 0, -194, 0, -194, -194, -194, -194, 0, -194, 0, 0, 0, 0, -194, 0, -194, 0, -194, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, 0, -194, -194, 0, 0, 0, -194, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 783 - 0, -188, -188, 0, -188, 0, -188, 0, -188, -188, 0, 0, -188, 0, -188, -188, 0, 0, -188, 0, -188, -188, 0, 0, -895, 0, 0, -188, -188, 0, -188, 0, -188, -188, -188, -188, 0, -188, 0, 0, 0, 0, -188, 0, -188, 0, -188, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -188, 0, -188, -188, 0, 0, 0, -188, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -221, -221, 0, -221, 0, -221, 0, -221, -221, 0, 0, -221, 0, -221, -221, 0, 0, -221, 0, -221, -221, 0, 0, -250, 0, 0, -221, -221, 0, -221, 0, -221, -221, -221, -221, 0, 0, -221, 0, 0, 0, 0, -221, 0, -221, 0, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, -221, -221, 0, 0, 0, -221, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, -221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 784 - 0, 0, 0, 0, 0, 0, 0, 853, 0, 0, 0, 0, 0, 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -549, 0, 0, 0, 0, 0, 0, 0, 0, 0, -551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -549, -549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -549, 0, 0, 0, 0, 0, 0, 0, -549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 785 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 786 - 0, -198, -198, 0, -198, 0, -198, 0, -198, -198, 0, 0, -198, 0, -198, -198, 0, 0, -198, 0, -198, -198, 0, 0, -225, 0, 0, -198, -198, 0, -198, 0, -198, -198, -198, -198, 0, -198, 0, 0, 0, 0, -198, 0, -198, 0, -198, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, 0, -198, -198, 0, 0, 0, -198, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 787 - 0, 0, 0, 0, 0, 0, 0, 855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -238, -238, 0, -238, 0, -238, 0, -238, -238, 0, 0, -238, 0, -238, -238, 0, 0, -238, 0, -238, -238, 0, 0, -265, 0, 0, -238, -238, 0, -238, 0, -238, -238, -238, -238, 0, 0, -238, 0, 0, 0, 0, -238, 0, -238, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, 0, -238, -238, 0, 0, 0, -238, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, -238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 788 - 0, -184, -184, 0, -184, 0, -184, 0, -184, -184, 0, 0, -184, 0, -184, -184, 0, 0, -184, 0, -184, -184, 0, 0, -213, 0, 0, -184, -184, 0, -184, 0, -184, -184, -184, -184, 0, -184, 0, 0, 0, 0, -184, 0, -184, 0, -184, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, -184, -184, 0, 0, 0, -184, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 789 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -237, -237, -237, -237, -237, -237, -237, 0, -237, -237, -237, -237, -237, -237, -237, -237, -237, 0, -237, 0, -237, -237, -237, -237, -237, 0, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -237, -208, -237, -237, 0, 0, 0, -237, 0, -237, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, -237, -237, 0, 0, 0, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 790 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 857, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 891, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 791 - 0, -201, -201, 0, -201, 0, -201, 0, -201, -201, 0, 0, -201, 0, -201, -201, 0, 0, -201, 0, -201, -201, 0, 0, -228, 0, 0, -201, -201, 0, -201, 0, -201, -201, -201, -201, 0, -201, 0, 0, 0, 0, -201, 0, -201, 0, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, -201, -201, 0, 0, 0, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -240, -240, -240, -240, -240, -240, -240, 0, -240, -240, -240, -240, -240, -240, -240, -240, -240, 0, -240, 0, -240, -240, -240, -240, -240, 0, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -240, -211, -240, -240, 0, 0, 0, -240, 0, -240, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, -240, -240, 0, 0, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 792 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, 0, -167, 0, -167, -167, -167, -167, -167, 0, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, -167, 0, 0, 0, -167, -167, -167, -167, -167, -167, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, -167, -167, 0, -167, 0, -167, -167, 0, 0, 0, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 793 - 0, -204, -204, 0, -204, 0, -204, 0, -204, -204, 0, 0, -204, 0, -204, -204, 0, 0, -204, 0, -204, -204, 0, 0, -231, 0, 0, -204, -204, 0, -204, 0, -204, -204, -204, -204, 0, -204, 0, 0, 0, 0, -204, 0, -204, 0, -204, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, -204, -204, 0, 0, 0, -204, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, -204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -117, -117, -117, -117, 0, 0, -117, 0, 0, -117, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, -117, -117, -117, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, 0, 0, 0, -117, 0, 0, 0, 0, -117, -117, -117, 0, -117, -117, // State 794 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -457, 0, 0, 0, 0, 0, 0, -457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 795 - -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, 0, -195, 0, -195, -195, -195, -195, -195, 0, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, -195, 0, 0, 0, -195, -195, -195, -195, -195, -195, 0, -195, 0, 0, 0, 0, 0, 0, 0, 0, -195, 0, 0, -195, -195, 0, -195, 0, -195, -195, 0, 0, 0, -195, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, -195, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 796 - -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, 0, -189, 0, -189, -189, -189, -189, -189, 0, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, -189, 0, 0, 0, -189, -189, -189, -189, -189, -189, 0, -189, 0, 0, 0, 0, 0, 0, 0, 0, -189, 0, 0, -189, -189, 0, -189, 0, -189, -189, 0, 0, 0, -189, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, -189, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 797 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, -677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 798 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 863, 0, 0, 0, 0, 0, 0, 0, 0, 0, -662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 799 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 865, 0, 0, 0, 0, 0, 0, 0, 0, 0, -690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 800 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -885, 0, 0, -885, 0, -885, 0, -885, 0, 0, -885, -885, 0, -885, -885, 0, -885, 0, 0, 0, 0, 0, -885, -885, -885, 0, -885, 0, 0, -885, 0, -885, 0, 0, 0, 0, -885, 0, 0, -885, 0, 0, 0, 0, -885, 0, -885, 0, -885, 0, -885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -885, -885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -885, -885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 801 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 867, 0, 0, 0, 0, 0, 0, 0, 0, 0, -702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 802 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, 0, 0, 0, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 803 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, 0, -228, 0, -228, -228, -228, -228, -228, 0, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, 0, 0, 0, -228, -228, -228, -228, -228, -228, 0, -228, 0, 0, 0, 0, 0, 0, 0, 0, -228, 0, 0, -228, -228, 0, -228, 0, -228, -228, 0, 0, 0, -228, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, -228, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 804 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 893, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 805 - -270, 0, 0, 0, 0, 0, -270, 0, -270, 0, 0, 0, -270, 0, 0, -270, 0, 0, 0, -270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -270, 0, -270, -270, -270, -270, 0, 0, 0, 0, 0, -270, -270, -270, -270, 0, -270, -270, -270, -270, 0, 0, 0, 0, -270, -270, -270, -270, -270, 0, 0, -270, -270, -270, -270, 0, -270, -270, -270, -270, -270, -270, -270, -270, -270, 0, 0, 0, -270, -270, 0, 0, 0, -270, -270, -270, -270, -270, -270, + -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, 0, -229, 0, -229, -229, -229, -229, -229, 0, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, 0, 0, 0, -229, -229, -229, -229, -229, -229, 0, -229, 0, 0, 0, 0, 0, 0, 0, 0, -229, 0, 0, -229, -229, 0, -229, 0, -229, -229, 0, 0, 0, -229, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229, -229, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 806 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 807 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, -727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 808 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, 0, -732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 809 - -907, 0, 0, 0, 0, 0, -907, 0, -907, 0, 0, 0, -907, 0, 0, -907, 0, 0, 0, -907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -907, 0, -907, -907, -907, -907, 0, 0, 0, 0, 0, -907, -907, -907, -907, 0, -907, -907, -907, -907, 0, 0, 0, 0, -907, -907, -907, -907, -907, 0, 0, -907, -907, -907, -907, 0, -907, -907, -907, -907, -907, -907, -907, -907, -907, 0, 0, 0, -907, -907, 0, 0, 0, -907, -907, -907, -907, -907, -907, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 898, 0, 0, 0, 0, 0, 0, 0, 0, 0, -750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 810 - -264, 0, 0, 0, 0, 0, -264, 0, -264, 0, 0, 0, -264, 0, 0, -264, 0, 0, 0, -264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -264, 0, -264, -264, -264, -264, 0, 0, 0, 0, 0, -264, -264, -264, -264, 0, -264, -264, -264, -264, 0, 0, 0, 0, -264, -264, -264, -264, -264, 0, 0, -264, -264, -264, -264, 0, -264, -264, -264, -264, -264, -264, -264, -264, -264, 0, 0, 0, -264, -264, 0, 0, 0, -264, -264, -264, -264, -264, -264, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 811 - -267, 0, 0, 0, 0, 0, -267, 0, -267, 0, 0, 0, -267, 0, 0, -267, 0, 0, 0, -267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -267, 0, -267, -267, -267, -267, 0, 0, 0, 0, 0, -267, -267, -267, -267, 0, -267, -267, -267, -267, 0, 0, 0, 0, -267, -267, -267, -267, -267, 0, 0, -267, -267, -267, -267, 0, -267, -267, -267, -267, -267, -267, -267, -267, -267, 0, 0, 0, -267, -267, 0, 0, 0, -267, -267, -267, -267, -267, -267, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 900, 0, 0, 0, 0, 0, 0, 0, 0, 0, -747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 812 - 0, 0, 0, 0, 0, 0, -877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -877, 0, 0, 0, 0, 0, 0, -877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 813 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -795, 0, 0, 0, 0, 0, -795, 0, -795, 0, 0, 0, -795, 0, 0, -795, 0, 0, 0, -795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -795, 0, -795, -795, -795, -795, 0, 0, 0, 0, 0, -795, -795, -795, -795, 0, -795, -795, -795, -795, 0, 0, 0, 0, -795, -795, -795, -795, -795, 0, 0, -795, -795, -795, -795, 0, -795, -795, -795, -795, -795, -795, -795, -795, -795, 0, 0, 0, -795, 0, 0, 0, 0, -795, -795, -795, -795, -795, -795, // State 814 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -279, -279, -279, -279, -279, -279, -279, 0, -279, -279, -279, -279, -279, -279, -279, -279, -279, 0, -279, 0, -279, -279, -279, -279, -279, 0, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -279, -275, -279, -279, 0, 0, 0, -279, 0, -279, -279, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, -279, -279, 0, 0, 0, -279, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 815 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 816 - -406, 0, 0, 0, 0, 0, -406, 0, -406, 0, 0, 0, -406, 0, 0, -406, 0, 0, 0, -406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -406, 0, -406, -406, -406, -406, 0, 0, 0, 0, 0, -406, -406, -406, -406, 0, -406, -406, -406, -406, 0, 0, 0, 0, -406, -406, -406, -406, -406, 0, 0, -406, -406, -406, -406, 0, -406, -406, -406, -406, -406, -406, -406, -406, -406, 0, 0, 0, -406, -406, 0, 0, 0, -406, -406, -406, -406, -406, -406, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 817 - 0, 0, 0, 0, 0, 0, 0, -630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 818 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -728, 0, 0, 0, 0, 0, 0, -728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -235, -235, -235, -235, -235, -235, -235, 0, -235, -235, -235, -235, -235, -235, -235, -235, -235, 0, -235, 0, -235, -235, -235, -235, -235, 0, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -235, -206, -235, -235, 0, 0, 0, -235, 0, -235, -235, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, -235, -235, 0, 0, 0, -235, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 819 - 0, 0, 0, 0, 0, 0, 0, -629, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -232, -232, -232, -232, -232, -232, -232, 0, -232, -232, -232, -232, -232, -232, -232, -232, -232, 0, -232, 0, -232, -232, -232, -232, -232, 0, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -232, -203, -232, -232, 0, 0, 0, -232, 0, -232, -232, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, 0, -232, -232, 0, 0, 0, -232, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 820 - 0, 0, 0, 0, 0, 0, 0, -793, 0, 0, 0, 0, 0, 0, -793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -226, -226, -226, -226, -226, -226, -226, 0, -226, -226, -226, -226, -226, -226, -226, -226, -226, 0, -226, 0, -226, -226, -226, -226, -226, 0, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -226, -197, -226, -226, 0, 0, 0, -226, 0, -226, -226, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -226, 0, -226, -226, 0, 0, 0, -226, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, -226, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 821 - 0, 0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -223, -223, -223, -223, -223, -223, -223, 0, -223, -223, -223, -223, -223, -223, -223, -223, -223, 0, -223, 0, -223, -223, -223, -223, -223, 0, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -223, -194, -223, -223, 0, 0, 0, -223, 0, -223, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -223, 0, -223, -223, 0, 0, 0, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 822 - 0, 0, 0, 0, 0, 0, 0, -352, 0, 0, 0, 0, 0, 0, -352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -236, -236, -236, -236, -236, -236, -236, 0, -236, -236, -236, -236, -236, -236, -236, -236, -236, 0, -236, 0, -236, -236, -236, -236, -236, 0, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -236, -207, -236, -236, 0, 0, 0, -236, 0, -236, -236, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, -236, -236, 0, 0, 0, -236, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 823 - 0, 0, 0, 0, 0, 0, 0, 891, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -222, -222, -222, -222, -222, -222, -222, 0, -222, -222, -222, -222, -222, -222, -222, -222, -222, 0, -222, 0, -222, -222, -222, -222, -222, 0, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, -193, -222, -222, 0, 0, 0, -222, 0, -222, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, -222, -222, 0, 0, 0, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 824 - -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 825 - -426, 0, 0, 0, 0, 0, -426, 0, -426, 0, 0, 0, -426, 0, 0, -426, 0, 0, 0, -426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -426, 0, -426, -426, -426, -426, 0, 0, 0, 0, 0, -426, -426, -426, -426, 0, -426, -426, -426, -426, 287, 892, 0, 0, -426, -426, -426, -426, -426, 0, 0, -426, -426, -426, -426, 0, -426, -426, -426, -426, -426, -426, -426, -426, -426, 0, 0, 0, -426, -426, 0, 0, 0, -426, -426, -426, -426, -426, -426, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 826 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 827 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, + -310, 0, 0, 0, 0, 0, -310, 0, -310, 0, 0, 0, -310, 0, 0, -310, 0, 0, 0, -310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -310, 0, -310, -310, -310, -310, 0, 0, 0, 0, 0, -310, -310, -310, -310, 0, -310, -310, -310, -310, 0, 0, 0, 0, -310, -310, -310, -310, -310, 0, 0, -310, -310, -310, -310, 0, -310, -310, -310, -310, -310, -310, -310, -310, -310, 0, 0, 0, -310, -310, 0, 0, 0, -310, -310, -310, -310, -310, -310, // State 828 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 829 - -825, 0, 0, 0, 0, 0, -825, 0, -825, 0, 0, 0, -825, 0, 0, -825, 0, 0, 0, -825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -825, 0, -825, -825, -825, -825, 0, 0, 0, 0, 0, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, -825, 0, 0, -825, -825, -825, -825, 0, -825, -825, -825, -825, -825, -825, -825, -825, -825, 0, 0, 0, -825, -825, 0, 0, 0, -825, -825, -825, -825, -825, -825, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 830 - 896, 0, 0, 0, 0, 0, -130, 0, -130, 0, 0, 0, -130, 0, 0, -130, 0, 0, 0, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -130, -130, -130, -130, 0, 0, 0, 0, 0, -130, 0, -130, -130, 0, 0, -130, 0, -130, 0, 0, 0, 0, 0, -130, -130, 0, -130, 0, 0, -130, 0, -130, -130, 0, -130, -130, -130, 0, -130, 0, 0, -130, -130, 0, 0, 0, -130, 0, 0, 0, 0, -130, -130, -130, -130, -130, -130, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 831 - -822, 0, 0, 0, 0, 0, -822, 0, -822, 0, 0, 0, -822, 0, 0, -822, 0, 0, 0, -822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -822, 0, -822, -822, -822, -822, 0, 0, 0, 0, 0, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, -822, 0, 0, -822, -822, -822, -822, 0, -822, -822, -822, -822, -822, -822, -822, -822, -822, 0, 0, 0, -822, -822, 0, 0, 0, -822, -822, -822, -822, -822, -822, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 832 - -359, 0, 0, 0, 0, 0, -359, 0, -359, 0, 0, 0, -359, 0, 0, -359, 0, 0, 0, -359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -359, 0, -359, -359, -359, -359, 0, 0, 0, 0, 0, -359, -359, -359, -359, 0, -359, -359, -359, -359, 0, -359, -359, -359, -359, -359, -359, -359, -359, 0, 0, -359, -359, -359, -359, 0, -359, -359, -359, -359, -359, -359, -359, -359, -359, 0, 0, 0, -359, -359, 0, 0, 0, -359, -359, -359, -359, -359, -359, + 0, 0, 0, 0, 0, 0, 0, -935, 0, 0, 0, 0, 0, 0, -935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, -935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 833 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -678, 0, 0, 0, 0, 0, 0, 918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 834 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -652, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 835 - -363, 0, 0, 0, 0, 0, -363, 0, -363, 0, 0, 0, -363, 0, 0, -363, 0, 0, 0, -363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -363, 0, -363, -363, -363, -363, 0, 0, 0, 0, 0, -363, -363, -363, -363, 0, -363, -363, -363, -363, 0, -363, -363, -363, -363, -363, -363, -363, -363, 0, 0, -363, -363, -363, -363, 0, -363, -363, -363, -363, -363, -363, -363, -363, -363, 0, 0, 0, -363, -363, 0, 0, 0, -363, -363, -363, -363, -363, -363, + 0, 0, 0, 0, 0, 0, 0, -571, 0, 0, 0, 0, 0, 0, -571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 836 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 837 - 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -591, 0, 0, 0, 0, 0, 0, -591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 838 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -776, 0, 0, 0, 0, 0, 0, -776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 839 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 840 - 0, 0, 0, 0, 0, 0, -803, 0, -803, 0, 0, 0, -803, 0, 0, -803, 0, 0, 0, -803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -803, 0, -803, -803, -803, -803, 0, 0, 0, 0, 0, -803, -803, -803, -803, 0, -803, -803, -803, -803, 0, 0, 0, 0, -803, -803, -803, -803, -803, 0, 0, -803, -803, -803, -803, 0, -803, -803, -803, -803, -803, -803, -803, -803, -803, 0, 0, 0, -803, -803, 0, 0, 0, -803, -803, -803, -803, -803, -803, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 841 - 901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -564, 0, 0, 0, 0, 0, 0, -564, 0, 0, 0, 0, 0, 0, -564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 842 - -870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 843 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 844 - 0, -239, -239, 0, -239, 0, -239, 0, -239, -239, 0, 0, -239, 0, -239, -239, 0, 0, -239, 0, -239, -239, 0, 0, -243, 0, 0, -239, -239, 0, -239, 0, -239, -239, -239, -239, 0, -239, 0, 0, 0, 0, -239, 0, -239, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, -239, -239, 0, 0, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 845 - 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, 0, 0, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 846 - 0, -199, -199, 0, -199, 0, -199, 0, -199, -199, 0, 0, -199, 0, -199, -199, 0, 0, -199, 0, -199, -199, 0, 0, -226, 0, 0, -199, -199, 0, -199, 0, -199, -199, -199, -199, 0, -199, 0, 0, 0, 0, -199, 0, -199, 0, -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -199, 0, -199, -199, 0, 0, 0, -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 847 - 0, -196, -196, 0, -196, 0, -196, 0, -196, -196, 0, 0, -196, 0, -196, -196, 0, 0, -196, 0, -196, -196, 0, 0, -223, 0, 0, -196, -196, 0, -196, 0, -196, -196, -196, -196, 0, -196, 0, 0, 0, 0, -196, 0, -196, 0, -196, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -196, 0, -196, -196, 0, 0, 0, -196, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 848 - 0, -190, -190, 0, -190, 0, -190, 0, -190, -190, 0, 0, -190, 0, -190, -190, 0, 0, -190, 0, -190, -190, 0, 0, -217, 0, 0, -190, -190, 0, -190, 0, -190, -190, -190, -190, 0, -190, 0, 0, 0, 0, -190, 0, -190, 0, -190, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, 0, -190, -190, 0, 0, 0, -190, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 849 - 0, 0, 0, 0, 0, 0, 0, -531, 0, 0, 0, 0, 0, 0, -531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -921, 0, 0, 0, 0, 0, 0, 0, 0, 0, -921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 850 - 0, -187, -187, 0, -187, 0, -187, 0, -187, -187, 0, 0, -187, 0, -187, -187, 0, 0, -187, 0, -187, -187, 0, 0, -894, 0, 0, -187, -187, 0, -187, 0, -187, -187, -187, -187, 0, -187, 0, 0, 0, 0, -187, 0, -187, 0, -187, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, 0, -187, -187, 0, 0, 0, -187, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 851 - 0, 0, 0, 0, 0, 0, 0, -891, 0, 0, 0, 0, 0, 0, -891, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, // State 852 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -922, 0, 0, 0, 0, 0, 0, 0, 0, 0, -922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 853 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 854 - 0, -200, -200, 0, -200, 0, -200, 0, -200, -200, 0, 0, -200, 0, -200, -200, 0, 0, -200, 0, -200, -200, 0, 0, -227, 0, 0, -200, -200, 0, -200, 0, -200, -200, -200, -200, 0, -200, 0, 0, 0, 0, -200, 0, -200, 0, -200, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 0, -200, -200, 0, 0, 0, -200, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, // State 855 - 0, -186, -186, 0, -186, 0, -186, 0, -186, -186, 0, 0, -186, 0, -186, -186, 0, 0, -186, 0, -186, -186, 0, 0, -215, 0, 0, -186, -186, 0, -186, 0, -186, -186, -186, -186, 0, -186, 0, 0, 0, 0, -186, 0, -186, 0, -186, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, -186, -186, 0, 0, 0, -186, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 856 - 0, -203, -203, 0, -203, 0, -203, 0, -203, -203, 0, 0, -203, 0, -203, -203, 0, 0, -203, 0, -203, -203, 0, 0, -230, 0, 0, -203, -203, 0, -203, 0, -203, -203, -203, -203, 0, -203, 0, 0, 0, 0, -203, 0, -203, 0, -203, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -203, 0, -203, -203, 0, 0, 0, -203, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 930, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 857 - 0, -205, -205, 0, -205, 0, -205, 0, -205, -205, 0, 0, -205, 0, -205, -205, 0, 0, -205, 0, -205, -205, 0, 0, -232, 0, 0, -205, -205, 0, -205, 0, -205, -205, -205, -205, 0, -205, 0, 0, 0, 0, -205, 0, -205, 0, -205, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -205, 0, -205, -205, 0, 0, 0, -205, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, -205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -876, 0, 0, 0, 0, 0, -876, 0, -876, 0, 0, 0, -876, 0, 0, -876, 0, 0, 0, -876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -876, 0, -876, -876, -876, -876, 0, 0, 0, 0, 0, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, -876, 0, 0, -876, -876, -876, -876, 0, -876, -876, -876, -876, -876, -876, -876, -876, -876, 0, 0, 0, -876, -876, 0, 0, 0, -876, -876, -876, -876, -876, -876, // State 858 - 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 932, 0, 0, 0, 0, 0, -132, 0, -132, 0, 0, 0, -132, 0, 0, -132, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132, 0, 0, 0, 0, 0, -132, 0, -132, -132, 0, 0, -132, 0, -132, 0, 0, 0, 0, 0, -132, -132, 0, -132, 0, 0, -132, 0, -132, -132, 0, -132, -132, -132, 0, -132, 0, 0, -132, -132, 0, 0, 0, -132, 0, 0, 0, 0, -132, -132, -132, -132, -132, -132, // State 859 - -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, 0, -191, 0, -191, -191, -191, -191, -191, 0, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, -191, 0, 0, 0, -191, -191, -191, -191, -191, -191, 0, -191, 0, 0, 0, 0, 0, 0, 0, 0, -191, 0, 0, -191, -191, 0, -191, 0, -191, -191, 0, 0, 0, -191, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, -191, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -400, 0, 0, 0, 0, 0, -400, 0, -400, 0, 0, 0, -400, 0, 0, -400, 0, 0, 0, -400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -400, 0, -400, -400, -400, -400, 0, 0, 0, 0, 0, -400, -400, -400, -400, 0, -400, -400, -400, -400, 0, -400, -400, -400, -400, -400, -400, -400, -400, 0, 0, -400, -400, -400, -400, 0, -400, -400, -400, -400, -400, -400, -400, -400, -400, 0, 0, 0, -400, -400, 0, 0, 0, -400, -400, -400, -400, -400, -400, // State 860 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 917, 0, 0, 0, 0, 0, 0, 0, 0, 0, -668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -404, 0, 0, 0, 0, 0, -404, 0, -404, 0, 0, 0, -404, 0, 0, -404, 0, 0, 0, -404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -404, 0, -404, -404, -404, -404, 0, 0, 0, 0, 0, -404, -404, -404, -404, 0, -404, -404, -404, -404, 0, -404, -404, -404, -404, -404, -404, -404, -404, 0, 0, -404, -404, -404, -404, 0, -404, -404, -404, -404, -404, -404, -404, -404, -404, 0, 0, 0, -404, -404, 0, 0, 0, -404, -404, -404, -404, -404, -404, // State 861 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 919, 0, 0, 0, 0, 0, 0, 0, 0, 0, -659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 862 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 863 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 920, 0, 0, 0, 0, 0, 0, 0, 0, 0, -691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -942, 0, 0, 0, 0, 0, -942, 0, -942, 0, 0, 0, -942, 0, 0, -942, 0, 0, 0, -942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -942, 0, -942, -942, -942, -942, 0, 0, 0, 0, 0, -942, -942, -942, -942, 0, -942, -942, -942, -942, 0, 944, 0, 0, -942, -942, -942, -942, -942, 0, 0, -942, -942, -942, -942, 0, -942, -942, -942, -942, -942, -942, -942, -942, -942, 0, 0, 0, -942, -942, 0, 0, 0, -942, -942, -942, -942, -942, -942, // State 864 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -280, -280, 0, -280, 0, -280, 0, -280, -280, 0, 0, -280, 0, -280, -280, 0, 0, -280, 0, -280, -280, 0, 0, -284, 0, 0, -280, -280, 0, -280, 0, -280, -280, -280, -280, 0, 0, -280, 0, 0, 0, 0, -280, 0, -280, 0, -280, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, -280, -280, 0, 0, 0, -280, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 865 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, -681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 866 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -788, -788, 0, -788, 0, 0, 0, -788, 0, 0, 0, -788, 0, -788, -788, 0, 0, 0, 0, -788, -788, 0, 0, -790, 0, 0, -788, -788, 0, -788, 0, -788, -788, -788, -788, 0, 0, -788, 0, 0, 0, 0, 0, 0, -788, 0, -788, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -788, 0, -788, -788, 0, 0, 0, -788, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, -788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 867 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, -410, 0, 0, -408, 0, 0, -408, 0, -408, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, -408, -408, 0, 0, 0, -408, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 868 - -266, 0, 0, 0, 0, 0, -266, 0, -266, 0, 0, 0, -266, 0, 0, -266, 0, 0, 0, -266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -266, 0, -266, -266, -266, -266, 0, 0, 0, 0, 0, -266, -266, -266, -266, 0, -266, -266, -266, -266, 0, 0, 0, 0, -266, -266, -266, -266, -266, 0, 0, -266, -266, -266, -266, 0, -266, -266, -266, -266, -266, -266, -266, -266, -266, 0, 0, 0, -266, -266, 0, 0, 0, -266, -266, -266, -266, -266, -266, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 869 - -269, 0, 0, 0, 0, 0, -269, 0, -269, 0, 0, 0, -269, 0, 0, -269, 0, 0, 0, -269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -269, 0, -269, -269, -269, -269, 0, 0, 0, 0, 0, -269, -269, -269, -269, 0, -269, -269, -269, -269, 0, 0, 0, 0, -269, -269, -269, -269, -269, 0, 0, -269, -269, -269, -269, 0, -269, -269, -269, -269, -269, -269, -269, -269, -269, 0, 0, 0, -269, -269, 0, 0, 0, -269, -269, -269, -269, -269, -269, + 0, -881, -881, 0, -881, 0, 0, 0, -881, 0, 0, 0, -881, 0, -881, -881, 0, 0, 0, 0, -881, -881, 0, 0, -883, 0, 0, -881, -881, 0, -881, 0, -881, -881, -881, -881, 0, 0, -881, 0, 0, 0, 0, 0, 0, -881, 0, -881, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -881, 0, -881, -881, 0, 0, 0, -881, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, -881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 870 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -944, 0, 0, 0, 0, 0, 0, 0, 0, 0, -947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 871 - -408, 0, 0, 0, 0, 0, -408, 0, -408, 0, 0, 0, -408, 0, 0, -408, 0, 0, 0, -408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -408, 0, -408, -408, -408, -408, 0, 0, 0, 0, 0, -408, -408, -408, -408, 0, -408, -408, -408, -408, 0, 0, 0, 0, -408, -408, -408, -408, -408, 0, 0, -408, -408, -408, -408, 0, -408, -408, -408, -408, -408, -408, -408, -408, -408, 0, 0, 0, -408, -408, 0, 0, 0, -408, -408, -408, -408, -408, -408, + 0, 0, 0, 0, 0, 0, 0, -943, 0, 0, 0, 0, 0, 0, -943, 0, 0, 0, 0, 0, 0, 0, 0, 0, -943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 872 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, 0, 0, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 873 - -398, 0, 0, 0, 0, 0, -398, 0, -398, 0, 0, 0, -398, 0, 0, -398, 0, 0, 0, -398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -398, 0, -398, -398, -398, -398, 0, 0, 0, 0, 0, -398, -398, -398, -398, 0, -398, -398, -398, -398, 0, 0, 0, 0, -398, -398, -398, -398, -398, 0, 0, -398, -398, -398, -398, 0, -398, -398, -398, -398, -398, -398, -398, -398, -398, 0, 0, 0, -398, -398, 0, 0, 0, -398, -398, -398, -398, -398, -398, + -962, 0, 0, 0, 0, 0, -962, 0, -962, 0, 0, 0, -962, 0, 0, -962, 0, 0, 0, -962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -962, 0, -962, -962, -962, -962, 0, 0, 0, 0, 0, -962, -962, -962, -962, 0, -962, -962, -962, -962, 0, 0, 0, 0, -962, -962, -962, -962, -962, 0, 0, -962, -962, -962, -962, 0, -962, -962, -962, -962, -962, -962, -962, -962, -962, 0, 0, 0, -962, -962, 0, 0, 0, -962, -962, -962, -962, -962, -962, // State 874 - -263, 0, 0, 0, 0, 0, -263, 0, -263, 0, 0, 0, -263, 0, 0, -263, 0, 0, 0, -263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -263, 0, -263, -263, -263, -263, 0, 0, 0, 0, 0, -263, -263, -263, -263, 0, -263, -263, -263, -263, 0, 0, 0, 0, -263, -263, -263, -263, -263, 0, 0, -263, -263, -263, -263, 0, -263, -263, -263, -263, -263, -263, -263, -263, -263, 0, 0, 0, -263, -263, 0, 0, 0, -263, -263, -263, -263, -263, -263, + 0, -965, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, -967, 0, 0, -965, 0, 0, -965, 0, -965, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -965, 0, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -965, 0, -965, -965, 0, 0, 0, -965, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, -965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 875 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 876 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 948, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 877 - 0, 0, 0, 0, 0, 0, -876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -876, 0, 0, 0, 0, 0, 0, -876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -230, -230, 0, -230, 0, -230, 0, -230, -230, 0, 0, -230, 0, -230, -230, 0, 0, -230, 0, -230, -230, 0, 0, -257, 0, 0, -230, -230, 0, -230, 0, -230, -230, -230, -230, 0, 0, -230, 0, 0, 0, 0, -230, 0, -230, 0, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, 0, -230, -230, 0, 0, 0, -230, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 878 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -224, -224, 0, -224, 0, -224, 0, -224, -224, 0, 0, -224, 0, -224, -224, 0, 0, -224, 0, -224, -224, 0, 0, -949, 0, 0, -224, -224, 0, -224, 0, -224, -224, -224, -224, 0, 0, -224, 0, 0, 0, 0, -224, 0, -224, 0, -224, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, 0, -224, -224, 0, 0, 0, -224, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, -224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 879 - -405, 0, 0, 0, 0, 0, -405, 0, -405, 0, 0, 0, -405, 0, 0, -405, 0, 0, 0, -405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -405, 0, -405, -405, -405, -405, 0, 0, 0, 0, 0, -405, -405, -405, -405, 0, -405, -405, -405, -405, 0, 0, 0, 0, -405, -405, -405, -405, -405, 0, 0, -405, -405, -405, -405, 0, -405, -405, -405, -405, -405, -405, -405, -405, -405, 0, 0, 0, -405, -405, 0, 0, 0, -405, -405, -405, -405, -405, -405, + 0, 0, 0, 0, 0, 0, 0, 953, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 880 - 0, 0, 0, 0, 0, 0, 0, -880, 0, 0, 0, 0, 0, 0, -880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 881 - 0, 0, 0, 0, 0, 0, 0, -611, 0, 0, 0, 0, 0, 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -234, -234, 0, -234, 0, -234, 0, -234, -234, 0, 0, -234, 0, -234, -234, 0, 0, -234, 0, -234, -234, 0, 0, -261, 0, 0, -234, -234, 0, -234, 0, -234, -234, -234, -234, 0, 0, -234, 0, 0, 0, 0, -234, 0, -234, 0, -234, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, -234, -234, 0, 0, 0, -234, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 882 - 0, 0, 0, 0, 0, 0, 0, -525, 0, 0, 0, 0, 0, 0, -525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 883 - 0, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, -545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -220, -220, 0, -220, 0, -220, 0, -220, -220, 0, 0, -220, 0, -220, -220, 0, 0, -220, 0, -220, -220, 0, 0, -249, 0, 0, -220, -220, 0, -220, 0, -220, -220, -220, -220, 0, 0, -220, 0, 0, 0, 0, -220, 0, -220, 0, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, -220, -220, 0, 0, 0, -220, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, -220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 884 - 0, 0, 0, 0, 0, 0, 0, -628, 0, 0, 0, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 885 - 0, 0, 0, 0, 0, 0, 0, -623, 0, 0, 0, 0, 0, 0, 940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 886 - 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -237, -237, 0, -237, 0, -237, 0, -237, -237, 0, 0, -237, 0, -237, -237, 0, 0, -237, 0, -237, -237, 0, 0, -264, 0, 0, -237, -237, 0, -237, 0, -237, -237, -237, -237, 0, 0, -237, 0, 0, 0, 0, -237, 0, -237, 0, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, -237, -237, 0, 0, 0, -237, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, -237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 887 - -392, 0, 0, 0, 0, 0, -392, 0, -392, 0, 0, 0, -392, 0, 0, -392, 0, 0, 0, -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -392, 0, -392, -392, -392, -392, 0, 0, 0, 0, 0, -392, -392, -392, -392, 0, -392, -392, -392, -392, 0, 942, 0, 0, -392, -392, -392, -392, -392, 0, 0, -392, -392, -392, -392, 0, -392, -392, -392, -392, -392, -392, -392, -392, -392, 0, 0, 0, -392, -392, 0, 0, 0, -392, -392, -392, -392, -392, -392, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 888 - -516, 0, 0, 0, 0, 0, 0, -516, 0, 0, 0, 0, 0, 0, -516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -240, -240, 0, -240, 0, -240, 0, -240, -240, 0, 0, -240, 0, -240, -240, 0, 0, -240, 0, -240, -240, 0, 0, -267, 0, 0, -240, -240, 0, -240, 0, -240, -240, -240, -240, 0, 0, -240, 0, 0, 0, 0, -240, 0, -240, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, -240, -240, 0, 0, 0, -240, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, -240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 889 - -519, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -239, -239, -239, -239, -239, -239, -239, 0, -239, -239, -239, -239, -239, -239, -239, -239, -239, 0, -239, 0, -239, -239, -239, -239, -239, 0, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -210, -239, -239, 0, 0, 0, -239, 0, -239, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, -239, -239, 0, 0, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 890 - -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -241, -241, -241, -241, -241, -241, -241, 0, -241, -241, -241, -241, -241, -241, -241, -241, -241, 0, -241, 0, -241, -241, -241, -241, -241, 0, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, -212, -241, -241, 0, 0, 0, -241, 0, -241, -241, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, -241, -241, 0, 0, 0, -241, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 891 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 892 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, 0, -231, 0, -231, -231, -231, -231, -231, 0, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, 0, 0, 0, -231, -231, -231, -231, -231, -231, 0, -231, 0, 0, 0, 0, 0, 0, 0, 0, -231, 0, 0, -231, -231, 0, -231, 0, -231, -231, 0, 0, 0, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 893 - -514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, 0, -225, 0, -225, -225, -225, -225, -225, 0, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, 0, 0, 0, -225, -225, -225, -225, -225, -225, 0, -225, 0, 0, 0, 0, 0, 0, 0, 0, -225, 0, 0, -225, -225, 0, -225, 0, -225, -225, 0, 0, 0, -225, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, -225, -225, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 894 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, -724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 895 - -823, 0, 0, 0, 0, 0, -823, 0, -823, 0, 0, 0, -823, 0, 0, -823, 0, 0, 0, -823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -823, 0, -823, -823, -823, -823, 0, 0, 0, 0, 0, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, -823, 0, 0, -823, -823, -823, -823, 0, -823, -823, -823, -823, -823, -823, -823, -823, -823, 0, 0, 0, -823, -823, 0, 0, 0, -823, -823, -823, -823, -823, -823, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 963, 0, 0, 0, 0, 0, 0, 0, 0, 0, -709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 896 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, -737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 897 - -356, 0, 0, 0, 0, 0, -356, 0, -356, 0, 0, 0, -356, 0, 0, -356, 0, 0, 0, -356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -356, 0, -356, -356, -356, -356, 0, 0, 0, 0, 0, -356, -356, -356, -356, 0, -356, -356, -356, -356, 0, -356, -356, -356, -356, -356, -356, -356, -356, 0, 0, -356, -356, -356, -356, 0, -356, -356, -356, -356, -356, -356, -356, -356, -356, 0, 0, 0, -356, -356, 0, 0, 0, -356, -356, -356, -356, -356, -356, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 898 - -860, 0, 0, 0, 0, 0, -860, 0, -860, 0, 0, 0, -860, 0, 0, -860, 0, 0, 0, -860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -860, 0, -860, -860, -860, -860, 0, 0, 0, 0, 0, -860, -860, -860, -860, 0, -860, -860, -860, -860, 0, 0, 0, 0, -860, -860, -860, -860, -860, 0, 0, -860, -860, -860, -860, 0, -860, -860, -860, -860, -860, -860, -860, -860, -860, 0, 0, 0, -860, -860, 0, 0, 0, -860, -860, -860, -860, -860, -860, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 967, 0, 0, 0, 0, 0, 0, 0, 0, 0, -749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 899 - 978, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 900 - 0, 0, 0, 0, 0, 0, -801, 0, -801, 0, 0, 0, -801, 0, 0, -801, 0, 0, 0, -801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -801, 0, -801, -801, -801, -801, 0, 0, 0, 0, 0, -801, -801, -801, -801, 0, -801, -801, -801, -801, 0, 0, 0, 0, -801, -801, -801, -801, -801, 0, 0, -801, -801, -801, -801, 0, -801, -801, -801, -801, -801, -801, -801, -801, -801, 0, 0, 0, -801, -801, 0, 0, 0, -801, -801, -801, -801, -801, -801, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 901 - 980, 0, 0, 0, 0, 0, -129, 0, -129, 0, 0, 0, -129, 0, 0, -129, 0, 0, 0, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, -129, -129, -129, 0, 0, 0, 0, 0, -129, 0, -129, -129, 0, 0, -129, 0, -129, 0, 0, 0, 0, 0, -129, -129, 0, -129, 0, 0, -129, 0, -129, -129, 0, -129, -129, -129, 0, -129, 0, 0, -129, -129, 0, 0, 0, -129, 0, 0, 0, 0, -129, -129, -129, -129, -129, -129, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 902 - 0, 0, 0, 0, 0, 0, -804, 0, -804, 0, 0, 0, -804, 0, 0, -804, 0, 0, 0, -804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -804, 0, -804, -804, -804, -804, 0, 0, 0, 0, 0, -804, -804, -804, -804, 0, -804, -804, -804, -804, 0, 0, 0, 0, -804, -804, -804, -804, -804, 0, 0, -804, -804, -804, -804, 0, -804, -804, -804, -804, -804, -804, -804, -804, -804, 0, 0, 0, -804, -804, 0, 0, 0, -804, -804, -804, -804, -804, -804, + -312, 0, 0, 0, 0, 0, -312, 0, -312, 0, 0, 0, -312, 0, 0, -312, 0, 0, 0, -312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -312, 0, -312, -312, -312, -312, 0, 0, 0, 0, 0, -312, -312, -312, -312, 0, -312, -312, -312, -312, 0, 0, 0, 0, -312, -312, -312, -312, -312, 0, 0, -312, -312, -312, -312, 0, -312, -312, -312, -312, -312, -312, -312, -312, -312, 0, 0, 0, -312, -312, 0, 0, 0, -312, -312, -312, -312, -312, -312, // State 903 - 982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 904 - -826, 0, 0, 0, 0, 0, -826, 0, -826, 0, 0, 0, -826, 0, 0, -826, 0, 0, 0, -826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -826, 0, -826, -826, -826, -826, 0, 0, 0, 0, 0, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, -826, 0, 0, -826, -826, -826, -826, 0, -826, -826, -826, -826, -826, -826, -826, -826, -826, 0, 0, 0, -826, -826, 0, 0, 0, -826, -826, -826, -826, -826, -826, + -228, -228, -228, -228, -228, -228, -228, 0, -228, -228, -228, -228, -228, -228, -228, -228, -228, 0, -228, 0, -228, -228, -228, -228, -228, 0, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -228, -199, -228, -228, 0, 0, 0, -228, 0, -228, -228, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, 0, -228, -228, 0, 0, 0, -228, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 905 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -831, 0, 0, 0, 0, 0, 0, 0, 0, 0, -836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 973, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 906 - 0, 0, 0, 0, 0, 0, 0, -890, 0, 0, 0, 0, 0, 0, -890, 0, 0, 0, 0, 0, 0, 0, 0, 0, -890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -229, -229, -229, -229, -229, -229, -229, 0, -229, -229, -229, -229, -229, -229, -229, -229, -229, 0, -229, 0, -229, -229, -229, -229, -229, 0, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -229, -200, -229, -229, 0, 0, 0, -229, 0, -229, -229, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229, 0, -229, -229, 0, 0, 0, -229, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 907 - 0, -192, -192, 0, -192, 0, -192, 0, -192, -192, 0, 0, -192, 0, -192, -192, 0, 0, -192, 0, -192, -192, 0, 0, -219, 0, 0, -192, -192, 0, -192, 0, -192, -192, -192, -192, 0, -192, 0, 0, 0, 0, -192, 0, -192, 0, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, -192, -192, 0, 0, 0, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 908 - 0, 0, 0, 0, 0, 0, 0, 985, 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 909 - 0, -193, -193, 0, -193, 0, -193, 0, -193, -193, 0, 0, -193, 0, -193, -193, 0, 0, -193, 0, -193, -193, 0, 0, -220, 0, 0, -193, -193, 0, -193, 0, -193, -193, -193, -193, 0, -193, 0, 0, 0, 0, -193, 0, -193, 0, -193, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 0, -193, -193, 0, 0, 0, -193, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -961, 0, 0, 0, 0, 0, -961, 0, -961, 0, 0, 0, -961, 0, 0, -961, 0, 0, 0, -961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -961, 0, -961, -961, -961, -961, 0, 0, 0, 0, 0, -961, -961, -961, -961, 0, -961, -961, -961, -961, 0, 0, 0, 0, -961, -961, -961, -961, -961, 0, 0, -961, -961, -961, -961, 0, -961, -961, -961, -961, -961, -961, -961, -961, -961, 0, 0, 0, -961, -961, 0, 0, 0, -961, -961, -961, -961, -961, -961, // State 910 - 0, 0, 0, 0, 0, 0, 0, 987, 0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -306, 0, 0, 0, 0, 0, -306, 0, -306, 0, 0, 0, -306, 0, 0, -306, 0, 0, 0, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -306, 0, -306, -306, -306, -306, 0, 0, 0, 0, 0, -306, -306, -306, -306, 0, -306, -306, -306, -306, 0, 0, 0, 0, -306, -306, -306, -306, -306, 0, 0, -306, -306, -306, -306, 0, -306, -306, -306, -306, -306, -306, -306, -306, -306, 0, 0, 0, -306, -306, 0, 0, 0, -306, -306, -306, -306, -306, -306, // State 911 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -309, 0, 0, 0, 0, 0, -309, 0, -309, 0, 0, 0, -309, 0, 0, -309, 0, 0, 0, -309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -309, 0, -309, -309, -309, -309, 0, 0, 0, 0, 0, -309, -309, -309, -309, 0, -309, -309, -309, -309, 0, 0, 0, 0, -309, -309, -309, -309, -309, 0, 0, -309, -309, -309, -309, 0, -309, -309, -309, -309, -309, -309, -309, -309, -309, 0, 0, 0, -309, -309, 0, 0, 0, -309, -309, -309, -309, -309, -309, // State 912 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -931, 0, 0, 0, 0, 0, 0, -931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 913 - 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 914 - 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 915 - 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 916 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -452, 0, 0, 0, 0, 0, -452, 0, -452, 0, 0, 0, -452, 0, 0, -452, 0, 0, 0, -452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -452, 0, -452, -452, -452, -452, 0, 0, 0, 0, 0, -452, -452, -452, -452, 0, -452, -452, -452, -452, 0, 0, 0, 0, -452, -452, -452, -452, -452, 0, 0, -452, -452, -452, -452, 0, -452, -452, -452, -452, -452, -452, -452, -452, -452, 0, 0, 0, -452, -452, 0, 0, 0, -452, -452, -452, -452, -452, -452, // State 917 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 989, 0, 0, 0, 0, 0, 0, 0, 0, 0, -665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 918 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, 0, -775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 919 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -676, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 920 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, -682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -845, 0, 0, 0, 0, 0, 0, -845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 921 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 0, 0, 0, 0, 0, -678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 922 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 994, 0, 0, 0, 0, 0, 0, 0, 0, 0, -663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -394, 0, 0, 0, 0, 0, 0, -394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 923 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 993, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 924 - -400, 0, 0, 0, 0, 0, -400, 0, -400, 0, 0, 0, -400, 0, 0, -400, 0, 0, 0, -400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -400, 0, -400, -400, -400, -400, 0, 0, 0, 0, 0, -400, -400, -400, -400, 0, -400, -400, -400, -400, 0, 0, 0, 0, -400, -400, -400, -400, -400, 0, 0, -400, -400, -400, -400, 0, -400, -400, -400, -400, -400, -400, -400, -400, -400, 0, 0, 0, -400, -400, 0, 0, 0, -400, -400, -400, -400, -400, -400, + -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 925 - -265, 0, 0, 0, 0, 0, -265, 0, -265, 0, 0, 0, -265, 0, 0, -265, 0, 0, 0, -265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -265, 0, -265, -265, -265, -265, 0, 0, 0, 0, 0, -265, -265, -265, -265, 0, -265, -265, -265, -265, 0, 0, 0, 0, -265, -265, -265, -265, -265, 0, 0, -265, -265, -265, -265, 0, -265, -265, -265, -265, -265, -265, -265, -265, -265, 0, 0, 0, -265, -265, 0, 0, 0, -265, -265, -265, -265, -265, -265, + -473, 0, 0, 0, 0, 0, -473, 0, -473, 0, 0, 0, -473, 0, 0, -473, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -473, 0, -473, -473, -473, -473, 0, 0, 0, 0, 0, -473, -473, -473, -473, 0, -473, -473, -473, -473, 323, 994, 0, 0, -473, -473, -473, -473, -473, 0, 0, -473, -473, -473, -473, 0, -473, -473, -473, -473, -473, -473, -473, -473, -473, 0, 0, 0, -473, -473, 0, 0, 0, -473, -473, -473, -473, -473, -473, // State 926 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 927 - -407, 0, 0, 0, 0, 0, -407, 0, -407, 0, 0, 0, -407, 0, 0, -407, 0, 0, 0, -407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -407, 0, -407, -407, -407, -407, 0, 0, 0, 0, 0, -407, -407, -407, -407, 0, -407, -407, -407, -407, 0, 0, 0, 0, -407, -407, -407, -407, -407, 0, 0, -407, -407, -407, -407, 0, -407, -407, -407, -407, -407, -407, -407, -407, -407, 0, 0, 0, -407, -407, 0, 0, 0, -407, -407, -407, -407, -407, -407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, // State 928 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, // State 929 - -397, 0, 0, 0, 0, 0, -397, 0, -397, 0, 0, 0, -397, 0, 0, -397, 0, 0, 0, -397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -397, 0, -397, -397, -397, -397, 0, 0, 0, 0, 0, -397, -397, -397, -397, 0, -397, -397, -397, -397, 0, 0, 0, 0, -397, -397, -397, -397, -397, 0, 0, -397, -397, -397, -397, 0, -397, -397, -397, -397, -397, -397, -397, -397, -397, 0, 0, 0, -397, -397, 0, 0, 0, -397, -397, -397, -397, -397, -397, + -877, 0, 0, 0, 0, 0, -877, 0, -877, 0, 0, 0, -877, 0, 0, -877, 0, 0, 0, -877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -877, 0, -877, -877, -877, -877, 0, 0, 0, 0, 0, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, -877, 0, 0, -877, -877, -877, -877, 0, -877, -877, -877, -877, -877, -877, -877, -877, -877, 0, 0, 0, -877, -877, 0, 0, 0, -877, -877, -877, -877, -877, -877, // State 930 - -390, 0, 0, 0, 0, 0, -390, 0, -390, 0, 0, 0, -390, 0, 0, -390, 0, 0, 0, -390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -390, 0, -390, -390, -390, -390, 0, 0, 0, 0, 0, -390, -390, -390, -390, 0, -390, -390, -390, -390, 0, 999, 0, 0, -390, -390, -390, -390, -390, 0, 0, -390, -390, -390, -390, 0, -390, -390, -390, -390, -390, -390, -390, -390, -390, 0, 0, 0, -390, -390, 0, 0, 0, -390, -390, -390, -390, -390, -390, + 998, 0, 0, 0, 0, 0, -133, 0, -133, 0, 0, 0, -133, 0, 0, -133, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133, 0, 0, 0, 0, 0, -133, 0, -133, -133, 0, 0, -133, 0, -133, 0, 0, 0, 0, 0, -133, -133, 0, -133, 0, 0, -133, 0, -133, -133, 0, -133, -133, -133, 0, -133, 0, 0, -133, -133, 0, 0, 0, -133, 0, 0, 0, 0, -133, -133, -133, -133, -133, -133, // State 931 - -402, 0, 0, 0, 0, 0, -402, 0, -402, 0, 0, 0, -402, 0, 0, -402, 0, 0, 0, -402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -402, 0, -402, -402, -402, -402, 0, 0, 0, 0, 0, -402, -402, -402, -402, 0, -402, -402, -402, -402, 0, 0, 0, 0, -402, -402, -402, -402, -402, 0, 0, -402, -402, -402, -402, 0, -402, -402, -402, -402, -402, -402, -402, -402, -402, 0, 0, 0, -402, -402, 0, 0, 0, -402, -402, -402, -402, -402, -402, + -874, 0, 0, 0, 0, 0, -874, 0, -874, 0, 0, 0, -874, 0, 0, -874, 0, 0, 0, -874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -874, 0, -874, -874, -874, -874, 0, 0, 0, 0, 0, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, -874, 0, 0, -874, -874, -874, -874, 0, -874, -874, -874, -874, -874, -874, -874, -874, -874, 0, 0, 0, -874, -874, 0, 0, 0, -874, -874, -874, -874, -874, -874, // State 932 - 0, 0, 0, 0, 0, 0, 0, -608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -401, 0, 0, 0, 0, 0, -401, 0, -401, 0, 0, 0, -401, 0, 0, -401, 0, 0, 0, -401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -401, 0, -401, -401, -401, -401, 0, 0, 0, 0, 0, -401, -401, -401, -401, 0, -401, -401, -401, -401, 0, -401, -401, -401, -401, -401, -401, -401, -401, 0, 0, -401, -401, -401, -401, 0, -401, -401, -401, -401, -401, -401, -401, -401, -401, 0, 0, 0, -401, -401, 0, 0, 0, -401, -401, -401, -401, -401, -401, // State 933 - 0, 0, 0, 0, 0, 0, 0, -602, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 934 - 0, 0, 0, 0, 0, 0, 0, -607, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 935 - 0, 0, 0, 0, 0, 0, 0, -625, 0, 0, 0, 0, 0, 0, 1004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -405, 0, 0, 0, 0, 0, -405, 0, -405, 0, 0, 0, -405, 0, 0, -405, 0, 0, 0, -405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -405, 0, -405, -405, -405, -405, 0, 0, 0, 0, 0, -405, -405, -405, -405, 0, -405, -405, -405, -405, 0, -405, -405, -405, -405, -405, -405, -405, -405, 0, 0, -405, -405, -405, -405, 0, -405, -405, -405, -405, -405, -405, -405, -405, -405, 0, 0, 0, -405, -405, 0, 0, 0, -405, -405, -405, -405, -405, -405, // State 936 - 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 937 - 0, 0, 0, 0, 0, 0, 0, -792, 0, 0, 0, 0, 0, 0, -792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 938 - 0, 0, 0, 0, 0, 0, 0, -622, 0, 0, 0, 0, 0, 0, 1006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 939 - 0, 0, 0, 0, 0, 0, 0, -615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 940 - 0, 0, 0, 0, 0, 0, 0, -351, 0, 0, 0, 0, 0, 0, -351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -855, 0, -855, 0, 0, 0, -855, 0, 0, -855, 0, 0, 0, -855, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -855, 0, -855, -855, -855, -855, 0, 0, 0, 0, 0, -855, -855, -855, -855, 0, -855, -855, -855, -855, 0, 0, 0, 0, -855, -855, -855, -855, -855, 0, 0, -855, -855, -855, -855, 0, -855, -855, -855, -855, -855, -855, -855, -855, -855, 0, 0, 0, -855, -855, 0, 0, 0, -855, -855, -855, -855, -855, -855, // State 941 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 942 - -432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 943 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 944 - -423, 0, 0, 0, 0, 0, -423, 0, -423, 0, 0, 0, -423, 0, 0, -423, 0, 0, 0, -423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -423, 0, -423, -423, -423, -423, 0, 0, 0, 0, 0, -423, -423, -423, -423, 0, -423, -423, -423, -423, 0, 0, 0, 0, -423, -423, -423, -423, -423, 0, 0, -423, -423, -423, -423, 0, -423, -423, -423, -423, -423, -423, -423, -423, -423, 0, 0, 0, -423, -423, 0, 0, 0, -423, -423, -423, -423, -423, -423, + 0, -279, -279, 0, -279, 0, -279, 0, -279, -279, 0, 0, -279, 0, -279, -279, 0, 0, -279, 0, -279, -279, 0, 0, -283, 0, 0, -279, -279, 0, -279, 0, -279, -279, -279, -279, 0, 0, -279, 0, 0, 0, 0, -279, 0, -279, 0, -279, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, -279, -279, 0, 0, 0, -279, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 945 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, 0, 0, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 946 - -487, 0, 0, 0, 0, 0, -487, 0, -487, 0, 0, 0, -487, 0, 0, -487, 0, 0, 0, -487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, 0, -487, -487, -487, -487, 0, 0, 0, 0, 0, -487, -487, -487, -487, 0, -487, -487, -487, -487, 0, 0, 0, 0, -487, -487, -487, -487, -487, 0, 0, -487, -487, -487, -487, 0, -487, -487, -487, -487, -487, -487, -487, -487, -487, 0, 0, 0, -487, -487, 0, 0, 0, -487, -487, -487, -487, -487, -487, + 0, -235, -235, 0, -235, 0, -235, 0, -235, -235, 0, 0, -235, 0, -235, -235, 0, 0, -235, 0, -235, -235, 0, 0, -262, 0, 0, -235, -235, 0, -235, 0, -235, -235, -235, -235, 0, 0, -235, 0, 0, 0, 0, -235, 0, -235, 0, -235, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, -235, -235, 0, 0, 0, -235, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, -235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 947 - 0, 0, 0, 0, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -463, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -463, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, + 0, -232, -232, 0, -232, 0, -232, 0, -232, -232, 0, 0, -232, 0, -232, -232, 0, 0, -232, 0, -232, -232, 0, 0, -259, 0, 0, -232, -232, 0, -232, 0, -232, -232, -232, -232, 0, 0, -232, 0, 0, 0, 0, -232, 0, -232, 0, -232, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, 0, -232, -232, 0, 0, 0, -232, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, -232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 948 - 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -462, 0, -462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -226, -226, 0, -226, 0, -226, 0, -226, -226, 0, 0, -226, 0, -226, -226, 0, 0, -226, 0, -226, -226, 0, 0, -253, 0, 0, -226, -226, 0, -226, 0, -226, -226, -226, -226, 0, 0, -226, 0, 0, 0, 0, -226, 0, -226, 0, -226, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -226, 0, -226, -226, 0, 0, 0, -226, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, -226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 949 - 0, 0, 0, 0, 0, 0, 0, -731, 0, 0, 0, 0, 0, 0, -731, 0, 0, 0, 0, 0, 0, 0, 0, 0, -731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -578, 0, 0, 0, 0, 0, 0, -578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 950 - 0, 0, 0, 0, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -286, 0, -286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -223, -223, 0, -223, 0, -223, 0, -223, -223, 0, 0, -223, 0, -223, -223, 0, 0, -223, 0, -223, -223, 0, 0, -948, 0, 0, -223, -223, 0, -223, 0, -223, -223, -223, -223, 0, 0, -223, 0, 0, 0, 0, -223, 0, -223, 0, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -223, 0, -223, -223, 0, 0, 0, -223, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 951 - 0, 0, 0, 0, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -291, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -291, 0, -291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -945, 0, 0, 0, 0, 0, 0, -945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 952 - 0, 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, -538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 0, -538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 953 - 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, -333, 0, -333, -333, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 954 - 0, 0, 0, 0, 0, 0, 0, -334, 0, 0, 0, 0, -334, 0, -334, -334, 0, 0, 0, 0, 0, 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -334, 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -334, 0, -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -236, -236, 0, -236, 0, -236, 0, -236, -236, 0, 0, -236, 0, -236, -236, 0, 0, -236, 0, -236, -236, 0, 0, -263, 0, 0, -236, -236, 0, -236, 0, -236, -236, -236, -236, 0, 0, -236, 0, 0, 0, 0, -236, 0, -236, 0, -236, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, -236, -236, 0, 0, 0, -236, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 955 - 0, 0, 0, 0, 0, 0, -484, -262, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, -484, 0, 0, 0, 0, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -222, -222, 0, -222, 0, -222, 0, -222, -222, 0, 0, -222, 0, -222, -222, 0, 0, -222, 0, -222, -222, 0, 0, -251, 0, 0, -222, -222, 0, -222, 0, -222, -222, -222, -222, 0, 0, -222, 0, 0, 0, 0, -222, 0, -222, 0, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, -222, -222, 0, 0, 0, -222, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, -222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 956 - 0, 0, 0, 0, 0, 0, 0, -285, 0, 0, 0, 0, 0, 0, -285, 0, 0, 0, 0, 0, 0, 0, 0, 0, -285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -285, 0, 0, 0, -285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -285, 0, -285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -239, -239, 0, -239, 0, -239, 0, -239, -239, 0, 0, -239, 0, -239, -239, 0, 0, -239, 0, -239, -239, 0, 0, -266, 0, 0, -239, -239, 0, -239, 0, -239, -239, -239, -239, 0, 0, -239, 0, 0, 0, 0, -239, 0, -239, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, -239, -239, 0, 0, 0, -239, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, -239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 957 - 0, 0, 0, 0, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -290, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -290, 0, -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -241, -241, 0, -241, 0, -241, 0, -241, -241, 0, 0, -241, 0, -241, -241, 0, 0, -241, 0, -241, -241, 0, 0, -268, 0, 0, -241, -241, 0, -241, 0, -241, -241, -241, -241, 0, 0, -241, 0, 0, 0, 0, -241, 0, -241, 0, -241, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, -241, -241, 0, 0, 0, -241, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, -241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 958 - 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -370, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 959 - 0, 0, 0, 0, 0, 0, 350, -886, 0, 0, 0, 0, 0, 0, -886, 0, 0, 0, 351, 0, 0, 0, 0, 0, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -886, 0, 0, 0, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -886, 0, -886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, 0, -227, 0, -227, -227, -227, -227, -227, 0, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, 0, 0, 0, -227, -227, -227, -227, -227, -227, 0, -227, 0, 0, 0, 0, 0, 0, 0, 0, -227, 0, 0, -227, -227, 0, -227, 0, -227, -227, 0, 0, 0, -227, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, -227, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 960 - 0, 0, 0, 0, 0, 0, 0, -732, 0, 0, 0, 0, 0, 0, -732, 0, 0, 0, 0, 0, 0, 0, 0, 0, -732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -732, 0, 0, 0, 352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1019, 0, 0, 0, 0, 0, 0, 0, 0, 0, -715, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 961 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, -738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1021, 0, 0, 0, 0, 0, 0, 0, 0, 0, -706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 962 - 0, 0, 0, 0, 0, 0, 0, -289, 0, 0, 0, 0, 0, 0, -289, 0, 0, 0, 0, 0, 0, 0, 0, 0, -289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -289, 0, 0, 0, -289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -289, 0, -289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 963 - 0, 0, 0, 0, 0, 0, 0, -287, 0, 0, 0, 0, 0, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, 0, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -287, 0, -287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1022, 0, 0, 0, 0, 0, 0, 0, 0, 0, -738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 964 - 0, 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, -539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, -539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 965 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, -737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, -728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 966 - 0, 0, 0, 0, 0, 0, 0, -288, 0, 0, 0, 0, 0, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, 0, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288, 0, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 967 - 0, 0, 0, 0, 0, 0, 0, -460, 0, 0, 0, 0, 0, 0, -460, 0, 0, 0, 0, 0, 0, 0, 0, 0, -460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -460, 0, 0, 0, -460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -460, 0, -460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 968 - 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -458, 0, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -308, 0, 0, 0, 0, 0, -308, 0, -308, 0, 0, 0, -308, 0, 0, -308, 0, 0, 0, -308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -308, 0, -308, -308, -308, -308, 0, 0, 0, 0, 0, -308, -308, -308, -308, 0, -308, -308, -308, -308, 0, 0, 0, 0, -308, -308, -308, -308, -308, 0, 0, -308, -308, -308, -308, 0, -308, -308, -308, -308, -308, -308, -308, -308, -308, 0, 0, 0, -308, -308, 0, 0, 0, -308, -308, -308, -308, -308, -308, // State 969 - 0, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -459, 0, -459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -311, 0, 0, 0, 0, 0, -311, 0, -311, 0, 0, 0, -311, 0, 0, -311, 0, 0, 0, -311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -311, 0, -311, -311, -311, -311, 0, 0, 0, 0, 0, -311, -311, -311, -311, 0, -311, -311, -311, -311, 0, 0, 0, 0, -311, -311, -311, -311, -311, 0, 0, -311, -311, -311, -311, 0, -311, -311, -311, -311, -311, -311, -311, -311, -311, 0, 0, 0, -311, -311, 0, 0, 0, -311, -311, -311, -311, -311, -311, // State 970 - -490, 0, 0, 0, 0, 0, -490, 0, -490, 0, 0, 0, -490, 0, 0, -490, 0, 0, 0, -490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -490, 0, -490, -490, -490, -490, 0, 0, 0, 0, 0, -490, -490, -490, -490, 0, -490, -490, -490, -490, 0, 0, 0, 0, -490, -490, -490, -490, -490, 0, 0, -490, -490, -490, -490, 0, -490, -490, -490, -490, -490, -490, -490, -490, -490, 0, 0, 0, -490, -490, 0, 0, 0, -490, -490, -490, -490, -490, -490, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 971 - -853, 0, 0, 0, 0, 0, -853, 0, -853, 0, 0, 0, -853, 0, 0, -853, 0, 0, 0, -853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -853, 0, -853, -853, -853, -853, 0, 0, 0, 0, 0, -853, -853, -853, -853, 0, -853, -853, -853, -853, 0, 0, 0, 1031, -853, -853, -853, -853, -853, 0, 0, -853, -853, -853, -853, 0, -853, -853, -853, -853, -853, -853, -853, -853, -853, 0, 0, 0, -853, -853, 0, 0, 0, -853, -853, -853, -853, -853, -853, + -454, 0, 0, 0, 0, 0, -454, 0, -454, 0, 0, 0, -454, 0, 0, -454, 0, 0, 0, -454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -454, 0, -454, -454, -454, -454, 0, 0, 0, 0, 0, -454, -454, -454, -454, 0, -454, -454, -454, -454, 0, 0, 0, 0, -454, -454, -454, -454, -454, 0, 0, -454, -454, -454, -454, 0, -454, -454, -454, -454, -454, -454, -454, -454, -454, 0, 0, 0, -454, -454, 0, 0, 0, -454, -454, -454, -454, -454, -454, // State 972 - -854, 0, 0, 0, 0, 0, -854, 0, -854, 0, 0, 0, -854, 0, 0, -854, 0, 0, 0, -854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -854, 0, -854, -854, -854, -854, 0, 0, 0, 0, 0, -854, -854, -854, -854, 0, -854, -854, -854, -854, 0, 0, 0, 0, -854, -854, -854, -854, -854, 0, 0, -854, -854, -854, -854, 0, -854, -854, -854, -854, -854, -854, -854, -854, -854, 0, 0, 0, -854, -854, 0, 0, 0, -854, -854, -854, -854, -854, -854, + -231, -231, -231, -231, -231, -231, -231, 0, -231, -231, -231, -231, -231, -231, -231, -231, -231, 0, -231, 0, -231, -231, -231, -231, -231, 0, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -231, -202, -231, -231, 0, 0, 0, -231, 0, -231, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, 0, -231, -231, 0, 0, 0, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 973 - -857, 0, 0, 0, 0, 0, -857, 0, -857, 0, 0, 0, -857, 0, 0, -857, 0, 0, 0, -857, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -857, 0, -857, -857, -857, -857, 0, 0, 0, 0, 0, -857, -857, -857, -857, 0, -857, -857, -857, -857, 0, 0, 0, 1032, -857, -857, -857, -857, -857, 0, 0, -857, -857, -857, -857, 0, -857, -857, -857, -857, -857, -857, -857, -857, -857, 0, 0, 0, -857, -857, 0, 0, 0, -857, -857, -857, -857, -857, -857, + -225, -225, -225, -225, -225, -225, -225, 0, -225, -225, -225, -225, -225, -225, -225, -225, -225, 0, -225, 0, -225, -225, -225, -225, -225, 0, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -225, -196, -225, -225, 0, 0, 0, -225, 0, -225, -225, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -225, 0, -225, -225, 0, 0, 0, -225, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, -225, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 974 - -858, 0, 0, 0, 0, 0, -858, 0, -858, 0, 0, 0, -858, 0, 0, -858, 0, 0, 0, -858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -858, 0, -858, -858, -858, -858, 0, 0, 0, 0, 0, -858, -858, -858, -858, 0, -858, -858, -858, -858, 0, 0, 0, 0, -858, -858, -858, -858, -858, 0, 0, -858, -858, -858, -858, 0, -858, -858, -858, -858, -858, -858, -858, -858, -858, 0, 0, 0, -858, -858, 0, 0, 0, -858, -858, -858, -858, -858, -858, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 975 - -355, 0, 0, 0, 0, 0, -355, 0, -355, 0, 0, 0, -355, 0, 0, -355, 0, 0, 0, -355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -355, 0, -355, -355, -355, -355, 0, 0, 0, 0, 0, -355, -355, -355, -355, 0, -355, -355, -355, -355, 0, -355, -355, -355, -355, -355, -355, -355, -355, 0, 0, -355, -355, -355, -355, 0, -355, -355, -355, -355, -355, -355, -355, -355, -355, 0, 0, 0, -355, -355, 0, 0, 0, -355, -355, -355, -355, -355, -355, + -444, 0, 0, 0, 0, 0, -444, 0, -444, 0, 0, 0, -444, 0, 0, -444, 0, 0, 0, -444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -444, 0, -444, -444, -444, -444, 0, 0, 0, 0, 0, -444, -444, -444, -444, 0, -444, -444, -444, -444, 0, 0, 0, 0, -444, -444, -444, -444, -444, 0, 0, -444, -444, -444, -444, 0, -444, -444, -444, -444, -444, -444, -444, -444, -444, 0, 0, 0, -444, -444, 0, 0, 0, -444, -444, -444, -444, -444, -444, // State 976 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -305, 0, 0, 0, 0, 0, -305, 0, -305, 0, 0, 0, -305, 0, 0, -305, 0, 0, 0, -305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305, 0, -305, -305, -305, -305, 0, 0, 0, 0, 0, -305, -305, -305, -305, 0, -305, -305, -305, -305, 0, 0, 0, 0, -305, -305, -305, -305, -305, 0, 0, -305, -305, -305, -305, 0, -305, -305, -305, -305, -305, -305, -305, -305, -305, 0, 0, 0, -305, -305, 0, 0, 0, -305, -305, -305, -305, -305, -305, // State 977 - 0, 0, 0, 0, 0, 0, -802, 0, -802, 0, 0, 0, -802, 0, 0, -802, 0, 0, 0, -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -802, 0, -802, -802, -802, -802, 0, 0, 0, 0, 0, -802, -802, -802, -802, 0, -802, -802, -802, -802, 0, 0, 0, 0, -802, -802, -802, -802, -802, 0, 0, -802, -802, -802, -802, 0, -802, -802, -802, -802, -802, -802, -802, -802, -802, 0, 0, 0, -802, -802, 0, 0, 0, -802, -802, -802, -802, -802, -802, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 978 - 1035, 0, 0, 0, 0, 0, -130, 0, -130, 0, 0, 0, -130, 0, 0, -130, 0, 0, 0, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -130, -130, -130, -130, 0, 0, 0, 0, 0, -130, 0, -130, -130, 0, 0, -130, 0, -130, 0, 0, 0, 0, 0, -130, -130, 0, -130, 0, 0, -130, 0, -130, -130, 0, -130, -130, -130, 0, -130, 0, 0, -130, -130, 0, 0, 0, -130, 0, 0, 0, 0, -130, -130, -130, -130, -130, -130, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 979 - 0, 0, 0, 0, 0, 0, -799, 0, -799, 0, 0, 0, -799, 0, 0, -799, 0, 0, 0, -799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -799, 0, -799, -799, -799, -799, 0, 0, 0, 0, 0, -799, -799, -799, -799, 0, -799, -799, -799, -799, 0, 0, 0, 0, -799, -799, -799, -799, -799, 0, 0, -799, -799, -799, -799, 0, -799, -799, -799, -799, -799, -799, -799, -799, -799, 0, 0, 0, -799, -799, 0, 0, 0, -799, -799, -799, -799, -799, -799, + 0, 0, 0, 0, 0, 0, -930, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -930, 0, 0, 0, 0, 0, 0, -930, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 980 - 1036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 981 - 0, 0, 0, 0, 0, 0, -807, 0, -807, 0, 0, 0, -807, 0, 0, -807, 0, 0, 0, -807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -807, 0, -807, -807, -807, -807, 0, 0, 0, 0, 0, -807, -807, -807, -807, 0, -807, -807, -807, -807, 0, 0, 0, 0, -807, -807, -807, -807, -807, 0, 0, -807, -807, -807, -807, 0, -807, -807, -807, -807, -807, -807, -807, -807, -807, 0, 0, 0, -807, -807, 0, 0, 0, -807, -807, -807, -807, -807, -807, + -451, 0, 0, 0, 0, 0, -451, 0, -451, 0, 0, 0, -451, 0, 0, -451, 0, 0, 0, -451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -451, 0, -451, -451, -451, -451, 0, 0, 0, 0, 0, -451, -451, -451, -451, 0, -451, -451, -451, -451, 0, 0, 0, 0, -451, -451, -451, -451, -451, 0, 0, -451, -451, -451, -451, 0, -451, -451, -451, -451, -451, -451, -451, -451, -451, 0, 0, 0, -451, -451, 0, 0, 0, -451, -451, -451, -451, -451, -451, // State 982 - 1038, 0, 0, 0, 0, 0, -129, 0, -129, 0, 0, 0, -129, 0, 0, -129, 0, 0, 0, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, -129, -129, -129, 0, 0, 0, 0, 0, -129, 0, -129, -129, 0, 0, -129, 0, -129, 0, 0, 0, 0, 0, -129, -129, 0, -129, 0, 0, -129, 0, -129, -129, 0, -129, -129, -129, 0, -129, 0, 0, -129, -129, 0, 0, 0, -129, 0, 0, 0, 0, -129, -129, -129, -129, -129, -129, + 0, 0, 0, 0, 0, 0, 0, -934, 0, 0, 0, 0, 0, 0, -934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 983 - -887, 0, 0, 0, 0, 0, -887, 0, -887, 0, 0, 0, -887, 0, 0, -887, 0, 0, 0, -887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -887, 0, -887, -887, -887, -887, 0, 0, 0, 0, 0, -887, -887, -887, -887, 0, -887, -887, -887, -887, 0, 0, 0, 0, -887, -887, -887, -887, -887, 0, 0, -887, -887, -887, -887, 0, -887, -887, -887, -887, -887, -887, -887, -887, -887, 0, 0, 0, -887, -887, 0, 0, 0, -887, -887, -887, -887, -887, -887, + 0, 0, 0, 0, 0, 0, 0, -658, 0, 0, 0, 0, 0, 0, 1036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 984 - 0, -195, -195, 0, -195, 0, -195, 0, -195, -195, 0, 0, -195, 0, -195, -195, 0, 0, -195, 0, -195, -195, 0, 0, -222, 0, 0, -195, -195, 0, -195, 0, -195, -195, -195, -195, 0, -195, 0, 0, 0, 0, -195, 0, -195, 0, -195, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, 0, -195, -195, 0, 0, 0, -195, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -572, 0, 0, 0, 0, 0, 0, -572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 985 - 0, -189, -189, 0, -189, 0, -189, 0, -189, -189, 0, 0, -189, 0, -189, -189, 0, 0, -189, 0, -189, -189, 0, 0, -216, 0, 0, -189, -189, 0, -189, 0, -189, -189, -189, -189, 0, -189, 0, 0, 0, 0, -189, 0, -189, 0, -189, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, 0, -189, -189, 0, 0, 0, -189, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -592, 0, 0, 0, 0, 0, 0, -592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 986 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -675, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 987 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -670, 0, 0, 0, 0, 0, 0, 1043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 988 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 989 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, -679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -438, 0, 0, 0, 0, 0, -438, 0, -438, 0, 0, 0, -438, 0, 0, -438, 0, 0, 0, -438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -438, 0, -438, -438, -438, -438, 0, 0, 0, 0, 0, -438, -438, -438, -438, 0, -438, -438, -438, -438, 0, 1045, 0, 0, -438, -438, -438, -438, -438, 0, 0, -438, -438, -438, -438, 0, -438, -438, -438, -438, -438, -438, -438, -438, -438, 0, 0, 0, -438, -438, 0, 0, 0, -438, -438, -438, -438, -438, -438, // State 990 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1043, 0, 0, 0, 0, 0, 0, 0, 0, 0, -664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -563, 0, 0, 0, 0, 0, 0, -563, 0, 0, 0, 0, 0, 0, -563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 991 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1044, 0, 0, 0, 0, 0, 0, 0, 0, 0, -669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -566, 0, 0, 0, 0, 0, 0, -566, 0, 0, 0, 0, 0, 0, -566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 992 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1046, 0, 0, 0, 0, 0, 0, 0, 0, 0, -660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 993 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 994 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 995 - -399, 0, 0, 0, 0, 0, -399, 0, -399, 0, 0, 0, -399, 0, 0, -399, 0, 0, 0, -399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -399, 0, -399, -399, -399, -399, 0, 0, 0, 0, 0, -399, -399, -399, -399, 0, -399, -399, -399, -399, 0, 0, 0, 0, -399, -399, -399, -399, -399, 0, 0, -399, -399, -399, -399, 0, -399, -399, -399, -399, -399, -399, -399, -399, -399, 0, 0, 0, -399, -399, 0, 0, 0, -399, -399, -399, -399, -399, -399, + -561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 996 - -404, 0, 0, 0, 0, 0, -404, 0, -404, 0, 0, 0, -404, 0, 0, -404, 0, 0, 0, -404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -404, 0, -404, -404, -404, -404, 0, 0, 0, 0, 0, -404, -404, -404, -404, 0, -404, -404, -404, -404, 0, 0, 0, 0, -404, -404, -404, -404, -404, 0, 0, -404, -404, -404, -404, 0, -404, -404, -404, -404, -404, -404, -404, -404, -404, 0, 0, 0, -404, -404, 0, 0, 0, -404, -404, -404, -404, -404, -404, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -527, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 997 - -394, 0, 0, 0, 0, 0, -394, 0, -394, 0, 0, 0, -394, 0, 0, -394, 0, 0, 0, -394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -394, 0, -394, -394, -394, -394, 0, 0, 0, 0, 0, -394, -394, -394, -394, 0, -394, -394, -394, -394, 0, 0, 0, 0, -394, -394, -394, -394, -394, 0, 0, -394, -394, -394, -394, 0, -394, -394, -394, -394, -394, -394, -394, -394, -394, 0, 0, 0, -394, -394, 0, 0, 0, -394, -394, -394, -394, -394, -394, + -875, 0, 0, 0, 0, 0, -875, 0, -875, 0, 0, 0, -875, 0, 0, -875, 0, 0, 0, -875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -875, 0, -875, -875, -875, -875, 0, 0, 0, 0, 0, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, -875, 0, 0, -875, -875, -875, -875, 0, -875, -875, -875, -875, -875, -875, -875, -875, -875, 0, 0, 0, -875, -875, 0, 0, 0, -875, -875, -875, -875, -875, -875, // State 998 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 999 - -401, 0, 0, 0, 0, 0, -401, 0, -401, 0, 0, 0, -401, 0, 0, -401, 0, 0, 0, -401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -401, 0, -401, -401, -401, -401, 0, 0, 0, 0, 0, -401, -401, -401, -401, 0, -401, -401, -401, -401, 0, 0, 0, 0, -401, -401, -401, -401, -401, 0, 0, -401, -401, -401, -401, 0, -401, -401, -401, -401, -401, -401, -401, -401, -401, 0, 0, 0, -401, -401, 0, 0, 0, -401, -401, -401, -401, -401, -401, + -398, 0, 0, 0, 0, 0, -398, 0, -398, 0, 0, 0, -398, 0, 0, -398, 0, 0, 0, -398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -398, 0, -398, -398, -398, -398, 0, 0, 0, 0, 0, -398, -398, -398, -398, 0, -398, -398, -398, -398, 0, -398, -398, -398, -398, -398, -398, -398, -398, 0, 0, -398, -398, -398, -398, 0, -398, -398, -398, -398, -398, -398, -398, -398, -398, 0, 0, 0, -398, -398, 0, 0, 0, -398, -398, -398, -398, -398, -398, // State 1000 - 0, 0, 0, 0, 0, 0, 0, -599, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -914, 0, 0, 0, 0, 0, -914, 0, -914, 0, 0, 0, -914, 0, 0, -914, 0, 0, 0, -914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -914, 0, -914, -914, -914, -914, 0, 0, 0, 0, 0, -914, -914, -914, -914, 0, -914, -914, -914, -914, 0, 0, 0, 0, -914, -914, -914, -914, -914, 0, 0, -914, -914, -914, -914, 0, -914, -914, -914, -914, -914, -914, -914, -914, -914, 0, 0, 0, -914, -914, 0, 0, 0, -914, -914, -914, -914, -914, -914, // State 1001 - 0, 0, 0, 0, 0, 0, 0, -584, 0, 0, 0, 0, 0, 0, 1052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1002 - 0, 0, 0, 0, 0, 0, 0, -612, 0, 0, 0, 0, 0, 0, 1054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -853, 0, -853, 0, 0, 0, -853, 0, 0, -853, 0, 0, 0, -853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -853, 0, -853, -853, -853, -853, 0, 0, 0, 0, 0, -853, -853, -853, -853, 0, -853, -853, -853, -853, 0, 0, 0, 0, -853, -853, -853, -853, -853, 0, 0, -853, -853, -853, -853, 0, -853, -853, -853, -853, -853, -853, -853, -853, -853, 0, 0, 0, -853, -853, 0, 0, 0, -853, -853, -853, -853, -853, -853, // State 1003 - 0, 0, 0, 0, 0, 0, 0, -617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1083, 0, 0, 0, 0, 0, -132, 0, -132, 0, 0, 0, -132, 0, 0, -132, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132, 0, 0, 0, 0, 0, -132, 0, -132, -132, 0, 0, -132, 0, -132, 0, 0, 0, 0, 0, -132, -132, 0, -132, 0, 0, -132, 0, -132, -132, 0, -132, -132, -132, 0, -132, 0, 0, -132, -132, 0, 0, 0, -132, 0, 0, 0, 0, -132, -132, -132, -132, -132, -132, // State 1004 - 0, 0, 0, 0, 0, 0, 0, -624, 0, 0, 0, 0, 0, 0, 1056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -856, 0, -856, 0, 0, 0, -856, 0, 0, -856, 0, 0, 0, -856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -856, 0, -856, -856, -856, -856, 0, 0, 0, 0, 0, -856, -856, -856, -856, 0, -856, -856, -856, -856, 0, 0, 0, 0, -856, -856, -856, -856, -856, 0, 0, -856, -856, -856, -856, 0, -856, -856, -856, -856, -856, -856, -856, -856, -856, 0, 0, 0, -856, -856, 0, 0, 0, -856, -856, -856, -856, -856, -856, // State 1005 - 0, 0, 0, 0, 0, 0, 0, -614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1086, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1006 - -518, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -878, 0, 0, 0, 0, 0, -878, 0, -878, 0, 0, 0, -878, 0, 0, -878, 0, 0, 0, -878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -878, 0, -878, -878, -878, -878, 0, 0, 0, 0, 0, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, -878, 0, 0, -878, -878, -878, -878, 0, -878, -878, -878, -878, -878, -878, -878, -878, -878, 0, 0, 0, -878, -878, 0, 0, 0, -878, -878, -878, -878, -878, -878, // State 1007 - -425, 0, 0, 0, 0, 0, -425, 0, -425, 0, 0, 0, -425, 0, 0, -425, 0, 0, 0, -425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -425, 0, -425, -425, -425, -425, 0, 0, 0, 0, 0, -425, -425, -425, -425, 0, -425, -425, -425, -425, 0, 0, 0, 0, -425, -425, -425, -425, -425, 0, 0, -425, -425, -425, -425, 0, -425, -425, -425, -425, -425, -425, -425, -425, -425, 0, 0, 0, -425, -425, 0, 0, 0, -425, -425, -425, -425, -425, -425, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -885, 0, 0, 0, 0, 0, 0, 0, 0, 0, -890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1008 - -102, 0, 0, 0, 0, 0, -102, 0, -102, 0, 0, 0, -102, 0, 0, -102, 0, 0, 0, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -102, 0, -102, -102, -102, -102, 0, 0, 0, 0, 0, -102, -102, -102, -102, 0, -102, -102, -102, -102, -102, -102, 0, 0, -102, -102, -102, -102, -102, 0, 0, -102, -102, -102, -102, 0, -102, -102, -102, -102, -102, -102, -102, -102, -102, 0, 0, 0, -102, -102, 0, 0, 0, -102, -102, -102, -102, -102, -102, + 0, 0, 0, 0, 0, 0, 0, -944, 0, 0, 0, 0, 0, 0, -944, 0, 0, 0, 0, 0, 0, 0, 0, 0, -944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1009 - -488, 0, 0, 0, 0, 0, -488, 0, -488, 0, 0, 0, -488, 0, 0, -488, 0, 0, 0, -488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -488, 0, -488, -488, -488, -488, 0, 0, 0, 0, 0, -488, -488, -488, -488, 0, -488, -488, -488, -488, 0, 0, 0, 0, -488, -488, -488, -488, -488, 0, 0, -488, -488, -488, -488, 0, -488, -488, -488, -488, -488, -488, -488, -488, -488, 0, 0, 0, -488, -488, 0, 0, 0, -488, -488, -488, -488, -488, -488, + 0, -228, -228, 0, -228, 0, -228, 0, -228, -228, 0, 0, -228, 0, -228, -228, 0, 0, -228, 0, -228, -228, 0, 0, -255, 0, 0, -228, -228, 0, -228, 0, -228, -228, -228, -228, 0, 0, -228, 0, 0, 0, 0, -228, 0, -228, 0, -228, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, 0, -228, -228, 0, 0, 0, -228, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1010 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1088, 0, 0, 0, 0, 0, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1011 - 0, 0, 0, 0, 0, 0, 0, 1079, 0, 0, 0, 0, 0, 0, 1080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -229, -229, 0, -229, 0, -229, 0, -229, -229, 0, 0, -229, 0, -229, -229, 0, 0, -229, 0, -229, -229, 0, 0, -256, 0, 0, -229, -229, 0, -229, 0, -229, -229, -229, -229, 0, 0, -229, 0, 0, 0, 0, -229, 0, -229, 0, -229, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229, 0, -229, -229, 0, 0, 0, -229, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1012 - 0, 0, 0, 0, 0, 0, 0, -754, 0, 0, 0, 0, 0, 0, -754, 0, 0, 0, 0, 0, 0, 0, 0, 0, -754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -754, 0, 0, 0, -754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -754, 0, -754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1090, 0, 0, 0, 0, 0, 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1013 - 0, 0, 0, 0, 0, 0, 0, -791, 0, 0, 0, 0, 0, 0, -791, 0, 0, 0, 0, 0, 0, 0, 0, 0, -791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -791, 0, 0, 0, -791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -791, 0, -791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1014 - 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, 0, -335, 0, -335, -335, 0, 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, -335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -335, 0, -335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1015 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1083, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1084, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1016 - 0, 0, 0, 0, 0, 0, 0, -759, 0, 0, 0, 0, 0, 0, -759, 0, 0, 0, 0, 0, 0, 0, 0, 0, -759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -759, 0, 0, 0, -759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -759, 0, -759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1017 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, + 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1018 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1019 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1092, 0, 0, 0, 0, 0, 0, 0, 0, 0, -712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1020 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1021 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1022 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, -729, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1023 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, -466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, -725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1024 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1097, 0, 0, 0, 0, 0, 0, 0, 0, 0, -710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1025 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1026 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -446, 0, 0, 0, 0, 0, -446, 0, -446, 0, 0, 0, -446, 0, 0, -446, 0, 0, 0, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -446, 0, -446, -446, -446, -446, 0, 0, 0, 0, 0, -446, -446, -446, -446, 0, -446, -446, -446, -446, 0, 0, 0, 0, -446, -446, -446, -446, -446, 0, 0, -446, -446, -446, -446, 0, -446, -446, -446, -446, -446, -446, -446, -446, -446, 0, 0, 0, -446, -446, 0, 0, 0, -446, -446, -446, -446, -446, -446, // State 1027 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -307, 0, 0, 0, 0, 0, -307, 0, -307, 0, 0, 0, -307, 0, 0, -307, 0, 0, 0, -307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -307, 0, -307, -307, -307, -307, 0, 0, 0, 0, 0, -307, -307, -307, -307, 0, -307, -307, -307, -307, 0, 0, 0, 0, -307, -307, -307, -307, -307, 0, 0, -307, -307, -307, -307, 0, -307, -307, -307, -307, -307, -307, -307, -307, -307, 0, 0, 0, -307, -307, 0, 0, 0, -307, -307, -307, -307, -307, -307, // State 1028 - 0, 0, 0, 0, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -471, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -471, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1029 - -489, 0, 0, 0, 0, 0, -489, 0, -489, 0, 0, 0, -489, 0, 0, -489, 0, 0, 0, -489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -489, 0, -489, -489, -489, -489, 0, 0, 0, 0, 0, -489, -489, -489, -489, 0, -489, -489, -489, -489, 0, 0, 0, 0, -489, -489, -489, -489, -489, 0, 0, -489, -489, -489, -489, 0, -489, -489, -489, -489, -489, -489, -489, -489, -489, 0, 0, 0, -489, -489, 0, 0, 0, -489, -489, -489, -489, -489, -489, + -453, 0, 0, 0, 0, 0, -453, 0, -453, 0, 0, 0, -453, 0, 0, -453, 0, 0, 0, -453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -453, 0, -453, -453, -453, -453, 0, 0, 0, 0, 0, -453, -453, -453, -453, 0, -453, -453, -453, -453, 0, 0, 0, 0, -453, -453, -453, -453, -453, 0, 0, -453, -453, -453, -453, 0, -453, -453, -453, -453, -453, -453, -453, -453, -453, 0, 0, 0, -453, -453, 0, 0, 0, -453, -453, -453, -453, -453, -453, // State 1030 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -227, -227, -227, -227, -227, -227, -227, 0, -227, -227, -227, -227, -227, -227, -227, -227, -227, 0, -227, 0, -227, -227, -227, -227, -227, 0, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -227, -198, -227, -227, 0, 0, 0, -227, 0, -227, -227, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, 0, -227, -227, 0, 0, 0, -227, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1031 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1032 - -360, 0, 0, 0, 0, 0, -360, 0, -360, 0, 0, 0, -360, 0, 0, -360, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -360, 0, -360, -360, -360, -360, 0, 0, 0, 0, 0, -360, -360, -360, -360, 0, -360, -360, -360, -360, 0, -360, -360, -360, -360, -360, -360, -360, -360, 0, 0, -360, -360, -360, -360, 0, -360, -360, -360, -360, -360, -360, -360, -360, -360, 0, 0, 0, -360, -360, 0, 0, 0, -360, -360, -360, -360, -360, -360, + -443, 0, 0, 0, 0, 0, -443, 0, -443, 0, 0, 0, -443, 0, 0, -443, 0, 0, 0, -443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -443, 0, -443, -443, -443, -443, 0, 0, 0, 0, 0, -443, -443, -443, -443, 0, -443, -443, -443, -443, 0, 0, 0, 0, -443, -443, -443, -443, -443, 0, 0, -443, -443, -443, -443, 0, -443, -443, -443, -443, -443, -443, -443, -443, -443, 0, 0, 0, -443, -443, 0, 0, 0, -443, -443, -443, -443, -443, -443, // State 1033 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -436, 0, 0, 0, 0, 0, -436, 0, -436, 0, 0, 0, -436, 0, 0, -436, 0, 0, 0, -436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -436, 0, -436, -436, -436, -436, 0, 0, 0, 0, 0, -436, -436, -436, -436, 0, -436, -436, -436, -436, 0, 1102, 0, 0, -436, -436, -436, -436, -436, 0, 0, -436, -436, -436, -436, 0, -436, -436, -436, -436, -436, -436, -436, -436, -436, 0, 0, 0, -436, -436, 0, 0, 0, -436, -436, -436, -436, -436, -436, // State 1034 - 0, 0, 0, 0, 0, 0, -800, 0, -800, 0, 0, 0, -800, 0, 0, -800, 0, 0, 0, -800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -800, 0, -800, -800, -800, -800, 0, 0, 0, 0, 0, -800, -800, -800, -800, 0, -800, -800, -800, -800, 0, 0, 0, 0, -800, -800, -800, -800, -800, 0, 0, -800, -800, -800, -800, 0, -800, -800, -800, -800, -800, -800, -800, -800, -800, 0, 0, 0, -800, -800, 0, 0, 0, -800, -800, -800, -800, -800, -800, + -448, 0, 0, 0, 0, 0, -448, 0, -448, 0, 0, 0, -448, 0, 0, -448, 0, 0, 0, -448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -448, 0, -448, -448, -448, -448, 0, 0, 0, 0, 0, -448, -448, -448, -448, 0, -448, -448, -448, -448, 0, 0, 0, 0, -448, -448, -448, -448, -448, 0, 0, -448, -448, -448, -448, 0, -448, -448, -448, -448, -448, -448, -448, -448, -448, 0, 0, 0, -448, -448, 0, 0, 0, -448, -448, -448, -448, -448, -448, // State 1035 - 0, 0, 0, 0, 0, 0, -808, 0, -808, 0, 0, 0, -808, 0, 0, -808, 0, 0, 0, -808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -808, 0, -808, -808, -808, -808, 0, 0, 0, 0, 0, -808, -808, -808, -808, 0, -808, -808, -808, -808, 0, 0, 0, 0, -808, -808, -808, -808, -808, 0, 0, -808, -808, -808, -808, 0, -808, -808, -808, -808, -808, -808, -808, -808, -808, 0, 0, 0, -808, -808, 0, 0, 0, -808, -808, -808, -808, -808, -808, + 0, 0, 0, 0, 0, 0, 0, -655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1036 - 1088, 0, 0, 0, 0, 0, -130, 0, -130, 0, 0, 0, -130, 0, 0, -130, 0, 0, 0, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -130, -130, -130, -130, 0, 0, 0, 0, 0, -130, 0, -130, -130, 0, 0, -130, 0, -130, 0, 0, 0, 0, 0, -130, -130, 0, -130, 0, 0, -130, 0, -130, -130, 0, -130, -130, -130, 0, -130, 0, 0, -130, -130, 0, 0, 0, -130, 0, 0, 0, 0, -130, -130, -130, -130, -130, -130, + 0, 0, 0, 0, 0, 0, 0, -649, 0, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1037 - 0, 0, 0, 0, 0, 0, -805, 0, -805, 0, 0, 0, -805, 0, 0, -805, 0, 0, 0, -805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -805, 0, -805, -805, -805, -805, 0, 0, 0, 0, 0, -805, -805, -805, -805, 0, -805, -805, -805, -805, 0, 0, 0, 0, -805, -805, -805, -805, -805, 0, 0, -805, -805, -805, -805, 0, -805, -805, -805, -805, -805, -805, -805, -805, -805, 0, 0, 0, -805, -805, 0, 0, 0, -805, -805, -805, -805, -805, -805, + 0, 0, 0, 0, 0, 0, 0, -654, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1038 - 0, -191, -191, 0, -191, 0, -191, 0, -191, -191, 0, 0, -191, 0, -191, -191, 0, 0, -191, 0, -191, -191, 0, 0, -218, 0, 0, -191, -191, 0, -191, 0, -191, -191, -191, -191, 0, -191, 0, 0, 0, 0, -191, 0, -191, 0, -191, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, 0, -191, -191, 0, 0, 0, -191, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -672, 0, 0, 0, 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1039 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1040 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1089, 0, 0, 0, 0, 0, 0, 0, 0, 0, -670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -844, 0, 0, 0, 0, 0, 0, -844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1041 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1091, 0, 0, 0, 0, 0, 0, 0, 0, 0, -661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -669, 0, 0, 0, 0, 0, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1042 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1043 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -393, 0, 0, 0, 0, 0, 0, -393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1044 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1092, 0, 0, 0, 0, 0, 0, 0, 0, 0, -666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1045 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1046 - -396, 0, 0, 0, 0, 0, -396, 0, -396, 0, 0, 0, -396, 0, 0, -396, 0, 0, 0, -396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -396, 0, -396, -396, -396, -396, 0, 0, 0, 0, 0, -396, -396, -396, -396, 0, -396, -396, -396, -396, 0, 0, 0, 0, -396, -396, -396, -396, -396, 0, 0, -396, -396, -396, -396, 0, -396, -396, -396, -396, -396, -396, -396, -396, -396, 0, 0, 0, -396, -396, 0, 0, 0, -396, -396, -396, -396, -396, -396, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1047 - -403, 0, 0, 0, 0, 0, -403, 0, -403, 0, 0, 0, -403, 0, 0, -403, 0, 0, 0, -403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -403, 0, -403, -403, -403, -403, 0, 0, 0, 0, 0, -403, -403, -403, -403, 0, -403, -403, -403, -403, 0, 0, 0, 0, -403, -403, -403, -403, -403, 0, 0, -403, -403, -403, -403, 0, -403, -403, -403, -403, -403, -403, -403, -403, -403, 0, 0, 0, -403, -403, 0, 0, 0, -403, -403, -403, -403, -403, -403, + -470, 0, 0, 0, 0, 0, -470, 0, -470, 0, 0, 0, -470, 0, 0, -470, 0, 0, 0, -470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -470, 0, -470, -470, -470, -470, 0, 0, 0, 0, 0, -470, -470, -470, -470, 0, -470, -470, -470, -470, 0, 0, 0, 0, -470, -470, -470, -470, -470, 0, 0, -470, -470, -470, -470, 0, -470, -470, -470, -470, -470, -470, -470, -470, -470, 0, 0, 0, -470, -470, 0, 0, 0, -470, -470, -470, -470, -470, -470, // State 1048 - -393, 0, 0, 0, 0, 0, -393, 0, -393, 0, 0, 0, -393, 0, 0, -393, 0, 0, 0, -393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -393, 0, -393, -393, -393, -393, 0, 0, 0, 0, 0, -393, -393, -393, -393, 0, -393, -393, -393, -393, 0, 0, 0, 0, -393, -393, -393, -393, -393, 0, 0, -393, -393, -393, -393, 0, -393, -393, -393, -393, -393, -393, -393, -393, -393, 0, 0, 0, -393, -393, 0, 0, 0, -393, -393, -393, -393, -393, -393, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -528, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1049 - 0, 0, 0, 0, 0, 0, 0, -590, 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -534, 0, 0, 0, 0, 0, -534, 0, -534, 0, 0, 0, -534, 0, 0, -534, 0, 0, 0, -534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534, 0, -534, -534, -534, -534, 0, 0, 0, 0, 0, -534, -534, -534, -534, 0, -534, -534, -534, -534, 0, 0, 0, 0, -534, -534, -534, -534, -534, 0, 0, -534, -534, -534, -534, 0, -534, -534, -534, -534, -534, -534, -534, -534, -534, 0, 0, 0, -534, -534, 0, 0, 0, -534, -534, -534, -534, -534, -534, // State 1050 - 0, 0, 0, 0, 0, 0, 0, -581, 0, 0, 0, 0, 0, 0, 1097, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -510, 0, 0, 0, 0, 0, 0, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -510, 0, 0, 0, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -510, 0, -510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, // State 1051 - 0, 0, 0, 0, 0, 0, 0, -557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -509, 0, -509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1052 - 0, 0, 0, 0, 0, 0, 0, -613, 0, 0, 0, 0, 0, 0, 1098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -778, 0, 0, 0, 0, 0, 0, -778, 0, 0, 0, 0, 0, 0, 0, 0, 0, -778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1053 - 0, 0, 0, 0, 0, 0, 0, -609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -328, 0, -328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1054 - 0, 0, 0, 0, 0, 0, 0, -603, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -333, 0, -333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1055 - 0, 0, 0, 0, 0, 0, 0, -616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -585, 0, 0, 0, 0, 0, 0, -585, 0, 0, 0, 0, 0, 0, 0, 0, 0, -585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -585, 0, 0, 0, -585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 382, 0, -585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1056 - -391, 0, 0, 0, 0, 0, -391, 0, -391, 0, 0, 0, -391, 0, 0, -391, 0, 0, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -391, 0, -391, -391, -391, -391, 0, 0, 0, 0, 0, -391, -391, -391, -391, 0, -391, -391, -391, -391, 0, 0, 0, 0, -391, -391, -391, -391, -391, 0, 0, -391, -391, -391, -391, 0, -391, -391, -391, -391, -391, -391, -391, -391, -391, 0, 0, 0, -391, -391, 0, 0, 0, -391, -391, -391, -391, -391, -391, + 0, 0, 0, 0, 0, 0, 0, -375, 0, 0, 0, 0, -375, 0, -375, -375, 0, 0, 0, 0, 0, 0, 0, 0, -375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -375, 0, 0, 0, -375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -375, 0, -375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1057 - -103, 0, 0, 0, 0, 0, -103, 0, -103, 0, 0, 0, -103, 0, 0, -103, 0, 0, 0, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -103, 0, -103, -103, -103, -103, 0, 0, 0, 0, 0, -103, -103, -103, -103, 0, -103, -103, -103, -103, -103, -103, 0, 0, -103, -103, -103, -103, -103, 0, 0, -103, -103, -103, -103, 0, -103, -103, -103, -103, -103, -103, -103, -103, -103, 0, 0, 0, -103, -103, 0, 0, 0, -103, -103, -103, -103, -103, -103, + 0, 0, 0, 0, 0, 0, 0, -376, 0, 0, 0, 0, -376, 0, -376, -376, 0, 0, 0, 0, 0, 0, 0, 0, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -376, 0, 0, 0, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -376, 0, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1058 - 0, 0, 0, 0, 0, 0, 0, -861, 0, 0, 0, 0, 0, 0, -861, 0, 0, 0, 0, 0, 0, 0, 0, 0, -861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -861, 0, 0, 0, -861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -861, 0, -861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -531, -304, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, -531, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1059 - 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -327, 0, 0, 0, 0, 0, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -327, 0, 0, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -327, 0, -327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1060 - 0, 0, 0, 0, 0, 0, -484, -262, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, -484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -332, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -332, 0, -332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1061 - 0, 0, 0, 0, 0, 0, 0, -520, 0, 0, 0, 0, 0, 0, -520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1062 - 0, 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, -940, 0, 0, 0, 0, 0, 0, -940, 0, 0, 0, 387, 0, 0, 0, 0, 0, -940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -940, 0, 0, 0, -940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -940, 0, -940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1063 - 0, 0, 0, 0, 0, 0, 0, 1103, 0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -779, 0, 0, 0, 0, 0, 0, -779, 0, 0, 0, 0, 0, 0, 0, 0, 0, -779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -779, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1064 - 0, 0, 0, 0, 0, 0, 0, -528, 0, 0, 0, 0, 0, 0, -528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, -785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1065 - 0, 0, 0, 0, 0, 0, 0, -277, 0, 0, 0, 0, 0, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, 0, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -277, 0, -277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -331, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -331, 0, -331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1066 - 0, 0, 0, 0, 0, 0, -485, -485, 0, 0, 0, 0, 0, 0, -485, 0, 0, 0, -485, 0, 0, 0, 0, 0, -485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -485, 0, 0, 0, -485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -485, 0, -485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -329, 0, -329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1067 - 0, 0, 0, 0, 0, 0, 0, 1104, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -586, 0, 0, 0, 0, 0, 0, -586, 0, 0, 0, 0, 0, 0, 0, 0, 0, -586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -586, 0, 0, 0, -586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, -586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1068 - 0, 0, 0, 0, 0, 0, 0, 1105, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, -784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1069 - 0, 0, 0, 0, 0, 0, 0, -284, 0, 0, 0, 0, 0, 0, -284, 0, 0, 0, 0, 0, 0, 0, 0, 0, -284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -284, 0, 0, 0, -284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -284, 0, -284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -330, 0, -330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1070 - 0, 0, 0, 0, 0, 0, -486, -486, 0, 0, 0, 0, 0, 0, -486, 0, 0, 0, -486, 0, 0, 0, 0, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, 0, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -507, 0, -507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1071 - 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -505, 0, 0, 0, 0, 0, 0, -505, 0, 0, 0, 0, 0, 0, 0, 0, 0, -505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -505, 0, 0, 0, -505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -505, 0, -505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1072 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -863, 0, 0, 0, 0, 0, 0, 0, 0, 0, -863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -506, 0, -506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1073 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -537, 0, 0, 0, 0, 0, -537, 0, -537, 0, 0, 0, -537, 0, 0, -537, 0, 0, 0, -537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -537, 0, -537, -537, -537, -537, 0, 0, 0, 0, 0, -537, -537, -537, -537, 0, -537, -537, -537, -537, 0, 0, 0, 0, -537, -537, -537, -537, -537, 0, 0, -537, -537, -537, -537, 0, -537, -537, -537, -537, -537, -537, -537, -537, -537, 0, 0, 0, -537, -537, 0, 0, 0, -537, -537, -537, -537, -537, -537, // State 1074 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -907, 0, 0, 0, 0, 0, -907, 0, -907, 0, 0, 0, -907, 0, 0, -907, 0, 0, 0, -907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -907, 0, -907, -907, -907, -907, 0, 0, 0, 0, 0, -907, -907, -907, -907, 0, -907, -907, -907, -907, 0, 0, 0, 1134, -907, -907, -907, -907, -907, 0, 0, -907, -907, -907, -907, 0, -907, -907, -907, -907, -907, -907, -907, -907, -907, 0, 0, 0, -907, -907, 0, 0, 0, -907, -907, -907, -907, -907, -907, // State 1075 - 0, 0, 0, 0, 0, 0, 0, -862, 0, 0, 0, 0, 0, 0, -862, 0, 0, 0, 0, 0, 0, 0, 0, 0, -862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -862, 0, 0, 0, -862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -862, 0, -862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -908, 0, 0, 0, 0, 0, -908, 0, -908, 0, 0, 0, -908, 0, 0, -908, 0, 0, 0, -908, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -908, 0, -908, -908, -908, -908, 0, 0, 0, 0, 0, -908, -908, -908, -908, 0, -908, -908, -908, -908, 0, 0, 0, 0, -908, -908, -908, -908, -908, 0, 0, -908, -908, -908, -908, 0, -908, -908, -908, -908, -908, -908, -908, -908, -908, 0, 0, 0, -908, -908, 0, 0, 0, -908, -908, -908, -908, -908, -908, // State 1076 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -864, 0, 0, 0, 0, 0, 0, 0, 0, 0, -864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -911, 0, 0, 0, 0, 0, -911, 0, -911, 0, 0, 0, -911, 0, 0, -911, 0, 0, 0, -911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -911, 0, -911, -911, -911, -911, 0, 0, 0, 0, 0, -911, -911, -911, -911, 0, -911, -911, -911, -911, 0, 0, 0, 1135, -911, -911, -911, -911, -911, 0, 0, -911, -911, -911, -911, 0, -911, -911, -911, -911, -911, -911, -911, -911, -911, 0, 0, 0, -911, -911, 0, 0, 0, -911, -911, -911, -911, -911, -911, // State 1077 - 0, 0, 0, 0, 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -912, 0, 0, 0, 0, 0, -912, 0, -912, 0, 0, 0, -912, 0, 0, -912, 0, 0, 0, -912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -912, 0, -912, -912, -912, -912, 0, 0, 0, 0, 0, -912, -912, -912, -912, 0, -912, -912, -912, -912, 0, 0, 0, 0, -912, -912, -912, -912, -912, 0, 0, -912, -912, -912, -912, 0, -912, -912, -912, -912, -912, -912, -912, -912, -912, 0, 0, 0, -912, -912, 0, 0, 0, -912, -912, -912, -912, -912, -912, // State 1078 - 0, 0, 0, 0, 0, 0, 0, -753, 0, 0, 0, 0, 0, 0, -753, 0, 0, 0, 0, 0, 0, 0, 0, 0, -753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -753, 0, 0, 0, -753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -753, 0, -753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -397, 0, 0, 0, 0, 0, -397, 0, -397, 0, 0, 0, -397, 0, 0, -397, 0, 0, 0, -397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -397, 0, -397, -397, -397, -397, 0, 0, 0, 0, 0, -397, -397, -397, -397, 0, -397, -397, -397, -397, 0, -397, -397, -397, -397, -397, -397, -397, -397, 0, 0, -397, -397, -397, -397, 0, -397, -397, -397, -397, -397, -397, -397, -397, -397, 0, 0, 0, -397, -397, 0, 0, 0, -397, -397, -397, -397, -397, -397, // State 1079 - 0, 0, 0, 0, 0, 0, -124, 1109, -124, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, -124, -124, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, -124, -124, -124, 0, -124, -124, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1080 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -854, 0, -854, 0, 0, 0, -854, 0, 0, -854, 0, 0, 0, -854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -854, 0, -854, -854, -854, -854, 0, 0, 0, 0, 0, -854, -854, -854, -854, 0, -854, -854, -854, -854, 0, 0, 0, 0, -854, -854, -854, -854, -854, 0, 0, -854, -854, -854, -854, 0, -854, -854, -854, -854, -854, -854, -854, -854, -854, 0, 0, 0, -854, -854, 0, 0, 0, -854, -854, -854, -854, -854, -854, // State 1081 - 0, 0, 0, 0, 0, 0, 0, -761, 0, 0, 0, 0, 0, 0, -761, 0, 0, 0, 0, 0, 0, 0, 0, 0, -761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -761, 0, 0, 0, -761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -761, 0, -761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1138, 0, 0, 0, 0, 0, -133, 0, -133, 0, 0, 0, -133, 0, 0, -133, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133, 0, 0, 0, 0, 0, -133, 0, -133, -133, 0, 0, -133, 0, -133, 0, 0, 0, 0, 0, -133, -133, 0, -133, 0, 0, -133, 0, -133, -133, 0, -133, -133, -133, 0, -133, 0, 0, -133, -133, 0, 0, 0, -133, 0, 0, 0, 0, -133, -133, -133, -133, -133, -133, // State 1082 - 0, 0, 0, 0, 0, 0, -124, 0, -124, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, -124, -124, -124, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, 0, 0, 0, 0, 0, 0, -124, -124, -124, 0, -124, -124, + 0, 0, 0, 0, 0, 0, -851, 0, -851, 0, 0, 0, -851, 0, 0, -851, 0, 0, 0, -851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -851, 0, -851, -851, -851, -851, 0, 0, 0, 0, 0, -851, -851, -851, -851, 0, -851, -851, -851, -851, 0, 0, 0, 0, -851, -851, -851, -851, -851, 0, 0, -851, -851, -851, -851, 0, -851, -851, -851, -851, -851, -851, -851, -851, -851, 0, 0, 0, -851, -851, 0, 0, 0, -851, -851, -851, -851, -851, -851, // State 1083 - 0, 0, 0, 0, 0, 0, 0, -758, 0, 0, 0, 0, 0, 0, -758, 0, 0, 0, 0, 0, 0, 0, 0, 0, -758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -758, 0, 0, 0, -758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -758, 0, -758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1084 - 0, 0, 0, 0, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -473, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -473, 0, -473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -859, 0, -859, 0, 0, 0, -859, 0, 0, -859, 0, 0, 0, -859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -859, 0, -859, -859, -859, -859, 0, 0, 0, 0, 0, -859, -859, -859, -859, 0, -859, -859, -859, -859, 0, 0, 0, 0, -859, -859, -859, -859, -859, 0, 0, -859, -859, -859, -859, 0, -859, -859, -859, -859, -859, -859, -859, -859, -859, 0, 0, 0, -859, -859, 0, 0, 0, -859, -859, -859, -859, -859, -859, // State 1085 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1141, 0, 0, 0, 0, 0, -132, 0, -132, 0, 0, 0, -132, 0, 0, -132, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132, 0, 0, 0, 0, 0, -132, 0, -132, -132, 0, 0, -132, 0, -132, 0, 0, 0, 0, 0, -132, -132, 0, -132, 0, 0, -132, 0, -132, -132, 0, -132, -132, -132, 0, -132, 0, 0, -132, -132, 0, 0, 0, -132, 0, 0, 0, 0, -132, -132, -132, -132, -132, -132, // State 1086 - -357, 0, 0, 0, 0, 0, -357, 0, -357, 0, 0, 0, -357, 0, 0, -357, 0, 0, 0, -357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -357, 0, -357, -357, -357, -357, 0, 0, 0, 0, 0, -357, -357, -357, -357, 0, -357, -357, -357, -357, 0, -357, -357, -357, -357, -357, -357, -357, -357, 0, 0, -357, -357, -357, -357, 0, -357, -357, -357, -357, -357, -357, -357, -357, -357, 0, 0, 0, -357, -357, 0, 0, 0, -357, -357, -357, -357, -357, -357, + -941, 0, 0, 0, 0, 0, -941, 0, -941, 0, 0, 0, -941, 0, 0, -941, 0, 0, 0, -941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -941, 0, -941, -941, -941, -941, 0, 0, 0, 0, 0, -941, -941, -941, -941, 0, -941, -941, -941, -941, 0, 0, 0, 0, -941, -941, -941, -941, -941, 0, 0, -941, -941, -941, -941, 0, -941, -941, -941, -941, -941, -941, -941, -941, -941, 0, 0, 0, -941, -941, 0, 0, 0, -941, -941, -941, -941, -941, -941, // State 1087 - 0, 0, 0, 0, 0, 0, -806, 0, -806, 0, 0, 0, -806, 0, 0, -806, 0, 0, 0, -806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -806, 0, -806, -806, -806, -806, 0, 0, 0, 0, 0, -806, -806, -806, -806, 0, -806, -806, -806, -806, 0, 0, 0, 0, -806, -806, -806, -806, -806, 0, 0, -806, -806, -806, -806, 0, -806, -806, -806, -806, -806, -806, -806, -806, -806, 0, 0, 0, -806, -806, 0, 0, 0, -806, -806, -806, -806, -806, -806, + 0, -231, -231, 0, -231, 0, -231, 0, -231, -231, 0, 0, -231, 0, -231, -231, 0, 0, -231, 0, -231, -231, 0, 0, -258, 0, 0, -231, -231, 0, -231, 0, -231, -231, -231, -231, 0, 0, -231, 0, 0, 0, 0, -231, 0, -231, 0, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, 0, -231, -231, 0, 0, 0, -231, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1088 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -225, -225, 0, -225, 0, -225, 0, -225, -225, 0, 0, -225, 0, -225, -225, 0, 0, -225, 0, -225, -225, 0, 0, -252, 0, 0, -225, -225, 0, -225, 0, -225, -225, -225, -225, 0, 0, -225, 0, 0, 0, 0, -225, 0, -225, 0, -225, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -225, 0, -225, -225, 0, 0, 0, -225, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, -225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1089 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, -667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1090 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1091 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1092 - -395, 0, 0, 0, 0, 0, -395, 0, -395, 0, 0, 0, -395, 0, 0, -395, 0, 0, 0, -395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -395, 0, -395, -395, -395, -395, 0, 0, 0, 0, 0, -395, -395, -395, -395, 0, -395, -395, -395, -395, 0, 0, 0, 0, -395, -395, -395, -395, -395, 0, 0, -395, -395, -395, -395, 0, -395, -395, -395, -395, -395, -395, -395, -395, -395, 0, 0, 0, -395, -395, 0, 0, 0, -395, -395, -395, -395, -395, -395, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, -726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1093 - -389, 0, 0, 0, 0, 0, -389, 0, -389, 0, 0, 0, -389, 0, 0, -389, 0, 0, 0, -389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -389, 0, -389, -389, -389, -389, 0, 0, 0, 0, 0, -389, -389, -389, -389, 0, -389, -389, -389, -389, 0, 0, 0, 0, -389, -389, -389, -389, -389, 0, 0, -389, -389, -389, -389, 0, -389, -389, -389, -389, -389, -389, -389, -389, -389, 0, 0, 0, -389, -389, 0, 0, 0, -389, -389, -389, -389, -389, -389, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1146, 0, 0, 0, 0, 0, 0, 0, 0, 0, -711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1094 - 0, 0, 0, 0, 0, 0, 0, -563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1147, 0, 0, 0, 0, 0, 0, 0, 0, 0, -716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1095 - 0, 0, 0, 0, 0, 0, 0, -587, 0, 0, 0, 0, 0, 0, 1121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1149, 0, 0, 0, 0, 0, 0, 0, 0, 0, -707, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1096 - 0, 0, 0, 0, 0, 0, 0, -554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1097 - 0, 0, 0, 0, 0, 0, 0, -610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1098 - 0, 0, 0, 0, 0, 0, 0, -604, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -445, 0, 0, 0, 0, 0, -445, 0, -445, 0, 0, 0, -445, 0, 0, -445, 0, 0, 0, -445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -445, 0, -445, -445, -445, -445, 0, 0, 0, 0, 0, -445, -445, -445, -445, 0, -445, -445, -445, -445, 0, 0, 0, 0, -445, -445, -445, -445, -445, 0, 0, -445, -445, -445, -445, 0, -445, -445, -445, -445, -445, -445, -445, -445, -445, 0, 0, 0, -445, -445, 0, 0, 0, -445, -445, -445, -445, -445, -445, // State 1099 - 0, 0, 0, 0, 0, 0, 0, -600, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -450, 0, 0, 0, 0, 0, -450, 0, -450, 0, 0, 0, -450, 0, 0, -450, 0, 0, 0, -450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -450, 0, -450, -450, -450, -450, 0, 0, 0, 0, 0, -450, -450, -450, -450, 0, -450, -450, -450, -450, 0, 0, 0, 0, -450, -450, -450, -450, -450, 0, 0, -450, -450, -450, -450, 0, -450, -450, -450, -450, -450, -450, -450, -450, -450, 0, 0, 0, -450, -450, 0, 0, 0, -450, -450, -450, -450, -450, -450, // State 1100 - 0, 0, 0, 0, 0, 0, 0, -585, 0, 0, 0, 0, 0, 0, 1126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -440, 0, 0, 0, 0, 0, -440, 0, -440, 0, 0, 0, -440, 0, 0, -440, 0, 0, 0, -440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -440, 0, -440, -440, -440, -440, 0, 0, 0, 0, 0, -440, -440, -440, -440, 0, -440, -440, -440, -440, 0, 0, 0, 0, -440, -440, -440, -440, -440, 0, 0, -440, -440, -440, -440, 0, -440, -440, -440, -440, -440, -440, -440, -440, -440, 0, 0, 0, -440, -440, 0, 0, 0, -440, -440, -440, -440, -440, -440, // State 1101 - 0, 0, 0, 0, 0, 0, 0, -276, 0, 0, 0, 0, 0, 0, -276, 0, 0, 0, 0, 0, 0, 0, 0, 0, -276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -276, 0, 0, 0, -276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -276, 0, -276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1102 - 0, 0, 0, 0, 0, 0, 0, -274, 0, 0, 0, 0, 0, 0, -274, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274, 0, 0, 0, -274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274, 0, -274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -447, 0, 0, 0, 0, 0, -447, 0, -447, 0, 0, 0, -447, 0, 0, -447, 0, 0, 0, -447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -447, 0, -447, -447, -447, -447, 0, 0, 0, 0, 0, -447, -447, -447, -447, 0, -447, -447, -447, -447, 0, 0, 0, 0, -447, -447, -447, -447, -447, 0, 0, -447, -447, -447, -447, 0, -447, -447, -447, -447, -447, -447, -447, -447, -447, 0, 0, 0, -447, -447, 0, 0, 0, -447, -447, -447, -447, -447, -447, // State 1103 - 0, 0, 0, 0, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -283, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -283, 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -646, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1104 - 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -281, 0, -281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -631, 0, 0, 0, 0, 0, 0, 1155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1105 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -659, 0, 0, 0, 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1106 - 0, 0, 0, 0, 0, 0, 0, -757, 0, 0, 0, 0, 0, 0, -757, 0, 0, 0, 0, 0, 0, 0, 0, 0, -757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -757, 0, 0, 0, -757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -757, 0, -757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1107 - 0, 0, 0, 0, 0, 0, -125, 1137, -125, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, -125, -125, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, -125, -125, -125, 0, -125, -125, + 0, 0, 0, 0, 0, 0, 0, -671, 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1108 - 0, 0, 0, 0, 0, 0, 0, -755, 0, 0, 0, 0, 0, 0, -755, 0, 0, 0, 0, 0, 0, 0, 0, 0, -755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -755, 0, 0, 0, -755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -755, 0, -755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1109 - 0, 0, 0, 0, 0, 0, -125, 0, -125, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, -125, -125, -125, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, -125, -125, -125, 0, -125, -125, + -565, 0, 0, 0, 0, 0, 0, -565, 0, 0, 0, 0, 0, 0, -565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1110 - 0, 0, 0, 0, 0, 0, 0, -760, 0, 0, 0, 0, 0, 0, -760, 0, 0, 0, 0, 0, 0, 0, 0, 0, -760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -760, 0, 0, 0, -760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -760, 0, -760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -472, 0, 0, 0, 0, 0, -472, 0, -472, 0, 0, 0, -472, 0, 0, -472, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -472, 0, -472, -472, -472, -472, 0, 0, 0, 0, 0, -472, -472, -472, -472, 0, -472, -472, -472, -472, 0, 0, 0, 0, -472, -472, -472, -472, -472, 0, 0, -472, -472, -472, -472, 0, -472, -472, -472, -472, -472, -472, -472, -472, -472, 0, 0, 0, -472, -472, 0, 0, 0, -472, -472, -472, -472, -472, -472, // State 1111 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -105, 0, 0, 0, 0, 0, -105, 0, -105, 0, 0, 0, -105, 0, 0, -105, 0, 0, 0, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -105, 0, -105, -105, -105, -105, 0, 0, 0, 0, 0, -105, -105, -105, -105, 0, -105, -105, -105, -105, -105, -105, 0, 0, -105, -105, -105, -105, -105, 0, 0, -105, -105, -105, -105, 0, -105, -105, -105, -105, -105, -105, -105, -105, -105, 0, 0, 0, -105, -105, 0, 0, 0, -105, -105, -105, -105, -105, -105, // State 1112 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -535, 0, 0, 0, 0, 0, -535, 0, -535, 0, 0, 0, -535, 0, 0, -535, 0, 0, 0, -535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -535, 0, -535, -535, -535, -535, 0, 0, 0, 0, 0, -535, -535, -535, -535, 0, -535, -535, -535, -535, 0, 0, 0, 0, -535, -535, -535, -535, -535, 0, 0, -535, -535, -535, -535, 0, -535, -535, -535, -535, -535, -535, -535, -535, -535, 0, 0, 0, -535, -535, 0, 0, 0, -535, -535, -535, -535, -535, -535, // State 1113 - 0, 0, 0, 0, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -472, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -472, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1114 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1182, 0, 0, 0, 0, 0, 0, 1183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1115 - 0, 0, 0, 0, 0, 0, 0, -475, 0, 0, 0, 0, 0, 0, -475, 0, 0, 0, 0, 0, 0, 0, 0, 0, -475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -475, 0, 0, 0, -475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -475, 0, -475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -803, 0, 0, 0, 0, 0, 0, -803, 0, 0, 0, 0, 0, 0, 0, 0, 0, -803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -803, 0, 0, 0, -803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -803, 0, -803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1116 - -852, 0, 0, 0, 0, 0, -852, 0, -852, 0, 0, 0, -852, 0, 0, -852, 0, 0, 0, -852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -852, 0, -852, -852, -852, -852, 0, 0, 0, 0, 0, -852, -852, -852, -852, 0, -852, -852, -852, -852, 0, 0, 0, 0, -852, -852, -852, -852, -852, 0, 0, -852, -852, -852, -852, 0, -852, -852, -852, -852, -852, -852, -852, -852, -852, 0, 0, 0, -852, -852, 0, 0, 0, -852, -852, -852, -852, -852, -852, + 0, 0, 0, 0, 0, 0, 0, -843, 0, 0, 0, 0, 0, 0, -843, 0, 0, 0, 0, 0, 0, 0, 0, 0, -843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -843, 0, 0, 0, -843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -843, 0, -843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1117 - -856, 0, 0, 0, 0, 0, -856, 0, -856, 0, 0, 0, -856, 0, 0, -856, 0, 0, 0, -856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -856, 0, -856, -856, -856, -856, 0, 0, 0, 0, 0, -856, -856, -856, -856, 0, -856, -856, -856, -856, 0, 0, 0, 0, -856, -856, -856, -856, -856, 0, 0, -856, -856, -856, -856, 0, -856, -856, -856, -856, -856, -856, -856, -856, -856, 0, 0, 0, -856, -856, 0, 0, 0, -856, -856, -856, -856, -856, -856, + 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, 0, -377, 0, -377, -377, 0, 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -377, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1118 - -361, 0, 0, 0, 0, 0, -361, 0, -361, 0, 0, 0, -361, 0, 0, -361, 0, 0, 0, -361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -361, 0, -361, -361, -361, -361, 0, 0, 0, 0, 0, -361, -361, -361, -361, 0, -361, -361, -361, -361, 0, -361, -361, -361, -361, -361, -361, -361, -361, 0, 0, -361, -361, -361, -361, 0, -361, -361, -361, -361, -361, -361, -361, -361, -361, 0, 0, 0, -361, -361, 0, 0, 0, -361, -361, -361, -361, -361, -361, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1119 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -808, 0, 0, 0, 0, 0, 0, -808, 0, 0, 0, 0, 0, 0, 0, 0, 0, -808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -808, 0, 0, 0, -808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -808, 0, -808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1120 - 0, 0, 0, 0, 0, 0, 0, -560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, // State 1121 - 0, 0, 0, 0, 0, 0, 0, -601, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1122 - 0, 0, 0, 0, 0, 0, 0, -586, 0, 0, 0, 0, 0, 0, 1142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1123 - 0, 0, 0, 0, 0, 0, 0, -591, 0, 0, 0, 0, 0, 0, 1143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1124 - 0, 0, 0, 0, 0, 0, 0, -582, 0, 0, 0, 0, 0, 0, 1145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1125 - 0, 0, 0, 0, 0, 0, 0, -558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1126 - 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, 0, -513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1127 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1128 - 0, 0, 0, 0, 0, 0, 0, -521, 0, 0, 0, 0, 0, 0, -521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1129 - 0, 0, 0, 0, 0, 0, 0, -275, 0, 0, 0, 0, 0, 0, -275, 0, 0, 0, 0, 0, 0, 0, 0, 0, -275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -275, 0, 0, 0, -275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -275, 0, -275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1130 - 0, 0, 0, 0, 0, 0, 0, 1146, 0, 0, 0, 0, 0, 0, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1131 - 0, 0, 0, 0, 0, 0, 0, -529, 0, 0, 0, 0, 0, 0, -529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -518, 0, -518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1132 - 0, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -273, 0, -273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -536, 0, 0, 0, 0, 0, -536, 0, -536, 0, 0, 0, -536, 0, 0, -536, 0, 0, 0, -536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -536, 0, -536, -536, -536, -536, 0, 0, 0, 0, 0, -536, -536, -536, -536, 0, -536, -536, -536, -536, 0, 0, 0, 0, -536, -536, -536, -536, -536, 0, 0, -536, -536, -536, -536, 0, -536, -536, -536, -536, -536, -536, -536, -536, -536, 0, 0, 0, -536, -536, 0, 0, 0, -536, -536, -536, -536, -536, -536, // State 1133 - 0, 0, 0, 0, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -282, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -282, 0, -282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1134 - 0, 0, 0, 0, 0, 0, 0, 1147, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1135 - 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -280, 0, -280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -402, 0, 0, 0, 0, 0, -402, 0, -402, 0, 0, 0, -402, 0, 0, -402, 0, 0, 0, -402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -402, 0, -402, -402, -402, -402, 0, 0, 0, 0, 0, -402, -402, -402, -402, 0, -402, -402, -402, -402, 0, -402, -402, -402, -402, -402, -402, -402, -402, 0, 0, -402, -402, -402, -402, 0, -402, -402, -402, -402, -402, -402, -402, -402, -402, 0, 0, 0, -402, -402, 0, 0, 0, -402, -402, -402, -402, -402, -402, // State 1136 - 0, 0, 0, 0, 0, 0, 0, -756, 0, 0, 0, 0, 0, 0, -756, 0, 0, 0, 0, 0, 0, 0, 0, 0, -756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -756, 0, 0, 0, -756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -756, 0, -756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1137 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -852, 0, -852, 0, 0, 0, -852, 0, 0, -852, 0, 0, 0, -852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -852, 0, -852, -852, -852, -852, 0, 0, 0, 0, 0, -852, -852, -852, -852, 0, -852, -852, -852, -852, 0, 0, 0, 0, -852, -852, -852, -852, -852, 0, 0, -852, -852, -852, -852, 0, -852, -852, -852, -852, -852, -852, -852, -852, -852, 0, 0, 0, -852, -852, 0, 0, 0, -852, -852, -852, -852, -852, -852, // State 1138 - 0, 0, 0, 0, 0, 0, 0, -474, 0, 0, 0, 0, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -474, 0, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -474, 0, -474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -860, 0, -860, 0, 0, 0, -860, 0, 0, -860, 0, 0, 0, -860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -860, 0, -860, -860, -860, -860, 0, 0, 0, 0, 0, -860, -860, -860, -860, 0, -860, -860, -860, -860, 0, 0, 0, 0, -860, -860, -860, -860, -860, 0, 0, -860, -860, -860, -860, 0, -860, -860, -860, -860, -860, -860, -860, -860, -860, 0, 0, 0, -860, -860, 0, 0, 0, -860, -860, -860, -860, -860, -860, // State 1139 - 0, 0, 0, 0, 0, 0, 0, -592, 0, 0, 0, 0, 0, 0, 1150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1191, 0, 0, 0, 0, 0, -133, 0, -133, 0, 0, 0, -133, 0, 0, -133, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133, 0, 0, 0, 0, 0, -133, 0, -133, -133, 0, 0, -133, 0, -133, 0, 0, 0, 0, 0, -133, -133, 0, -133, 0, 0, -133, 0, -133, -133, 0, -133, -133, -133, 0, -133, 0, 0, -133, -133, 0, 0, 0, -133, 0, 0, 0, 0, -133, -133, -133, -133, -133, -133, // State 1140 - 0, 0, 0, 0, 0, 0, 0, -583, 0, 0, 0, 0, 0, 0, 1152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -857, 0, -857, 0, 0, 0, -857, 0, 0, -857, 0, 0, 0, -857, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -857, 0, -857, -857, -857, -857, 0, 0, 0, 0, 0, -857, -857, -857, -857, 0, -857, -857, -857, -857, 0, 0, 0, 0, -857, -857, -857, -857, -857, 0, 0, -857, -857, -857, -857, 0, -857, -857, -857, -857, -857, -857, -857, -857, -857, 0, 0, 0, -857, -857, 0, 0, 0, -857, -857, -857, -857, -857, -857, // State 1141 - 0, 0, 0, 0, 0, 0, 0, -559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -227, -227, 0, -227, 0, -227, 0, -227, -227, 0, 0, -227, 0, -227, -227, 0, 0, -227, 0, -227, -227, 0, 0, -254, 0, 0, -227, -227, 0, -227, 0, -227, -227, -227, -227, 0, 0, -227, 0, 0, 0, 0, -227, 0, -227, 0, -227, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, 0, -227, -227, 0, 0, 0, -227, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1142 - 0, 0, 0, 0, 0, 0, 0, -564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1143 - 0, 0, 0, 0, 0, 0, 0, -588, 0, 0, 0, 0, 0, 0, 1153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 0, 0, 0, 0, 0, 0, 0, 0, -717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1144 - 0, 0, 0, 0, 0, 0, 0, -555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1194, 0, 0, 0, 0, 0, 0, 0, 0, 0, -708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1145 - 0, 0, 0, 0, 0, 0, 0, -272, 0, 0, 0, 0, 0, 0, -272, 0, 0, 0, 0, 0, 0, 0, 0, 0, -272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -272, 0, 0, 0, -272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -272, 0, -272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1146 - 0, 0, 0, 0, 0, 0, 0, -279, 0, 0, 0, 0, 0, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, 0, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -279, 0, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1147 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1195, 0, 0, 0, 0, 0, 0, 0, 0, 0, -713, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1148 - 0, 0, 0, 0, 0, 0, 0, -477, 0, 0, 0, 0, 0, 0, -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -477, 0, 0, 0, -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -477, 0, -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1149 - 0, 0, 0, 0, 0, 0, 0, -565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -442, 0, 0, 0, 0, 0, -442, 0, -442, 0, 0, 0, -442, 0, 0, -442, 0, 0, 0, -442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -442, 0, -442, -442, -442, -442, 0, 0, 0, 0, 0, -442, -442, -442, -442, 0, -442, -442, -442, -442, 0, 0, 0, 0, -442, -442, -442, -442, -442, 0, 0, -442, -442, -442, -442, 0, -442, -442, -442, -442, -442, -442, -442, -442, -442, 0, 0, 0, -442, -442, 0, 0, 0, -442, -442, -442, -442, -442, -442, // State 1150 - 0, 0, 0, 0, 0, 0, 0, -589, 0, 0, 0, 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -449, 0, 0, 0, 0, 0, -449, 0, -449, 0, 0, 0, -449, 0, 0, -449, 0, 0, 0, -449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -449, 0, -449, -449, -449, -449, 0, 0, 0, 0, 0, -449, -449, -449, -449, 0, -449, -449, -449, -449, 0, 0, 0, 0, -449, -449, -449, -449, -449, 0, 0, -449, -449, -449, -449, 0, -449, -449, -449, -449, -449, -449, -449, -449, -449, 0, 0, 0, -449, -449, 0, 0, 0, -449, -449, -449, -449, -449, -449, // State 1151 - 0, 0, 0, 0, 0, 0, 0, -556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -439, 0, 0, 0, 0, 0, -439, 0, -439, 0, 0, 0, -439, 0, 0, -439, 0, 0, 0, -439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439, 0, -439, -439, -439, -439, 0, 0, 0, 0, 0, -439, -439, -439, -439, 0, -439, -439, -439, -439, 0, 0, 0, 0, -439, -439, -439, -439, -439, 0, 0, -439, -439, -439, -439, 0, -439, -439, -439, -439, -439, -439, -439, -439, -439, 0, 0, 0, -439, -439, 0, 0, 0, -439, -439, -439, -439, -439, -439, // State 1152 - 0, 0, 0, 0, 0, 0, 0, -561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -637, 0, 0, 0, 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1153 - 0, 0, 0, 0, 0, 0, 0, -271, 0, 0, 0, 0, 0, 0, -271, 0, 0, 0, 0, 0, 0, 0, 0, 0, -271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -271, 0, 0, 0, -271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -271, 0, -271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -628, 0, 0, 0, 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1154 - 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -278, 0, -278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1155 - 0, 0, 0, 0, 0, 0, 0, -476, 0, 0, 0, 0, 0, 0, -476, 0, 0, 0, 0, 0, 0, 0, 0, 0, -476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -476, 0, 0, 0, -476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -476, 0, -476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -660, 0, 0, 0, 0, 0, 0, 1201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1156 - 0, 0, 0, 0, 0, 0, 0, -562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1157 + 0, 0, 0, 0, 0, 0, 0, -650, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1158 + 0, 0, 0, 0, 0, 0, 0, -663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1159 + -437, 0, 0, 0, 0, 0, -437, 0, -437, 0, 0, 0, -437, 0, 0, -437, 0, 0, 0, -437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -437, 0, -437, -437, -437, -437, 0, 0, 0, 0, 0, -437, -437, -437, -437, 0, -437, -437, -437, -437, 0, 0, 0, 0, -437, -437, -437, -437, -437, 0, 0, -437, -437, -437, -437, 0, -437, -437, -437, -437, -437, -437, -437, -437, -437, 0, 0, 0, -437, -437, 0, 0, 0, -437, -437, -437, -437, -437, -437, + // State 1160 + -106, 0, 0, 0, 0, 0, -106, 0, -106, 0, 0, 0, -106, 0, 0, -106, 0, 0, 0, -106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -106, 0, -106, -106, -106, -106, 0, 0, 0, 0, 0, -106, -106, -106, -106, 0, -106, -106, -106, -106, -106, -106, 0, 0, -106, -106, -106, -106, -106, 0, 0, -106, -106, -106, -106, 0, -106, -106, -106, -106, -106, -106, -106, -106, -106, 0, 0, 0, -106, -106, 0, 0, 0, -106, -106, -106, -106, -106, -106, + // State 1161 + 0, 0, 0, 0, 0, 0, 0, -915, 0, 0, 0, 0, 0, 0, -915, 0, 0, 0, 0, 0, 0, 0, 0, 0, -915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -915, 0, 0, 0, -915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -915, 0, -915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1162 + 0, 0, 0, 0, 0, 0, 0, -154, 0, 0, 0, 0, 0, 0, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0, 0, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, -154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1163 + 0, 0, 0, 0, 0, 0, -531, -304, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, -531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1164 + 0, 0, 0, 0, 0, 0, 0, -567, 0, 0, 0, 0, 0, 0, -567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1165 + 0, 0, 0, 0, 0, 0, 0, 1205, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1166 + 0, 0, 0, 0, 0, 0, 0, 1206, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1167 + 0, 0, 0, 0, 0, 0, 0, -575, 0, 0, 0, 0, 0, 0, -575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1168 + 0, 0, 0, 0, 0, 0, 0, -319, 0, 0, 0, 0, 0, 0, -319, 0, 0, 0, 0, 0, 0, 0, 0, 0, -319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -319, 0, 0, 0, -319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -319, 0, -319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1169 + 0, 0, 0, 0, 0, 0, -532, -532, 0, 0, 0, 0, 0, 0, -532, 0, 0, 0, -532, 0, 0, 0, 0, 0, -532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -532, 0, 0, 0, -532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -532, 0, -532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1170 + 0, 0, 0, 0, 0, 0, 0, 1207, 0, 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1171 + 0, 0, 0, 0, 0, 0, 0, 1208, 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1172 + 0, 0, 0, 0, 0, 0, 0, -326, 0, 0, 0, 0, 0, 0, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -326, 0, 0, 0, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -326, 0, -326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1173 + 0, 0, 0, 0, 0, 0, -533, -533, 0, 0, 0, 0, 0, 0, -533, 0, 0, 0, -533, 0, 0, 0, 0, 0, -533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -533, 0, 0, 0, -533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -533, 0, -533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1174 + 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1175 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -917, 0, 0, 0, 0, 0, 0, 0, 0, 0, -917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1176 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -526, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1177 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1178 + 0, 0, 0, 0, 0, 0, 0, -916, 0, 0, 0, 0, 0, 0, -916, 0, 0, 0, 0, 0, 0, 0, 0, 0, -916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -916, 0, 0, 0, -916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -916, 0, -916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1179 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -918, 0, 0, 0, 0, 0, 0, 0, 0, 0, -918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1180 + 0, 0, 0, 0, 0, 0, 0, 1210, 0, 0, 0, 0, 0, 0, 1211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1181 + 0, 0, 0, 0, 0, 0, 0, -802, 0, 0, 0, 0, 0, 0, -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -802, 0, 0, 0, -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -802, 0, -802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1182 + 0, 0, 0, 0, 0, 0, -127, 1212, -127, 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127, -127, -127, -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, 0, 0, 0, -127, -127, -127, 0, -127, -127, + // State 1183 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1184 + 0, 0, 0, 0, 0, 0, 0, -810, 0, 0, 0, 0, 0, 0, -810, 0, 0, 0, 0, 0, 0, 0, 0, 0, -810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -810, 0, 0, 0, -810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -810, 0, -810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1185 + 0, 0, 0, 0, 0, 0, -127, 0, -127, 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127, -127, -127, -127, -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, 0, 0, 0, -127, -127, -127, 0, -127, -127, + // State 1186 + 0, 0, 0, 0, 0, 0, 0, -807, 0, 0, 0, 0, 0, 0, -807, 0, 0, 0, 0, 0, 0, 0, 0, 0, -807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -807, 0, 0, 0, -807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -807, 0, -807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1187 + 0, 0, 0, 0, 0, 0, 0, -520, 0, 0, 0, 0, 0, 0, -520, 0, 0, 0, 0, 0, 0, 0, 0, 0, -520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -520, 0, 0, 0, -520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -520, 0, -520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1188 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1189 + -399, 0, 0, 0, 0, 0, -399, 0, -399, 0, 0, 0, -399, 0, 0, -399, 0, 0, 0, -399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -399, 0, -399, -399, -399, -399, 0, 0, 0, 0, 0, -399, -399, -399, -399, 0, -399, -399, -399, -399, 0, -399, -399, -399, -399, -399, -399, -399, -399, 0, 0, -399, -399, -399, -399, 0, -399, -399, -399, -399, -399, -399, -399, -399, -399, 0, 0, 0, -399, -399, 0, 0, 0, -399, -399, -399, -399, -399, -399, + // State 1190 + 0, 0, 0, 0, 0, 0, -858, 0, -858, 0, 0, 0, -858, 0, 0, -858, 0, 0, 0, -858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -858, 0, -858, -858, -858, -858, 0, 0, 0, 0, 0, -858, -858, -858, -858, 0, -858, -858, -858, -858, 0, 0, 0, 0, -858, -858, -858, -858, -858, 0, 0, -858, -858, -858, -858, 0, -858, -858, -858, -858, -858, -858, -858, -858, -858, 0, 0, 0, -858, -858, 0, 0, 0, -858, -858, -858, -858, -858, -858, + // State 1191 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1192 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1223, 0, 0, 0, 0, 0, 0, 0, 0, 0, -714, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1193 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1194 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1195 + -441, 0, 0, 0, 0, 0, -441, 0, -441, 0, 0, 0, -441, 0, 0, -441, 0, 0, 0, -441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -441, 0, -441, -441, -441, -441, 0, 0, 0, 0, 0, -441, -441, -441, -441, 0, -441, -441, -441, -441, 0, 0, 0, 0, -441, -441, -441, -441, -441, 0, 0, -441, -441, -441, -441, 0, -441, -441, -441, -441, -441, -441, -441, -441, -441, 0, 0, 0, -441, -441, 0, 0, 0, -441, -441, -441, -441, -441, -441, + // State 1196 + -435, 0, 0, 0, 0, 0, -435, 0, -435, 0, 0, 0, -435, 0, 0, -435, 0, 0, 0, -435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -435, 0, -435, -435, -435, -435, 0, 0, 0, 0, 0, -435, -435, -435, -435, 0, -435, -435, -435, -435, 0, 0, 0, 0, -435, -435, -435, -435, -435, 0, 0, -435, -435, -435, -435, 0, -435, -435, -435, -435, -435, -435, -435, -435, -435, 0, 0, 0, -435, -435, 0, 0, 0, -435, -435, -435, -435, -435, -435, + // State 1197 + 0, 0, 0, 0, 0, 0, 0, -610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1198 + 0, 0, 0, 0, 0, 0, 0, -634, 0, 0, 0, 0, 0, 0, 1224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1199 + 0, 0, 0, 0, 0, 0, 0, -601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1200 + 0, 0, 0, 0, 0, 0, 0, -657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1201 + 0, 0, 0, 0, 0, 0, 0, -651, 0, 0, 0, 0, 0, 0, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1202 + 0, 0, 0, 0, 0, 0, 0, -647, 0, 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1203 + 0, 0, 0, 0, 0, 0, 0, -632, 0, 0, 0, 0, 0, 0, 1229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1204 + 0, 0, 0, 0, 0, 0, 0, -318, 0, 0, 0, 0, 0, 0, -318, 0, 0, 0, 0, 0, 0, 0, 0, 0, -318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -318, 0, 0, 0, -318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -318, 0, -318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1205 + 0, 0, 0, 0, 0, 0, 0, -316, 0, 0, 0, 0, 0, 0, -316, 0, 0, 0, 0, 0, 0, 0, 0, 0, -316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -316, 0, 0, 0, -316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -316, 0, -316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1206 + 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -325, 0, -325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1207 + 0, 0, 0, 0, 0, 0, 0, -323, 0, 0, 0, 0, 0, 0, -323, 0, 0, 0, 0, 0, 0, 0, 0, 0, -323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -323, 0, 0, 0, -323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -323, 0, -323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1208 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -525, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1209 + 0, 0, 0, 0, 0, 0, 0, -806, 0, 0, 0, 0, 0, 0, -806, 0, 0, 0, 0, 0, 0, 0, 0, 0, -806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -806, 0, 0, 0, -806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -806, 0, -806, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1210 + 0, 0, 0, 0, 0, 0, -128, 1240, -128, 0, 0, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, 0, -128, -128, + // State 1211 + 0, 0, 0, 0, 0, 0, 0, -804, 0, 0, 0, 0, 0, 0, -804, 0, 0, 0, 0, 0, 0, 0, 0, 0, -804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -804, 0, 0, 0, -804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -804, 0, -804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1212 + 0, 0, 0, 0, 0, 0, -128, 0, -128, 0, 0, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, -128, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, 0, -128, -128, + // State 1213 + 0, 0, 0, 0, 0, 0, 0, -809, 0, 0, 0, 0, 0, 0, -809, 0, 0, 0, 0, 0, 0, 0, 0, 0, -809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -809, 0, 0, 0, -809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -809, 0, -809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1214 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1215 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1216 + 0, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -519, 0, -519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1217 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1218 + 0, 0, 0, 0, 0, 0, 0, -522, 0, 0, 0, 0, 0, 0, -522, 0, 0, 0, 0, 0, 0, 0, 0, 0, -522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -522, 0, 0, 0, -522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -522, 0, -522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1219 + -906, 0, 0, 0, 0, 0, -906, 0, -906, 0, 0, 0, -906, 0, 0, -906, 0, 0, 0, -906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -906, 0, -906, -906, -906, -906, 0, 0, 0, 0, 0, -906, -906, -906, -906, 0, -906, -906, -906, -906, 0, 0, 0, 0, -906, -906, -906, -906, -906, 0, 0, -906, -906, -906, -906, 0, -906, -906, -906, -906, -906, -906, -906, -906, -906, 0, 0, 0, -906, -906, 0, 0, 0, -906, -906, -906, -906, -906, -906, + // State 1220 + -910, 0, 0, 0, 0, 0, -910, 0, -910, 0, 0, 0, -910, 0, 0, -910, 0, 0, 0, -910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -910, 0, -910, -910, -910, -910, 0, 0, 0, 0, 0, -910, -910, -910, -910, 0, -910, -910, -910, -910, 0, 0, 0, 0, -910, -910, -910, -910, -910, 0, 0, -910, -910, -910, -910, 0, -910, -910, -910, -910, -910, -910, -910, -910, -910, 0, 0, 0, -910, -910, 0, 0, 0, -910, -910, -910, -910, -910, -910, + // State 1221 + -403, 0, 0, 0, 0, 0, -403, 0, -403, 0, 0, 0, -403, 0, 0, -403, 0, 0, 0, -403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -403, 0, -403, -403, -403, -403, 0, 0, 0, 0, 0, -403, -403, -403, -403, 0, -403, -403, -403, -403, 0, -403, -403, -403, -403, -403, -403, -403, -403, 0, 0, -403, -403, -403, -403, 0, -403, -403, -403, -403, -403, -403, -403, -403, -403, 0, 0, 0, -403, -403, 0, 0, 0, -403, -403, -403, -403, -403, -403, + // State 1222 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1223 + 0, 0, 0, 0, 0, 0, 0, -607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1224 + 0, 0, 0, 0, 0, 0, 0, -648, 0, 0, 0, 0, 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1225 + 0, 0, 0, 0, 0, 0, 0, -633, 0, 0, 0, 0, 0, 0, 1245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1226 + 0, 0, 0, 0, 0, 0, 0, -638, 0, 0, 0, 0, 0, 0, 1246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1227 + 0, 0, 0, 0, 0, 0, 0, -629, 0, 0, 0, 0, 0, 0, 1248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1228 + 0, 0, 0, 0, 0, 0, 0, -605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1229 + 0, 0, 0, 0, 0, 0, 0, -529, 0, 0, 0, 0, 0, 0, -529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1230 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1231 + 0, 0, 0, 0, 0, 0, 0, -568, 0, 0, 0, 0, 0, 0, -568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1232 + 0, 0, 0, 0, 0, 0, 0, -317, 0, 0, 0, 0, 0, 0, -317, 0, 0, 0, 0, 0, 0, 0, 0, 0, -317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -317, 0, 0, 0, -317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -317, 0, -317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1233 + 0, 0, 0, 0, 0, 0, 0, 1249, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1234 + 0, 0, 0, 0, 0, 0, 0, -576, 0, 0, 0, 0, 0, 0, -576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1235 + 0, 0, 0, 0, 0, 0, 0, -315, 0, 0, 0, 0, 0, 0, -315, 0, 0, 0, 0, 0, 0, 0, 0, 0, -315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -315, 0, 0, 0, -315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -315, 0, -315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1236 + 0, 0, 0, 0, 0, 0, 0, -324, 0, 0, 0, 0, 0, 0, -324, 0, 0, 0, 0, 0, 0, 0, 0, 0, -324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -324, 0, 0, 0, -324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -324, 0, -324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1237 + 0, 0, 0, 0, 0, 0, 0, 1250, 0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1238 + 0, 0, 0, 0, 0, 0, 0, -322, 0, 0, 0, 0, 0, 0, -322, 0, 0, 0, 0, 0, 0, 0, 0, 0, -322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -322, 0, 0, 0, -322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -322, 0, -322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1239 + 0, 0, 0, 0, 0, 0, 0, -805, 0, 0, 0, 0, 0, 0, -805, 0, 0, 0, 0, 0, 0, 0, 0, 0, -805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -805, 0, 0, 0, -805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -805, 0, -805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1240 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1241 + 0, 0, 0, 0, 0, 0, 0, -521, 0, 0, 0, 0, 0, 0, -521, 0, 0, 0, 0, 0, 0, 0, 0, 0, -521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -521, 0, 0, 0, -521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -521, 0, -521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1242 + 0, 0, 0, 0, 0, 0, 0, -639, 0, 0, 0, 0, 0, 0, 1253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1243 + 0, 0, 0, 0, 0, 0, 0, -630, 0, 0, 0, 0, 0, 0, 1255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1244 + 0, 0, 0, 0, 0, 0, 0, -606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1245 + 0, 0, 0, 0, 0, 0, 0, -611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1246 + 0, 0, 0, 0, 0, 0, 0, -635, 0, 0, 0, 0, 0, 0, 1256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1247 + 0, 0, 0, 0, 0, 0, 0, -602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1248 + 0, 0, 0, 0, 0, 0, 0, -314, 0, 0, 0, 0, 0, 0, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -314, 0, 0, 0, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -314, 0, -314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1249 + 0, 0, 0, 0, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -321, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -321, 0, -321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1250 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1251 + 0, 0, 0, 0, 0, 0, 0, -524, 0, 0, 0, 0, 0, 0, -524, 0, 0, 0, 0, 0, 0, 0, 0, 0, -524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -524, 0, 0, 0, -524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -524, 0, -524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1252 + 0, 0, 0, 0, 0, 0, 0, -612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1253 + 0, 0, 0, 0, 0, 0, 0, -636, 0, 0, 0, 0, 0, 0, 1260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1254 + 0, 0, 0, 0, 0, 0, 0, -603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1255 + 0, 0, 0, 0, 0, 0, 0, -608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1256 + 0, 0, 0, 0, 0, 0, 0, -313, 0, 0, 0, 0, 0, 0, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, 0, 0, 0, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -313, 0, -313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1257 + 0, 0, 0, 0, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -320, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -320, 0, -320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1258 + 0, 0, 0, 0, 0, 0, 0, -523, 0, 0, 0, 0, 0, 0, -523, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523, 0, 0, 0, -523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523, 0, -523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 1259 + 0, 0, 0, 0, 0, 0, 0, -609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i16, integer: usize) -> i16 { - __ACTION[(state as usize) * 96 + integer] + __ACTION[(state as usize) * 97 + integer] } const __EOF_ACTION: &[i16] = &[ // State 0 @@ -2463,23 +2671,23 @@ mod __parse__Top { // State 1 0, // State 2 - -743, + -792, // State 3 0, // State 4 0, // State 5 - -765, + -816, // State 6 - -246, + -288, // State 7 - -314, + -356, // State 8 - -850, + -904, // State 9 - -153, + -158, // State 10 - -167, + -174, // State 11 0, // State 12 @@ -2497,7 +2705,7 @@ mod __parse__Top { // State 18 0, // State 19 - -849, + -903, // State 20 0, // State 21 @@ -2511,13 +2719,13 @@ mod __parse__Top { // State 25 0, // State 26 - -313, + -355, // State 27 0, // State 28 0, // State 29 - -418, + -464, // State 30 0, // State 31 @@ -2537,7 +2745,7 @@ mod __parse__Top { // State 38 0, // State 39 - -245, + -287, // State 40 0, // State 41 @@ -2591,9 +2799,9 @@ mod __parse__Top { // State 65 0, // State 66 - -152, + 0, // State 67 - -166, + 0, // State 68 0, // State 69 @@ -2607,15 +2815,15 @@ mod __parse__Top { // State 73 0, // State 74 - -764, + 0, // State 75 0, // State 76 0, // State 77 - 0, + -157, // State 78 - 0, + -173, // State 79 0, // State 80 @@ -2629,7 +2837,7 @@ mod __parse__Top { // State 84 0, // State 85 - 0, + -815, // State 86 0, // State 87 @@ -2871,11 +3079,11 @@ mod __parse__Top { // State 205 0, // State 206 - -424, + 0, // State 207 - -855, + 0, // State 208 - -859, + 0, // State 209 0, // State 210 @@ -2939,11 +3147,11 @@ mod __parse__Top { // State 239 0, // State 240 - 0, + -471, // State 241 - 0, + -909, // State 242 - 0, + -913, // State 243 0, // State 244 @@ -3241,153 +3449,153 @@ mod __parse__Top { // State 390 0, // State 391 - -916, + 0, // State 392 - -181, + 0, // State 393 - -910, + 0, // State 394 - -541, + 0, // State 395 - -237, + 0, // State 396 - -740, + 0, // State 397 - -503, + 0, // State 398 - -182, + 0, // State 399 - -828, + 0, // State 400 - -183, + 0, // State 401 - -833, + 0, // State 402 - -157, + 0, // State 403 - -419, + 0, // State 404 - -832, + 0, // State 405 - -380, + 0, // State 406 - -845, + 0, // State 407 - -844, + 0, // State 408 - -532, + 0, // State 409 - -365, + 0, // State 410 0, // State 411 0, // State 412 - -209, + 0, // State 413 - -207, + 0, // State 414 - -208, + 0, // State 415 - -206, + 0, // State 416 0, // State 417 - -332, + 0, // State 418 - -331, + 0, // State 419 - -330, + 0, // State 420 - -422, + 0, // State 421 - -136, + 0, // State 422 - -540, + 0, // State 423 - -156, + 0, // State 424 - -137, + 0, // State 425 0, // State 426 0, // State 427 - 0, + -972, // State 428 - -238, + -217, // State 429 - 0, + -966, // State 430 - 0, + -588, // State 431 - 0, + -277, // State 432 - 0, + -789, // State 433 - 0, + -550, // State 434 - 0, + -218, // State 435 - 0, + -882, // State 436 - 0, + -219, // State 437 - 0, + -887, // State 438 - -851, + -162, // State 439 - -85, + -465, // State 440 - 0, + -886, // State 441 - 0, + -426, // State 442 - 0, + -899, // State 443 - 0, + -898, // State 444 - 0, + -579, // State 445 - 0, + -409, // State 446 0, // State 447 0, // State 448 - -379, + -245, // State 449 - 0, + -243, // State 450 - 0, + -244, // State 451 - 0, + -242, // State 452 0, // State 453 - 0, + -374, // State 454 - 0, + -373, // State 455 - -197, + -372, // State 456 - -790, + -469, // State 457 - 0, + -139, // State 458 - 0, + -587, // State 459 - 0, + -161, // State 460 - 0, + -140, // State 461 0, // State 462 0, // State 463 - -185, - // State 464 0, + // State 464 + -278, // State 465 0, // State 466 @@ -3399,7 +3607,7 @@ mod __parse__Top { // State 469 0, // State 470 - -502, + 0, // State 471 0, // State 472 @@ -3407,43 +3615,43 @@ mod __parse__Top { // State 473 0, // State 474 - 0, + -905, // State 475 - 0, + -88, // State 476 0, // State 477 0, // State 478 - -202, + 0, // State 479 0, // State 480 - -324, + 0, // State 481 - -744, + 0, // State 482 0, // State 483 0, // State 484 - 0, + -425, // State 485 0, // State 486 - -320, + 0, // State 487 - -323, + 0, // State 488 0, // State 489 - -318, + 0, // State 490 0, // State 491 - 0, + -233, // State 492 - -317, + -842, // State 493 0, // State 494 @@ -3455,23 +3663,23 @@ mod __parse__Top { // State 497 0, // State 498 - -321, - // State 499 0, + // State 499 + -221, // State 500 - -319, + 0, // State 501 - -322, + 0, // State 502 0, // State 503 - -749, + 0, // State 504 0, // State 505 0, // State 506 - 0, + -549, // State 507 0, // State 508 @@ -3487,9 +3695,9 @@ mod __parse__Top { // State 513 0, // State 514 - -161, + -238, // State 515 - -240, + 0, // State 516 0, // State 517 @@ -3501,45 +3709,45 @@ mod __parse__Top { // State 520 0, // State 521 - -739, + 0, // State 522 - -139, + 0, // State 523 0, // State 524 - 0, + -366, // State 525 - -364, + -793, // State 526 - -86, + 0, // State 527 - -533, + 0, // State 528 0, // State 529 - -827, + 0, // State 530 - -909, + 0, // State 531 0, // State 532 - 0, + -362, // State 533 - 0, + -365, // State 534 0, // State 535 - -194, + 0, // State 536 - -188, + 0, // State 537 - -198, + -360, // State 538 0, // State 539 0, // State 540 - -184, + -359, // State 541 0, // State 542 @@ -3551,19 +3759,19 @@ mod __parse__Top { // State 545 0, // State 546 - -451, + 0, // State 547 0, // State 548 - -201, + 0, // State 549 - 0, + -363, // State 550 - -204, + 0, // State 551 - 0, + -361, // State 552 - 0, + -364, // State 553 0, // State 554 @@ -3571,7 +3779,7 @@ mod __parse__Top { // State 555 0, // State 556 - 0, + -798, // State 557 0, // State 558 @@ -3597,13 +3805,13 @@ mod __parse__Top { // State 568 0, // State 569 - -747, + 0, // State 570 0, // State 571 - 0, + -166, // State 572 - 0, + -280, // State 573 0, // State 574 @@ -3615,25 +3823,25 @@ mod __parse__Top { // State 577 0, // State 578 - 0, + -788, // State 579 - 0, + -142, // State 580 0, // State 581 0, // State 582 - 0, + -408, // State 583 - 0, + -89, // State 584 - 0, + -580, // State 585 0, // State 586 - 0, + -881, // State 587 - 0, + -965, // State 588 0, // State 589 @@ -3643,17 +3851,17 @@ mod __parse__Top { // State 591 0, // State 592 - 0, + -230, // State 593 - 0, + -224, // State 594 - 0, + -234, // State 595 0, // State 596 0, // State 597 - 0, + -220, // State 598 0, // State 599 @@ -3665,15 +3873,15 @@ mod __parse__Top { // State 602 0, // State 603 - 0, + -498, // State 604 0, // State 605 - 0, + -237, // State 606 0, // State 607 - 0, + -240, // State 608 0, // State 609 @@ -3717,11 +3925,11 @@ mod __parse__Top { // State 628 0, // State 629 - 0, + -796, // State 630 - -163, + 0, // State 631 - -160, + 0, // State 632 0, // State 633 @@ -3731,45 +3939,45 @@ mod __parse__Top { // State 635 0, // State 636 - -239, + 0, // State 637 0, // State 638 - -140, + 0, // State 639 0, // State 640 - -199, + 0, // State 641 0, // State 642 0, // State 643 - -196, + 0, // State 644 0, // State 645 - -190, + 0, // State 646 0, // State 647 0, // State 648 - -187, + 0, // State 649 - -200, + 0, // State 650 0, // State 651 0, // State 652 - -186, + 0, // State 653 0, // State 654 0, // State 655 - -450, + 0, // State 656 0, // State 657 @@ -3779,9 +3987,9 @@ mod __parse__Top { // State 659 0, // State 660 - -203, + 0, // State 661 - -205, + 0, // State 662 0, // State 663 @@ -3791,7 +3999,7 @@ mod __parse__Top { // State 665 0, // State 666 - -748, + 0, // State 667 0, // State 668 @@ -3809,7 +4017,7 @@ mod __parse__Top { // State 674 0, // State 675 - -745, + 0, // State 676 0, // State 677 @@ -3857,9 +4065,9 @@ mod __parse__Top { // State 698 0, // State 699 - 0, + -168, // State 700 - 0, + -165, // State 701 0, // State 702 @@ -3867,49 +4075,49 @@ mod __parse__Top { // State 703 0, // State 704 - -162, - // State 705 0, + // State 705 + -279, // State 706 0, // State 707 - 0, + -143, // State 708 0, // State 709 - 0, + -235, // State 710 0, // State 711 0, // State 712 - -831, + -232, // State 713 0, // State 714 - 0, + -226, // State 715 - -192, + 0, // State 716 0, // State 717 - -193, + -223, // State 718 - 0, + -236, // State 719 0, // State 720 0, // State 721 - 0, + -222, // State 722 0, // State 723 0, // State 724 - 0, + -497, // State 725 - -746, + 0, // State 726 0, // State 727 @@ -3917,19 +4125,19 @@ mod __parse__Top { // State 728 0, // State 729 - 0, + -239, // State 730 - 0, + -241, // State 731 0, // State 732 - -268, + 0, // State 733 0, // State 734 0, // State 735 - 0, + -797, // State 736 0, // State 737 @@ -3957,7 +4165,7 @@ mod __parse__Top { // State 748 0, // State 749 - 0, + -794, // State 750 0, // State 751 @@ -3983,19 +4191,19 @@ mod __parse__Top { // State 761 0, // State 762 - -824, + 0, // State 763 0, // State 764 - -358, + 0, // State 765 - -362, + 0, // State 766 0, // State 767 0, // State 768 - -888, + 0, // State 769 0, // State 770 @@ -4015,7 +4223,7 @@ mod __parse__Top { // State 777 0, // State 778 - -908, + 0, // State 779 0, // State 780 @@ -4043,15 +4251,15 @@ mod __parse__Top { // State 791 0, // State 792 - 0, + -167, // State 793 0, // State 794 0, // State 795 - -195, + 0, // State 796 - -189, + 0, // State 797 0, // State 798 @@ -4059,17 +4267,17 @@ mod __parse__Top { // State 799 0, // State 800 - 0, + -885, // State 801 0, // State 802 0, // State 803 - 0, + -228, // State 804 0, // State 805 - -270, + -229, // State 806 0, // State 807 @@ -4077,21 +4285,21 @@ mod __parse__Top { // State 808 0, // State 809 - -907, + 0, // State 810 - -264, + 0, // State 811 - -267, + 0, // State 812 0, // State 813 - 0, + -795, // State 814 0, // State 815 0, // State 816 - -406, + 0, // State 817 0, // State 818 @@ -4109,27 +4317,27 @@ mod __parse__Top { // State 824 0, // State 825 - -426, + 0, // State 826 0, // State 827 - 0, + -310, // State 828 0, // State 829 - -825, + 0, // State 830 0, // State 831 - -822, + 0, // State 832 - -359, + 0, // State 833 0, // State 834 0, // State 835 - -363, + 0, // State 836 0, // State 837 @@ -4173,19 +4381,19 @@ mod __parse__Top { // State 856 0, // State 857 - 0, + -876, // State 858 0, // State 859 - -191, + -400, // State 860 - 0, + -404, // State 861 0, // State 862 0, // State 863 - 0, + -942, // State 864 0, // State 865 @@ -4195,19 +4403,19 @@ mod __parse__Top { // State 867 0, // State 868 - -266, + 0, // State 869 - -269, + 0, // State 870 0, // State 871 - -408, + 0, // State 872 0, // State 873 - -398, + -962, // State 874 - -263, + 0, // State 875 0, // State 876 @@ -4217,7 +4425,7 @@ mod __parse__Top { // State 878 0, // State 879 - -405, + 0, // State 880 0, // State 881 @@ -4233,7 +4441,7 @@ mod __parse__Top { // State 886 0, // State 887 - -392, + 0, // State 888 0, // State 889 @@ -4243,19 +4451,19 @@ mod __parse__Top { // State 891 0, // State 892 - 0, + -231, // State 893 - 0, + -225, // State 894 0, // State 895 - -823, + 0, // State 896 0, // State 897 - -356, + 0, // State 898 - -860, + 0, // State 899 0, // State 900 @@ -4263,11 +4471,11 @@ mod __parse__Top { // State 901 0, // State 902 - 0, + -312, // State 903 0, // State 904 - -826, + 0, // State 905 0, // State 906 @@ -4277,11 +4485,11 @@ mod __parse__Top { // State 908 0, // State 909 - 0, + -961, // State 910 - 0, + -306, // State 911 - 0, + -309, // State 912 0, // State 913 @@ -4291,7 +4499,7 @@ mod __parse__Top { // State 915 0, // State 916 - 0, + -452, // State 917 0, // State 918 @@ -4307,29 +4515,29 @@ mod __parse__Top { // State 923 0, // State 924 - -400, + 0, // State 925 - -265, + -473, // State 926 0, // State 927 - -407, + 0, // State 928 0, // State 929 - -397, + -877, // State 930 - -390, - // State 931 - -402, - // State 932 0, + // State 931 + -874, + // State 932 + -401, // State 933 0, // State 934 0, // State 935 - 0, + -405, // State 936 0, // State 937 @@ -4347,11 +4555,11 @@ mod __parse__Top { // State 943 0, // State 944 - -423, + 0, // State 945 0, // State 946 - -487, + 0, // State 947 0, // State 948 @@ -4377,7 +4585,7 @@ mod __parse__Top { // State 958 0, // State 959 - 0, + -227, // State 960 0, // State 961 @@ -4395,23 +4603,23 @@ mod __parse__Top { // State 967 0, // State 968 - 0, + -308, // State 969 - 0, + -311, // State 970 - -490, - // State 971 - -853, - // State 972 - -854, - // State 973 - -857, - // State 974 - -858, - // State 975 - -355, - // State 976 0, + // State 971 + -454, + // State 972 + 0, + // State 973 + 0, + // State 974 + 0, + // State 975 + -444, + // State 976 + -305, // State 977 0, // State 978 @@ -4421,11 +4629,11 @@ mod __parse__Top { // State 980 0, // State 981 - 0, + -451, // State 982 0, // State 983 - -887, + 0, // State 984 0, // State 985 @@ -4437,7 +4645,7 @@ mod __parse__Top { // State 988 0, // State 989 - 0, + -438, // State 990 0, // State 991 @@ -4449,17 +4657,17 @@ mod __parse__Top { // State 994 0, // State 995 - -399, + 0, // State 996 - -404, + 0, // State 997 - -394, + -875, // State 998 0, // State 999 - -401, + -398, // State 1000 - 0, + -914, // State 1001 0, // State 1002 @@ -4471,13 +4679,13 @@ mod __parse__Top { // State 1005 0, // State 1006 - 0, + -878, // State 1007 - -425, + 0, // State 1008 - -102, + 0, // State 1009 - -488, + 0, // State 1010 0, // State 1011 @@ -4511,23 +4719,23 @@ mod __parse__Top { // State 1025 0, // State 1026 - 0, + -446, // State 1027 - 0, + -307, // State 1028 0, // State 1029 - -489, + -453, // State 1030 0, // State 1031 0, // State 1032 - -360, + -443, // State 1033 - 0, + -436, // State 1034 - 0, + -448, // State 1035 0, // State 1036 @@ -4551,13 +4759,13 @@ mod __parse__Top { // State 1045 0, // State 1046 - -396, - // State 1047 - -403, - // State 1048 - -393, - // State 1049 0, + // State 1047 + -470, + // State 1048 + 0, + // State 1049 + -534, // State 1050 0, // State 1051 @@ -4571,9 +4779,9 @@ mod __parse__Top { // State 1055 0, // State 1056 - -391, + 0, // State 1057 - -103, + 0, // State 1058 0, // State 1059 @@ -4605,17 +4813,17 @@ mod __parse__Top { // State 1072 0, // State 1073 - 0, + -537, // State 1074 - 0, + -907, // State 1075 - 0, + -908, // State 1076 - 0, + -911, // State 1077 - 0, + -912, // State 1078 - 0, + -397, // State 1079 0, // State 1080 @@ -4631,7 +4839,7 @@ mod __parse__Top { // State 1085 0, // State 1086 - -357, + -941, // State 1087 0, // State 1088 @@ -4643,9 +4851,9 @@ mod __parse__Top { // State 1091 0, // State 1092 - -395, + 0, // State 1093 - -389, + 0, // State 1094 0, // State 1095 @@ -4655,15 +4863,15 @@ mod __parse__Top { // State 1097 0, // State 1098 - 0, + -445, // State 1099 - 0, + -450, // State 1100 - 0, + -440, // State 1101 0, // State 1102 - 0, + -447, // State 1103 0, // State 1104 @@ -4679,11 +4887,11 @@ mod __parse__Top { // State 1109 0, // State 1110 - 0, + -472, // State 1111 - 0, + -105, // State 1112 - 0, + -535, // State 1113 0, // State 1114 @@ -4691,11 +4899,11 @@ mod __parse__Top { // State 1115 0, // State 1116 - -852, + 0, // State 1117 - -856, + 0, // State 1118 - -361, + 0, // State 1119 0, // State 1120 @@ -4723,13 +4931,13 @@ mod __parse__Top { // State 1131 0, // State 1132 - 0, + -536, // State 1133 0, // State 1134 0, // State 1135 - 0, + -402, // State 1136 0, // State 1137 @@ -4757,11 +4965,11 @@ mod __parse__Top { // State 1148 0, // State 1149 - 0, + -442, // State 1150 - 0, + -449, // State 1151 - 0, + -439, // State 1152 0, // State 1153 @@ -4772,801 +4980,1065 @@ mod __parse__Top { 0, // State 1156 0, + // State 1157 + 0, + // State 1158 + 0, + // State 1159 + -437, + // State 1160 + -106, + // State 1161 + 0, + // State 1162 + 0, + // State 1163 + 0, + // State 1164 + 0, + // State 1165 + 0, + // State 1166 + 0, + // State 1167 + 0, + // State 1168 + 0, + // State 1169 + 0, + // State 1170 + 0, + // State 1171 + 0, + // State 1172 + 0, + // State 1173 + 0, + // State 1174 + 0, + // State 1175 + 0, + // State 1176 + 0, + // State 1177 + 0, + // State 1178 + 0, + // State 1179 + 0, + // State 1180 + 0, + // State 1181 + 0, + // State 1182 + 0, + // State 1183 + 0, + // State 1184 + 0, + // State 1185 + 0, + // State 1186 + 0, + // State 1187 + 0, + // State 1188 + 0, + // State 1189 + -399, + // State 1190 + 0, + // State 1191 + 0, + // State 1192 + 0, + // State 1193 + 0, + // State 1194 + 0, + // State 1195 + -441, + // State 1196 + -435, + // State 1197 + 0, + // State 1198 + 0, + // State 1199 + 0, + // State 1200 + 0, + // State 1201 + 0, + // State 1202 + 0, + // State 1203 + 0, + // State 1204 + 0, + // State 1205 + 0, + // State 1206 + 0, + // State 1207 + 0, + // State 1208 + 0, + // State 1209 + 0, + // State 1210 + 0, + // State 1211 + 0, + // State 1212 + 0, + // State 1213 + 0, + // State 1214 + 0, + // State 1215 + 0, + // State 1216 + 0, + // State 1217 + 0, + // State 1218 + 0, + // State 1219 + -906, + // State 1220 + -910, + // State 1221 + -403, + // State 1222 + 0, + // State 1223 + 0, + // State 1224 + 0, + // State 1225 + 0, + // State 1226 + 0, + // State 1227 + 0, + // State 1228 + 0, + // State 1229 + 0, + // State 1230 + 0, + // State 1231 + 0, + // State 1232 + 0, + // State 1233 + 0, + // State 1234 + 0, + // State 1235 + 0, + // State 1236 + 0, + // State 1237 + 0, + // State 1238 + 0, + // State 1239 + 0, + // State 1240 + 0, + // State 1241 + 0, + // State 1242 + 0, + // State 1243 + 0, + // State 1244 + 0, + // State 1245 + 0, + // State 1246 + 0, + // State 1247 + 0, + // State 1248 + 0, + // State 1249 + 0, + // State 1250 + 0, + // State 1251 + 0, + // State 1252 + 0, + // State 1253 + 0, + // State 1254 + 0, + // State 1255 + 0, + // State 1256 + 0, + // State 1257 + 0, + // State 1258 + 0, + // State 1259 + 0, ]; fn __goto(state: i16, nt: usize) -> i16 { match nt { 9 => match state { - 242 => 884, - 279 => 933, - 280 => 934, - 313 => 1000, - 342 => 1054, - 366 => 1098, - 367 => 1099, - 375 => 1121, - _ => 819, + 277 => 986, + 315 => 1036, + 316 => 1037, + 349 => 1103, + 378 => 1157, + 402 => 1201, + 403 => 1202, + 411 => 1224, + _ => 919, }, 12 => match state { - 85 => 657, - 129 => 719, - 130 => 720, - 185 => 797, - 226 => 865, - 267 => 920, - 268 => 921, - 304 => 989, - _ => 543, + 96 => 726, + 156 => 807, + 157 => 808, + 217 => 894, + 260 => 965, + 302 => 1022, + 303 => 1023, + 340 => 1092, + _ => 600, }, 21 => match state { - 128 => 716, - 175 => 781, - 260 => 908, - _ => 534, + 117 => 753, + 155 => 804, + 207 => 876, + 226 => 905, + 295 => 1010, + _ => 591, }, 24 => match state { - 176 => 784, - 261 => 910, - _ => 693, - }, - 28 => 683, - 35 => 438, - 46 => 825, - 50 => match state { - 65 | 98 => 105, - _ => 3, - }, - 53 => 68, - 55 => match state { - 65 | 98 => 106, - _ => 4, - }, - 60 => match state { - 326 => 358, - _ => 357, - }, - 63 => match state { - 19 => 46, - 210 => 255, - 256 => 299, - _ => 156, - }, - 68 => match state { - 65 | 98 => 598, - 290 | 323 | 326 | 345 | 347 | 349 | 352 | 355..=358 | 370 | 379 | 381 | 383 => 947, - 327 | 371 => 1017, - _ => 392, - }, - 70 => match state { - 109 => 165, - _ => 26, - }, - 77 => match state { - 107 => 161, - 321 | 359 => 346, - _ => 21, - }, - 78 => match state { - 327 | 371 => 1018, - _ => 948, - }, - 79 => match state { - 33 => 530, - 65 | 98 => 599, - 173 => 779, - _ => 393, - }, - 80 => 600, - 81 => match state { - 3 => 422, - 105 => 689, - _ => 394, - }, - 82 => 601, - 83 => match state { - 99 => 679, - 108 => 691, - 134 => 726, - 139 => 731, - 190 => 804, - _ => 428, - }, - 85 => match state { - 31 => 74, - 65 | 98 => 107, - 168 => 214, - _ => 5, - }, - 86 => 602, - 87 => 949, - 88 => 479, - 89 => match state { - 92 => 668, - 136 => 728, - _ => 555, - }, - 91 => 92, - 93 => 395, - 94 => 603, - 95 => match state { - 15 => 39, - 65 | 98 => 108, - 116 => 179, - _ => 6, - }, - 96 => 604, - 97 => match state { - 65 | 98 => 605, - _ => 396, - }, - 98 => 606, - 99 => 93, - 100 => 950, - 101 => 480, - 102 => 951, - 103 => match state { - 345 => 1058, - 355 => 1075, - _ => 952, - }, - 106 => match state { - 38 => 541, - 43 => 547, - 44 => 549, - 69 => 633, - 174 => 780, - 178 => 789, - 180 => 790, - 181 => 792, - _ => 531, - }, - 108 => match state { - 26 | 165 => 73, - _ => 27, - }, - 109 => 397, - 110 => 607, - 111 => match state { - 210 => 840, - 256 => 902, - _ => 481, - }, - 112 => match state { - 264 | 303 => 913, - _ => 858, - }, - 114 => match state { - 263 => 303, - _ => 264, - }, - 115 => match state { - 65 | 98 => 608, - 290 | 323 | 325..=327 | 345..=347 | 349 | 352 | 355..=358 | 370..=371 | 379 | 381 | 383 => 953, - _ => 398, - }, - 116 => match state { - 325 => 1014, - 346 => 1059, - _ => 954, - }, - 117 => match state { - 327 | 371 => 359, - _ => 321, - }, - 118 => match state { - 47 => 553, - _ => 482, - }, - 120 => 47, - 121 => 483, - 122 => match state { - 87 => 662, - _ => 471, - }, - 123 => match state { - 118 => 180, - 87 => 663, - _ => 43, - }, - 124 => match state { - 118 => 701, - _ => 472, - }, - 126 => match state { - 58 => 589, - 101 => 681, - 152 => 753, - _ => 581, - }, - 127 => 821, - 129 => match state { - 207 => 832, - _ => 764, - }, - 130 => 207, - 131 => match state { - 208 => 835, - _ => 765, - }, - 132 => 208, - 133 => match state { - 65 | 98 => 109, - 13 => 456, - 27 => 522, - 36 => 538, - 45 => 551, - 53..=54 | 77 | 97 | 126 | 144 | 146 => 573, - 73 => 638, - 170 => 775, - 177 => 787, - 218 => 851, - 258 => 906, - _ => 7, - }, - 134 => 609, - 135 => match state { - 77 => 642, - 97 => 677, - 126 => 713, - _ => 578, - }, - 136 => 574, - 137 => 914, - 138 => match state { - 144 | 146 => 744, - _ => 575, - }, - 139 => 484, - 140 => match state { - 11 => 448, - 25 => 521, - 32 => 529, - 112 => 692, - 164 => 771, - 169 => 774, - _ => 399, - }, - 141 => 610, - 142 => 485, - 143 => 486, - 144 => 487, - 145 => match state { - 68 => 629, - _ => 512, - }, - 147 => 579, - 148 => match state { - 1 => 8, - 37 => 539, - 62 => 595, - 93..=94 => 669, - 145 => 745, - 194 => 808, - _ => 48, - }, - 149 => 488, - 150 => 1010, - 151 => match state { - 51 => 99, - 52 => 100, - 90 => 134, - 91 => 135, - 96 => 138, - 133 => 189, - 12 | 14 | 18 | 24 | 49 | 57 | 59 | 64 | 78..=79 | 81 | 88 | 114..=115 | 118 | 120 | 122 | 127 | 153..=154 | 163 | 184 | 216..=217 | 222 | 247 | 259 | 286 | 301 | 331 | 354 => 449, - 16 | 82 | 86 | 131..=132 | 186..=188 | 223..=225 | 266 | 269 | 305..=307 | 333..=335 | 362 => 464, - 22 | 68 => 513, - 23 => 515, - 40..=41 | 129 | 226 | 267 => 544, - 56 | 60 => 586, - 63 => 596, - 65 | 98 => 611, - 141 | 236 => 733, - 143 | 240 | 243 | 281 | 283 | 314..=316 | 339..=341 | 365 | 368 | 376..=378 | 385..=388 => 737, - 147 | 204 => 746, - 148 => 750, - 149 => 751, - 151 => 752, - 162 => 769, - 198 => 813, - 199 => 814, - 202 | 279 | 342 | 366 => 820, - 203 => 822, - 205 => 824, - 245 => 888, - 246 | 285 => 889, - 248 => 893, - 290 | 323 | 326 | 345 | 352 | 355..=358 | 370 | 379 => 955, - 298 => 976, - 317 => 1006, - 324 => 1013, - 327 | 371 => 1019, - 330 => 1033, - 347 | 349 | 381 | 383 => 1060, - 348 => 1066, - 350 => 1070, - 351 => 1071, - 360 => 1085, - 380 | 382 | 389..=390 => 1127, - 384 => 1137, - _ => 400, - }, - 152 => 489, - 155 => 747, - 156 => match state { - 101 => 682, - _ => 582, - }, - 158 => 101, - 159 => 583, - 160 => 490, - 161 => match state { - 240 => 881, - 243 => 885, - 281 => 935, - 283 => 938, - 314 => 1001, - 315 => 1002, - 316 => 1004, - 339 => 1049, - 340 => 1050, - 341 => 1052, - 365 => 1095, - 368 => 1100, - 376 => 1122, - 377 => 1123, - 378 => 1124, - 385 => 1139, - 386 => 1140, - 387 => 1143, - 388 => 1150, - _ => 738, - }, - 162 => match state { - 82 => 653, - 86 => 658, - 131 => 721, - 132 => 723, - 186 => 798, - 187 => 799, - 188 => 801, - 223 => 860, - 224 => 861, - 225 => 863, - 266 => 917, - 269 => 922, - 305 => 990, - 306 => 991, - 307 => 992, - 333 => 1040, - 334 => 1041, - 335 => 1044, - 362 => 1089, - _ => 465, - }, - 163 => match state { - 65 | 98 => 612, - _ => 401, - }, - 164 => 672, - 165 => 491, - 166 => match state { - 115 => 698, - _ => 457, - }, - 168 => 956, - 169 => 1020, - 170 => 957, - 171 => match state { - 249..=250 | 288 | 291 => 894, - _ => 945, - }, - 172 => match state { - 250 => 292, - 288 => 320, - 291 => 328, - _ => 289, - }, - 173 => match state { - 380 | 382 | 389..=390 => 1128, - _ => 1061, - }, - 174 => match state { - 371 => 1112, - _ => 1021, - }, - 175 => match state { - 327 | 371 => 1022, - _ => 958, - }, - 176 => match state { - 327 | 371 => 1023, - _ => 959, - }, - 177 => 492, - 178 => match state { - 111 => 169, - _ => 32, - }, - 179 => match state { - 12 | 114 => 450, - 79 | 217 => 646, - _ => 458, - }, - 180 => match state { - 12 => 34, - 18 => 44, - 22 | 68 => 69, - 114 => 174, - 118 => 181, - 49 => 571, - 57 => 588, - 64 => 597, - 247 => 892, - 286 => 943, - 354 => 1074, - _ => 459, - }, - 181 => match state { - 79 => 128, - 114 => 175, - 217 => 260, - _ => 35, - }, - 182 => 493, - 183 => match state { - 4 => 423, - 17 => 470, - 106 => 690, - 117 => 700, - _ => 402, - }, - 184 => 613, - 185 => 473, - 186 => match state { - 53 => 576, - _ => 580, - }, - 187 => match state { - 60 => 593, - _ => 587, - }, - 188 => 590, - 189 => match state { - 204 => 823, - _ => 748, - }, - 190 => match state { - 349 => 1067, - 381 => 1130, - 383 => 1134, - _ => 1062, - }, - 191 => 1024, - 192 => 739, - 193 => 466, - 194 => match state { - 349 => 1068, - _ => 1063, - }, - 195 => match state { - 114 => 694, - _ => 451, - }, - 196 => 403, - 197 => match state { - 18 | 118 => 474, - _ => 460, - }, - 198 => 734, - 199 => 960, - 200 => match state { - 183 => 221, - 220 => 263, - 30 => 528, - 65 | 98 => 614, - 167 => 773, - 265 => 915, - _ => 404, - }, - 201 => 615, - 202 => match state { - 143 => 740, - 240 => 882, - 281 | 316 | 339 | 341 | 365 | 377 | 385 | 387..=388 => 936, - _ => 886, - }, - 203 => match state { - 16 => 467, - 82 => 654, - 86 | 132 | 186..=187 | 224 | 269 | 305 | 307 | 334 => 659, - _ => 722, - }, - 206 => 741, - 207 => 468, - 211 => match state { - 135 => 727, - 138 => 730, - 142 => 736, - 189 => 803, - 192 => 806, - 193 => 807, - 227 => 867, - _ => 680, - }, - 212 => 494, - 213 => match state { - 290 => 961, - 323 => 1011, - 326 => 1015, - 352 => 1072, - 356 => 1076, - 357 => 1077, - 358 => 1080, - 370 => 1111, - 379 => 1126, - 381 | 383 => 1131, - _ => 1064, - }, - 215 => 322, - 216 => 405, - 217 => 616, - 218 => 19, - 219 => 495, - 220 => 962, - 221 => match state { - 118 => 702, - _ => 475, - }, - 222 => match state { - 20 => 66, - 65 | 98 => 110, - 160 => 212, - _ => 9, - }, - 223 => 617, - 224 => match state { - 110 => 168, - _ => 31, - }, - 225 => match state { - 76 => 641, - _ => 532, - }, - 226 => 76, - 227 => match state { - 121 => 708, - 123 => 710, - 182 => 794, - _ => 637, - }, - 229 => match state { - 19 => 496, - 46 => 552, - 156 => 761, - 210 => 841, - 255 => 899, - 256 => 903, - 299 => 980, - _ => 686, - }, - 230 => match state { - 12 | 79 | 114 | 217 => 452, - 14 | 18 | 24 | 59 | 78 | 81 | 88 | 115 | 118 | 120 | 122 | 127 | 153..=154 | 163 | 184 | 216 | 222 | 259 | 301 | 331 => 461, - 53..=54 | 77 | 97 | 126 | 144 | 146 => 577, - _ => 406, - }, - 231 => 963, - 232 => match state { - 279 => 313, - 342 => 367, - 366 => 375, - _ => 242, - }, - 234 => match state { - 129 => 185, - 226 => 268, - 267 => 304, - 41 => 545, - _ => 85, - }, - 236 => 256, - 237 => match state { - 120 => 707, - 122 => 709, - _ => 516, - }, - 238 => match state { - 163 => 770, - _ => 517, - }, - 239 => match state { - 150 => 206, - 140 => 732, - 159 => 768, - 172 => 778, - 191 => 805, - 195 => 809, - 196 => 810, - 197 => 811, - 201 => 816, - 228 => 868, - 229 => 869, - 231 => 871, - 233 => 873, - 234 => 874, - 238 => 879, - 244 => 887, - 253 => 897, - 254 => 898, - 271 => 924, - 272 => 925, - 274 => 927, - 276 => 929, - 277 => 930, - 278 => 931, - 287 => 944, - 293 => 971, - 294 => 972, - 295 => 973, - 296 => 974, - 297 => 975, - 300 => 983, - 309 => 995, - 310 => 996, - 311 => 997, - 312 => 999, - 318 => 1007, - 319 => 1008, - 329 => 1032, - 336 => 1046, - 337 => 1047, - 338 => 1048, - 343 => 1056, - 344 => 1057, - 353 => 1073, - 361 => 1086, - 363 => 1092, - 364 => 1093, - 369 => 1105, - 372 => 1116, - 373 => 1117, - 374 => 1118, - _ => 157, - }, - 240 => match state { - 21 => 67, - 65 | 98 => 111, - 161 => 213, - _ => 10, - }, - 241 => 618, - 242 => match state { - 72 => 123, - 95 => 136, - 121 => 182, - 1 | 29 | 37 | 62 | 93..=94 | 145 | 194 | 282 => 407, - 12 => 453, - 14 | 22 | 49 | 57 | 59 | 64 | 68 | 78 | 81 | 88 | 115 | 127 | 153..=154 | 184 | 216 | 222 | 247 | 259 | 286 | 301 | 331 | 354 => 462, - 18 | 118 => 476, - 24 | 120 | 122 | 163 => 518, - 42 => 546, - 50 => 572, - 61 => 594, - 65 | 98 => 619, - 70 => 634, - 71 => 635, - 75 => 639, - 79 => 647, - 80 => 650, - 83 => 655, - 84 => 656, - 87 => 664, - 89 => 665, - 114 => 695, - 119 => 706, - 124 => 711, - 125 => 712, - 137 => 729, - 155 => 760, - 158 => 767, - 171 | 215 | 219 | 262 | 302 | 332 => 776, - 200 => 815, - 209 | 251 => 839, - 211 => 842, - 217 => 849, - 230 => 870, - 232 => 872, - 235 => 875, - 237 => 878, - 239 => 880, - 241 => 883, - 252 => 896, - 257 => 905, - 270 => 923, - 273 => 926, - 275 => 928, - 284 => 940, - 308 => 994, - _ => 497, - }, - 244 => 620, - 247 => match state { - 94 => 673, - _ => 670, - }, - 248 => match state { - 29 => 527, - 282 => 937, - _ => 408, - }, - 250 => match state { - 14 => 38, - 115 => 178, - 18 | 118 => 477, - 59 => 591, - 78 | 184 | 216 | 301 => 644, - 81 | 88 => 651, - 127 | 222 | 259 | 331 => 714, - 153 => 754, - 154 => 757, - _ => 519, - }, - 251 => 391, - 252 => 498, - 253 => 964, - 254 => 965, - 255 => 520, - 256 => 592, - 257 => 104, - 258 => 499, - 259 => match state { - 236 => 876, - _ => 735, - }, - 260 => match state { - 100 => 142, - 134 => 190, - 135 => 192, - 138 => 193, - 189 => 227, - 104 => 688, - _ => 139, - }, - 262 => 742, - 263 => match state { - 65 | 98 => 112, - _ => 11, - }, - 264 => 469, - 265 => 966, - 266 => 500, - 267 => match state { - 65 | 98 => 113, - 215 | 262 | 332 => 845, + 208 => 879, + 296 => 1012, _ => 777, }, - 268 => match state { - 217 => 261, - _ => 176, + 28 => 767, + 34 => 613, + 37 => 474, + 48 => 925, + 52 => match state { + 75 | 122 => 130, + _ => 3, }, - 269 => 621, - 270 => match state { - 98 => 678, - _ => 622, + 55 => 79, + 57 => match state { + 75 | 122 => 131, + _ => 4, + }, + 62 => match state { + 362 => 394, + _ => 393, + }, + 65 => match state { + 19 => 46, + 244 => 290, + 291 => 335, + _ => 188, + }, + 70 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 515, + 75 | 122 => 664, + 326 | 359 | 362 | 381 | 383 | 385 | 388 | 391..=394 | 406 | 415 | 417 | 419 => 1050, + 363 | 407 => 1120, + _ => 428, + }, + 72 => match state { + 134 => 197, + _ => 26, + }, + 79 => match state { + 47 => 102, + 132 => 193, + 357 | 395 => 382, + _ => 21, + }, + 80 => match state { + 363 | 407 => 1121, + _ => 1051, + }, + 81 => 516, + 82 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 517, + 33 => 587, + 75 | 122 => 665, + 115 => 751, + 205 => 874, + _ => 429, + }, + 83 => 666, + 84 => match state { + 3 => 458, + 130 => 773, + _ => 430, + }, + 85 => 667, + 86 => match state { + 48 => 610, + 124 => 763, + 133 => 775, + 163 => 815, + 171 => 826, + 222 => 901, + _ => 464, + }, + 88 => 518, + 89 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 47, + 31 => 85, + 75 | 122 => 132, + 112 => 165, + 200 => 248, + _ => 5, + }, + 90 => 668, + 91 => 1052, + 92 => 519, + 93 => match state { + 109 => 742, + 166 => 817, + _ => 615, + }, + 95 => 109, + 97 => 520, + 98 => 431, + 99 => 669, + 100 => 521, + 101 => match state { + 15 => 39, + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 48, + 60 => 123, + 75 | 122 => 133, + 141 => 211, + _ => 6, + }, + 102 => 670, + 103 => 522, + 104 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 523, + 75 | 122 => 671, + _ => 432, + }, + 105 => 672, + 106 => 110, + 107 => 1053, + 108 => 524, + 109 => 1054, + 110 => match state { + 381 => 1161, + 391 => 1178, + _ => 1055, + }, + 113 => match state { + 38 => 598, + 43 => 604, + 44 => 606, + 80 => 702, + 116 => 752, + 119 => 760, + 144 => 788, + 145 => 790, + 206 => 875, + 210 => 884, + 212 => 885, + 213 => 887, + _ => 588, + }, + 115 => match state { + 26 | 197 => 84, + _ => 27, + }, + 116 => 433, + 117 => 673, + 118 => match state { + 244 => 940, + 291 => 1004, + _ => 525, + }, + 119 => match state { + 299 | 339 => 1015, + _ => 958, + }, + 121 => match state { + 298 => 339, + _ => 299, + }, + 122 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 526, + 75 | 122 => 674, + 326 | 359 | 361..=363 | 381..=383 | 385 | 388 | 391..=394 | 406..=407 | 415 | 417 | 419 => 1056, + _ => 434, + }, + 123 => match state { + 361 => 1117, + 382 => 1162, + _ => 1057, + }, + 124 => match state { + 363 | 407 => 395, + _ => 357, + }, + 125 => match state { + 49 => 611, + _ => 527, + }, + 127 => 49, + 128 => 528, + 129 => match state { + 98 => 731, + _ => 507, + }, + 130 => match state { + 76 => 144, + 143 => 212, + 98 => 732, + _ => 43, + }, + 131 => match state { + 76 => 695, + 143 => 785, + _ => 508, + }, + 133 => match state { + 68 => 655, + 126 => 765, + 184 => 848, + _ => 647, + }, + 134 => 921, + 136 => match state { + 241 => 932, + _ => 859, + }, + 137 => 241, + 138 => match state { + 242 => 935, + _ => 860, + }, + 139 => 242, + 140 => 50, + 141 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 51, + 75 | 122 => 134, + 13 => 492, + 27 => 579, + 36 => 595, + 45 => 608, + 63..=64 | 88 | 121 | 153 | 176 | 178 => 639, + 84 => 707, + 118 => 757, + 202 => 870, + 209 => 882, + 252 => 951, + 293 => 1008, + _ => 7, + }, + 142 => 675, + 143 => match state { + 88 => 711, + 121 => 761, + 153 => 801, + _ => 644, + }, + 144 => 640, + 145 => 1016, + 146 => match state { + 176 | 178 => 839, + _ => 641, + }, + 147 => 529, + 148 => 530, + 149 => match state { + 11 => 484, + 25 => 578, + 32 => 586, + 55 => 631, + 105 => 739, + 113 => 750, + 137 => 776, + 196 => 866, + 201 => 869, + _ => 435, + }, + 150 => 676, + 151 => 531, + 152 => 532, + 153 => 533, + 154 => match state { + 79 => 698, + _ => 569, + }, + 156 => 645, + 157 => match state { + 1 => 8, + 37 => 596, + 72 => 661, + 110..=111 => 743, + 177 => 840, + 228 => 908, + _ => 52, + }, + 158 => 534, + 159 => 1113, + 160 => 535, + 161 => match state { + 61 => 124, + 62 => 125, + 106 => 163, + 107 => 164, + 120 => 170, + 162 => 221, + 12 | 14 | 18 | 24 | 56..=58 | 67 | 69 | 74 | 76 | 89..=90 | 92 | 99 | 104 | 139..=140 | 143 | 147 | 149 | 154 | 167..=168 | 185..=186 | 195 | 216 | 225 | 250..=251 | 256 | 266 | 282 | 294 | 310 | 322 | 337 | 367 | 390 => 485, + 16 | 93 | 97 | 158..=159 | 218..=220 | 257..=259 | 301 | 304 | 341..=343 | 369..=371 | 398 => 500, + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 536, + 22 | 79 => 570, + 23 => 572, + 40..=41 | 156 | 260 | 302 => 601, + 66 | 70 => 652, + 73 => 662, + 75 | 122 => 677, + 103 => 737, + 173 | 271 => 828, + 175 | 275 | 278 | 317 | 319 | 350..=352 | 375..=377 | 401 | 404 | 412..=414 | 421..=424 => 832, + 179 | 238 => 841, + 180 => 845, + 181 => 846, + 183 => 847, + 194 => 864, + 232 => 913, + 233 => 914, + 236 | 315 | 378 | 402 => 920, + 237 => 922, + 239 => 924, + 280 => 990, + 281 | 321 => 991, + 283 => 995, + 326 | 359 | 362 | 381 | 388 | 391..=394 | 406 | 415 => 1058, + 334 => 1079, + 353 => 1109, + 360 => 1116, + 363 | 407 => 1122, + 366 => 1136, + 383 | 385 | 417 | 419 => 1163, + 384 => 1169, + 386 => 1173, + 387 => 1174, + 396 => 1188, + 416 | 418 | 425..=426 => 1230, + 420 => 1240, + _ => 436, + }, + 162 => 537, + 165 => 842, + 166 => match state { + 126 => 766, + _ => 648, + }, + 168 => 126, + 169 => 649, + 170 => 538, + 171 => match state { + 275 => 983, + 278 => 987, + 317 => 1038, + 319 => 1041, + 350 => 1104, + 351 => 1105, + 352 => 1107, + 375 => 1152, + 376 => 1153, + 377 => 1155, + 401 => 1198, + 404 => 1203, + 412 => 1225, + 413 => 1226, + 414 => 1227, + 421 => 1242, + 422 => 1243, + 423 => 1246, + 424 => 1253, + _ => 833, + }, + 172 => match state { + 93 => 722, + 97 => 727, + 158 => 809, + 159 => 811, + 218 => 895, + 219 => 896, + 220 => 898, + 257 => 960, + 258 => 961, + 259 => 963, + 301 => 1019, + 304 => 1024, + 341 => 1093, + 342 => 1094, + 343 => 1095, + 369 => 1143, + 370 => 1144, + 371 => 1147, + 398 => 1192, + _ => 501, + }, + 173 => match state { + 75 | 122 => 678, + _ => 437, + }, + 174 => 746, + 175 => 539, + 176 => match state { + 58 => 636, + 140 => 782, + _ => 493, + }, + 178 => 1059, + 179 => 1123, + 180 => 1060, + 181 => match state { + 284..=285 | 324 | 327 => 996, + _ => 1048, + }, + 182 => match state { + 285 => 328, + 324 => 356, + 327 => 364, + _ => 325, + }, + 183 => match state { + 416 | 418 | 425..=426 => 1231, + _ => 1164, + }, + 184 => match state { + 407 => 1215, + _ => 1124, + }, + 185 => match state { + 363 | 407 => 1125, + _ => 1061, + }, + 186 => match state { + 363 | 407 => 1126, + _ => 1062, + }, + 187 => 540, + 188 => match state { + 54 => 113, + 136 => 201, + _ => 32, + }, + 189 => match state { + 12 | 56 | 139 => 486, + 90 | 168 | 251 => 715, + _ => 494, + }, + 190 => match state { + 12 => 34, + 18 => 44, + 22 | 79 => 80, + 56 => 116, + 76 => 145, + 139 => 206, + 143 => 213, + 57 => 635, + 67 => 654, + 74 => 663, + 282 => 994, + 322 => 1046, + 390 => 1177, + _ => 495, + }, + 191 => match state { + 56 => 117, + 90 => 155, + 139 => 207, + 168 => 226, + 251 => 295, + _ => 35, + }, + 192 => 541, + 193 => match state { + 4 => 459, + 17 => 506, + 131 => 774, + 142 => 784, + _ => 438, + }, + 194 => 679, + 195 => 509, + 196 => match state { + 63 => 642, + _ => 646, + }, + 197 => match state { + 70 => 659, + _ => 653, + }, + 198 => 656, + 199 => match state { + 238 => 923, + _ => 843, + }, + 200 => match state { + 385 => 1170, + 417 => 1233, + 419 => 1237, + _ => 1165, + }, + 201 => 1127, + 202 => 834, + 203 => 502, + 204 => match state { + 385 => 1171, + _ => 1166, + }, + 205 => match state { + 56 => 632, + 139 => 778, + _ => 487, + }, + 206 => 439, + 207 => match state { + 18 | 76 | 143 => 510, + _ => 496, + }, + 208 => 829, + 209 => 1063, + 210 => match state { + 215 => 255, + 254 => 298, + 30 => 585, + 75 | 122 => 680, + 199 => 868, + 300 => 1017, + _ => 440, + }, + 211 => 681, + 212 => match state { + 175 => 835, + 275 => 984, + 317 | 352 | 375 | 377 | 401 | 413 | 421 | 423..=424 => 1039, + _ => 988, + }, + 213 => match state { + 16 => 503, + 93 => 723, + 97 | 159 | 218..=219 | 258 | 304 | 341 | 343 | 370 => 728, + _ => 810, + }, + 216 => 836, + 217 => 504, + 221 => match state { + 164 => 816, + 170 => 825, + 174 => 831, + 221 => 900, + 224 => 903, + 227 => 907, + 261 => 967, + _ => 764, + }, + 222 => 542, + 223 => match state { + 326 => 1064, + 359 => 1114, + 362 => 1118, + 388 => 1175, + 392 => 1179, + 393 => 1180, + 394 => 1183, + 406 => 1214, + 415 => 1229, + 417 | 419 => 1234, + _ => 1167, + }, + 225 => 358, + 226 => 543, + 227 => 441, + 228 => 682, + 229 => 19, + 230 => 544, + 231 => 1065, + 232 => match state { + 76 => 696, + 143 => 786, + _ => 511, + }, + 233 => 545, + 234 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 53, + 20 => 77, + 75 | 122 => 135, + 101 => 160, + 192 => 246, + _ => 9, + }, + 235 => 683, + 236 => match state { + 53 => 112, + 135 => 200, + _ => 31, + }, + 237 => match state { + 87 => 710, + _ => 589, + }, + 238 => 87, + 239 => match state { + 148 => 796, + 150 => 798, + 214 => 891, + _ => 706, + }, + 241 => match state { + 19 => 546, + 46 => 609, + 188 => 856, + 244 => 941, + 290 => 1001, + 291 => 1005, + 335 => 1083, + _ => 770, + }, + 242 => match state { + 12 | 56 | 90 | 139 | 168 | 251 => 488, + 14 | 18 | 24 | 58 | 69 | 76 | 89 | 92 | 99 | 104 | 140 | 143 | 147 | 149 | 154 | 167 | 185..=186 | 195 | 216 | 225 | 250 | 256 | 266 | 294 | 310 | 337 | 367 => 497, + 63..=64 | 88 | 121 | 153 | 176 | 178 => 643, + _ => 442, + }, + 243 => 1066, + 244 => match state { + 315 => 349, + 378 => 403, + 402 => 411, + _ => 277, + }, + 246 => match state { + 156 => 217, + 260 => 303, + 302 => 340, + 41 => 602, + _ => 96, + }, + 248 => 291, + 249 => match state { + 147 => 795, + 149 => 797, + _ => 573, + }, + 250 => match state { + 104 => 738, + 195 => 865, + _ => 574, + }, + 251 => match state { + 182 => 240, + 172 => 827, + 191 => 863, + 204 => 873, + 223 => 902, + 229 => 909, + 230 => 910, + 231 => 911, + 235 => 916, + 262 => 968, + 263 => 969, + 265 => 971, + 268 => 975, + 269 => 976, + 273 => 981, + 279 => 989, + 288 => 999, + 289 => 1000, + 306 => 1026, + 307 => 1027, + 309 => 1029, + 312 => 1032, + 313 => 1033, + 314 => 1034, + 323 => 1047, + 329 => 1074, + 330 => 1075, + 331 => 1076, + 332 => 1077, + 333 => 1078, + 336 => 1086, + 345 => 1098, + 346 => 1099, + 347 => 1100, + 348 => 1102, + 354 => 1110, + 355 => 1111, + 365 => 1135, + 372 => 1149, + 373 => 1150, + 374 => 1151, + 379 => 1159, + 380 => 1160, + 389 => 1176, + 397 => 1189, + 399 => 1195, + 400 => 1196, + 405 => 1208, + 408 => 1219, + 409 => 1220, + 410 => 1221, + _ => 189, + }, + 252 => 547, + 253 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 54, + 21 => 78, + 75 | 122 => 136, + 102 => 161, + 193 => 247, + _ => 10, + }, + 254 => 684, + 255 => match state { + 83 => 150, + 114 => 166, + 148 => 214, + 1 | 29 | 37 | 72 | 110..=111 | 177 | 228 | 318 => 443, + 12 | 56 => 489, + 14 | 22 | 57..=58 | 67 | 69 | 74 | 79 | 89 | 92 | 99 | 140 | 154 | 167 | 185..=186 | 216 | 225 | 250 | 256 | 266 | 282 | 294 | 310 | 322 | 337 | 367 | 390 => 498, + 18 | 76 | 143 => 512, + 24 | 104 | 147 | 149 | 195 => 575, + 42 => 603, + 59 => 638, + 71 => 660, + 75 | 122 => 685, + 81 => 703, + 82 => 704, + 86 => 708, + 90 | 168 => 716, + 91 => 719, + 94 => 724, + 95 => 725, + 98 => 733, + 100 => 734, + 139 => 779, + 146 => 794, + 151 => 799, + 152 => 800, + 169 => 824, + 187 => 855, + 190 => 862, + 203 | 249 | 253 | 297 | 338 | 368 => 871, + 234 => 915, + 243 | 286 => 939, + 245 => 942, + 251 => 949, + 264 => 970, + 267 => 974, + 270 => 977, + 272 => 980, + 274 => 982, + 276 => 985, + 287 => 998, + 292 => 1007, + 305 => 1025, + 308 => 1028, + 311 => 1031, + 320 => 1043, + 344 => 1097, + _ => 548, + }, + 257 => 686, + 260 => match state { + 111 => 747, + _ => 744, + }, + 261 => match state { + 29 => 584, + 318 => 1040, + _ => 444, + }, + 263 => match state { + 14 => 38, + 58 => 119, + 140 => 210, + 18 | 76 | 143 => 513, + 24 | 104 | 147 | 149 | 195 => 576, + 69 => 657, + 92 | 99 => 720, + 154 | 225 | 256 | 294 | 310 | 367 => 802, + 185 => 849, + 186 => 852, + _ => 713, + }, + 264 => 427, + 265 => 549, + 266 => 1067, + 267 => 1068, + 268 => 577, + 269 => 658, + 270 => 129, + 271 => 550, + 272 => match state { + 271 => 978, + _ => 830, }, - 272 => 501, 273 => match state { - 28 => 525, - 65 | 98 => 623, - 166 => 772, - _ => 409, + 125 => 174, + 163 => 222, + 164 => 224, + 170 => 227, + 221 => 261, + 129 => 772, + _ => 171, }, - 274 => 624, - 275 => match state { - 12 => 454, - 93..=94 => 671, - 114 => 696, - _ => 502, + 275 => 837, + 276 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 55, + 75 | 122 => 137, + _ => 11, + }, + 277 => 505, + 278 => 1069, + 279 => 551, + 280 => match state { + 75 | 122 => 138, + 249 | 297 | 368 => 945, + _ => 872, + }, + 281 => match state { + 251 => 296, + _ => 208, + }, + 282 => 687, + 283 => match state { + 122 => 762, + _ => 688, + }, + 285 => 552, + 286 => 553, + 287 => match state { + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 554, + 28 => 582, + 75 | 122 => 689, + 108 => 741, + 198 => 867, + _ => 445, + }, + 288 => 690, + 289 => match state { + 12 => 490, + 56 => 633, + 110..=111 => 745, + 139 => 780, + _ => 555, }, _ => 0, } @@ -5609,6 +6081,7 @@ mod __parse__Top { r###"">=""###, r###"">>""###, r###"">>=""###, + r###""?""###, r###""@""###, r###""@=""###, r###""False""###, @@ -5735,7 +6208,7 @@ mod __parse__Top { #[inline] fn error_action(&self, state: i16) -> i16 { - __action(state, 96 - 1) + __action(state, 97 - 1) } #[inline] @@ -5838,65 +6311,66 @@ mod __parse__Top { token::Tok::GreaterEqual if true => Some(34), token::Tok::RightShift if true => Some(35), token::Tok::RightShiftEqual if true => Some(36), - token::Tok::At if true => Some(37), - token::Tok::AtEqual if true => Some(38), - token::Tok::False if true => Some(39), - token::Tok::None if true => Some(40), - token::Tok::True if true => Some(41), - token::Tok::Lsqb if true => Some(42), - token::Tok::Rsqb if true => Some(43), - token::Tok::CircumFlex if true => Some(44), - token::Tok::CircumflexEqual if true => Some(45), - token::Tok::And if true => Some(46), - token::Tok::As if true => Some(47), - token::Tok::Assert if true => Some(48), - token::Tok::Async if true => Some(49), - token::Tok::Await if true => Some(50), - token::Tok::Break if true => Some(51), - token::Tok::Case if true => Some(52), - token::Tok::Class if true => Some(53), - token::Tok::Continue if true => Some(54), - token::Tok::Def if true => Some(55), - token::Tok::Del if true => Some(56), - token::Tok::Elif if true => Some(57), - token::Tok::Else if true => Some(58), - token::Tok::Except if true => Some(59), - token::Tok::Finally if true => Some(60), - token::Tok::For if true => Some(61), - token::Tok::From if true => Some(62), - token::Tok::Global if true => Some(63), - token::Tok::If if true => Some(64), - token::Tok::Import if true => Some(65), - token::Tok::In if true => Some(66), - token::Tok::Is if true => Some(67), - token::Tok::Lambda if true => Some(68), - token::Tok::Match if true => Some(69), - token::Tok::Nonlocal if true => Some(70), - token::Tok::Not if true => Some(71), - token::Tok::Or if true => Some(72), - token::Tok::Pass if true => Some(73), - token::Tok::Raise if true => Some(74), - token::Tok::Return if true => Some(75), - token::Tok::Try if true => Some(76), - token::Tok::Type if true => Some(77), - token::Tok::While if true => Some(78), - token::Tok::With if true => Some(79), - token::Tok::Yield if true => Some(80), - token::Tok::Lbrace if true => Some(81), - token::Tok::Vbar if true => Some(82), - token::Tok::VbarEqual if true => Some(83), - token::Tok::Rbrace if true => Some(84), - token::Tok::Tilde if true => Some(85), - token::Tok::Dedent if true => Some(86), - token::Tok::Indent if true => Some(87), - token::Tok::StartExpression if true => Some(88), - token::Tok::StartModule if true => Some(89), - token::Tok::Complex { real: _, imag: _ } if true => Some(90), - token::Tok::Float { value: _ } if true => Some(91), - token::Tok::Int { value: _ } if true => Some(92), - token::Tok::MagicCommand { kind: _, value: _ } if true => Some(93), - token::Tok::Name { name: _ } if true => Some(94), - token::Tok::String { value: _, kind: _, triple_quoted: _ } if true => Some(95), + token::Tok::Question if true => Some(37), + token::Tok::At if true => Some(38), + token::Tok::AtEqual if true => Some(39), + token::Tok::False if true => Some(40), + token::Tok::None if true => Some(41), + token::Tok::True if true => Some(42), + token::Tok::Lsqb if true => Some(43), + token::Tok::Rsqb if true => Some(44), + token::Tok::CircumFlex if true => Some(45), + token::Tok::CircumflexEqual if true => Some(46), + token::Tok::And if true => Some(47), + token::Tok::As if true => Some(48), + token::Tok::Assert if true => Some(49), + token::Tok::Async if true => Some(50), + token::Tok::Await if true => Some(51), + token::Tok::Break if true => Some(52), + token::Tok::Case if true => Some(53), + token::Tok::Class if true => Some(54), + token::Tok::Continue if true => Some(55), + token::Tok::Def if true => Some(56), + token::Tok::Del if true => Some(57), + token::Tok::Elif if true => Some(58), + token::Tok::Else if true => Some(59), + token::Tok::Except if true => Some(60), + token::Tok::Finally if true => Some(61), + token::Tok::For if true => Some(62), + token::Tok::From if true => Some(63), + token::Tok::Global if true => Some(64), + token::Tok::If if true => Some(65), + token::Tok::Import if true => Some(66), + token::Tok::In if true => Some(67), + token::Tok::Is if true => Some(68), + token::Tok::Lambda if true => Some(69), + token::Tok::Match if true => Some(70), + token::Tok::Nonlocal if true => Some(71), + token::Tok::Not if true => Some(72), + token::Tok::Or if true => Some(73), + token::Tok::Pass if true => Some(74), + token::Tok::Raise if true => Some(75), + token::Tok::Return if true => Some(76), + token::Tok::Try if true => Some(77), + token::Tok::Type if true => Some(78), + token::Tok::While if true => Some(79), + token::Tok::With if true => Some(80), + token::Tok::Yield if true => Some(81), + token::Tok::Lbrace if true => Some(82), + token::Tok::Vbar if true => Some(83), + token::Tok::VbarEqual if true => Some(84), + token::Tok::Rbrace if true => Some(85), + token::Tok::Tilde if true => Some(86), + token::Tok::Dedent if true => Some(87), + token::Tok::Indent if true => Some(88), + token::Tok::StartExpression if true => Some(89), + token::Tok::StartModule if true => Some(90), + token::Tok::Complex { real: _, imag: _ } if true => Some(91), + token::Tok::Float { value: _ } if true => Some(92), + token::Tok::Int { value: _ } if true => Some(93), + token::Tok::MagicCommand { kind: _, value: _ } if true => Some(94), + token::Tok::Name { name: _ } if true => Some(95), + token::Tok::String { value: _, kind: _, triple_quoted: _ } if true => Some(96), _ => None, } } @@ -5908,28 +6382,28 @@ mod __parse__Top { ) -> __Symbol<> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 => __Symbol::Variant0(__token), - 90 => match __token { + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 => __Symbol::Variant0(__token), + 91 => match __token { token::Tok::Complex { real: __tok0, imag: __tok1 } if true => __Symbol::Variant1((__tok0, __tok1)), _ => unreachable!(), }, - 91 => match __token { + 92 => match __token { token::Tok::Float { value: __tok0 } if true => __Symbol::Variant2(__tok0), _ => unreachable!(), }, - 92 => match __token { + 93 => match __token { token::Tok::Int { value: __tok0 } if true => __Symbol::Variant3(__tok0), _ => unreachable!(), }, - 93 => match __token { + 94 => match __token { token::Tok::MagicCommand { kind: __tok0, value: __tok1 } if true => __Symbol::Variant4((__tok0, __tok1)), _ => unreachable!(), }, - 94 => match __token { + 95 => match __token { token::Tok::Name { name: __tok0 } if true => __Symbol::Variant5(__tok0), _ => unreachable!(), }, - 95 => match __token { + 96 => match __token { token::Tok::String { value: __tok0, kind: __tok1, triple_quoted: __tok2 } if true => __Symbol::Variant6((__tok0, __tok1, __tok2)), _ => unreachable!(), }, @@ -6437,13 +6911,13 @@ mod __parse__Top { } 82 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 1, nonterminal_produced: 34, } } 83 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 34, } } @@ -6455,37 +6929,37 @@ mod __parse__Top { } 85 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 35, + states_to_pop: 0, + nonterminal_produced: 36, } } 86 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 36, } } 87 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 37, } } 88 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 2, nonterminal_produced: 37, } } 89 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 2, nonterminal_produced: 38, } } 90 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 2, nonterminal_produced: 39, } } @@ -6515,13 +6989,13 @@ mod __parse__Top { } 95 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 3, nonterminal_produced: 42, } } 96 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 3, nonterminal_produced: 43, } } @@ -6533,19 +7007,19 @@ mod __parse__Top { } 98 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, + states_to_pop: 2, nonterminal_produced: 44, } } 99 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 2, nonterminal_produced: 45, } } 100 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 0, nonterminal_produced: 45, } } @@ -6557,43 +7031,43 @@ mod __parse__Top { } 102 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 46, + states_to_pop: 0, + nonterminal_produced: 47, } } 103 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 1, nonterminal_produced: 47, } } 104 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 4, nonterminal_produced: 48, } } 105 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 5, nonterminal_produced: 48, } } 106 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 3, nonterminal_produced: 49, } } 107 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 3, nonterminal_produced: 50, } } 108 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 0, nonterminal_produced: 50, } } @@ -6605,13 +7079,13 @@ mod __parse__Top { } 110 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 2, nonterminal_produced: 52, } } 111 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 52, } } @@ -6623,13 +7097,13 @@ mod __parse__Top { } 113 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 53, + states_to_pop: 0, + nonterminal_produced: 54, } } 114 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 54, } } @@ -6659,7 +7133,7 @@ mod __parse__Top { } 119 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 3, nonterminal_produced: 57, } } @@ -6671,13 +7145,13 @@ mod __parse__Top { } 121 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 2, nonterminal_produced: 59, } } 122 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 0, nonterminal_produced: 59, } } @@ -6689,25 +7163,25 @@ mod __parse__Top { } 124 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 60, + states_to_pop: 0, + nonterminal_produced: 61, } } 125 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 61, } } 126 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 2, nonterminal_produced: 62, } } 127 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 62, } } @@ -6719,13 +7193,13 @@ mod __parse__Top { } 129 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 63, + states_to_pop: 0, + nonterminal_produced: 64, } } 130 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 1, nonterminal_produced: 64, } } @@ -6737,67 +7211,67 @@ mod __parse__Top { } 132 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 66, + states_to_pop: 3, + nonterminal_produced: 65, } } 133 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 3, nonterminal_produced: 66, } } 134 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 67, } } 135 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 68, } } 136 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 0, nonterminal_produced: 68, } } 137 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 69, } } 138 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 70, } } 139 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 2, nonterminal_produced: 70, } } 140 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 71, } } 141 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 72, } } 142 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 3, nonterminal_produced: 72, } } @@ -6821,37 +7295,37 @@ mod __parse__Top { } 146 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 1, nonterminal_produced: 75, } } 147 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 1, nonterminal_produced: 76, } } 148 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 77, + states_to_pop: 0, + nonterminal_produced: 76, } } 149 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 0, nonterminal_produced: 77, } } 150 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 0, nonterminal_produced: 78, } } 151 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 1, nonterminal_produced: 79, } } @@ -6869,80 +7343,80 @@ mod __parse__Top { } 154 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 80, + states_to_pop: 3, + nonterminal_produced: 81, } } 155 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 81, } } 156 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 81, + states_to_pop: 3, + nonterminal_produced: 82, } } 157 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 82, } } 158 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 82, + states_to_pop: 3, + nonterminal_produced: 83, } } 159 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 1, nonterminal_produced: 83, } } 160 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 83, + nonterminal_produced: 84, } } 161 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 83, + states_to_pop: 1, + nonterminal_produced: 84, } } 162 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 83, + states_to_pop: 2, + nonterminal_produced: 85, } } 163 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 84, + nonterminal_produced: 85, } } 164 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 84, + states_to_pop: 3, + nonterminal_produced: 86, } } 165 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 85, + states_to_pop: 2, + nonterminal_produced: 86, } } 166 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 85, + states_to_pop: 4, + nonterminal_produced: 86, } } 167 => { @@ -6954,42 +7428,42 @@ mod __parse__Top { 168 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 86, + nonterminal_produced: 87, } } 169 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 0, nonterminal_produced: 87, } } 170 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, + states_to_pop: 3, nonterminal_produced: 88, } } 171 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 88, } } 172 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 3, nonterminal_produced: 89, } } 173 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 89, } } 174 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, + states_to_pop: 3, nonterminal_produced: 90, } } @@ -7001,637 +7475,637 @@ mod __parse__Top { } 176 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 91, } } 177 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 91, + states_to_pop: 4, + nonterminal_produced: 92, } } 178 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 92, } } 179 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 92, + states_to_pop: 2, + nonterminal_produced: 93, } } 180 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 93, } } 181 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 93, + states_to_pop: 0, + nonterminal_produced: 94, } } 182 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 93, + nonterminal_produced: 94, } } 183 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 93, + states_to_pop: 1, + nonterminal_produced: 95, } } 184 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 93, + nonterminal_produced: 95, } } 185 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 93, + states_to_pop: 1, + nonterminal_produced: 96, } } 186 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 93, + states_to_pop: 0, + nonterminal_produced: 96, } } 187 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 93, + states_to_pop: 1, + nonterminal_produced: 97, } } 188 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 93, + states_to_pop: 1, + nonterminal_produced: 97, } } 189 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 93, + states_to_pop: 1, + nonterminal_produced: 97, } } 190 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 93, + states_to_pop: 3, + nonterminal_produced: 97, } } 191 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 93, + states_to_pop: 2, + nonterminal_produced: 97, } } 192 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 93, + states_to_pop: 4, + nonterminal_produced: 97, } } 193 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 93, + states_to_pop: 4, + nonterminal_produced: 97, } } 194 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 93, + states_to_pop: 3, + nonterminal_produced: 97, } } 195 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 93, + states_to_pop: 6, + nonterminal_produced: 97, } } 196 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 93, + states_to_pop: 4, + nonterminal_produced: 97, } } 197 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 93, + states_to_pop: 7, + nonterminal_produced: 97, } } 198 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 93, + states_to_pop: 5, + nonterminal_produced: 97, } } 199 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 93, + states_to_pop: 5, + nonterminal_produced: 97, } } 200 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 93, + nonterminal_produced: 97, } } 201 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 93, + states_to_pop: 6, + nonterminal_produced: 97, } } 202 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 93, + nonterminal_produced: 97, } } 203 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 93, + states_to_pop: 2, + nonterminal_produced: 97, } } 204 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 93, + states_to_pop: 3, + nonterminal_produced: 97, } } 205 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 93, + states_to_pop: 4, + nonterminal_produced: 97, } } 206 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 93, + states_to_pop: 4, + nonterminal_produced: 97, } } 207 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 93, + states_to_pop: 3, + nonterminal_produced: 97, } } 208 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 93, + states_to_pop: 2, + nonterminal_produced: 97, } } 209 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 94, + states_to_pop: 4, + nonterminal_produced: 97, } } 210 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 94, + states_to_pop: 3, + nonterminal_produced: 97, } } 211 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 94, + states_to_pop: 4, + nonterminal_produced: 97, } } 212 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 94, + states_to_pop: 1, + nonterminal_produced: 97, } } 213 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 94, + states_to_pop: 1, + nonterminal_produced: 97, } } 214 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 94, + states_to_pop: 1, + nonterminal_produced: 97, } } 215 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 94, + states_to_pop: 1, + nonterminal_produced: 97, } } 216 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 94, + states_to_pop: 1, + nonterminal_produced: 98, } } 217 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 94, + states_to_pop: 1, + nonterminal_produced: 98, } } 218 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 94, + states_to_pop: 1, + nonterminal_produced: 98, } } 219 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 94, + states_to_pop: 3, + nonterminal_produced: 98, } } 220 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 94, + states_to_pop: 2, + nonterminal_produced: 98, } } 221 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 94, + states_to_pop: 4, + nonterminal_produced: 98, } } 222 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 94, + nonterminal_produced: 98, } } 223 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 94, + states_to_pop: 3, + nonterminal_produced: 98, } } 224 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 94, + states_to_pop: 6, + nonterminal_produced: 98, } } 225 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 94, + nonterminal_produced: 98, } } 226 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 94, + states_to_pop: 7, + nonterminal_produced: 98, } } 227 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 94, + states_to_pop: 5, + nonterminal_produced: 98, } } 228 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 94, + states_to_pop: 5, + nonterminal_produced: 98, } } 229 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 94, + states_to_pop: 3, + nonterminal_produced: 98, } } 230 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 94, + states_to_pop: 6, + nonterminal_produced: 98, } } 231 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 94, + nonterminal_produced: 98, } } 232 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 94, + states_to_pop: 2, + nonterminal_produced: 98, } } 233 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 94, + states_to_pop: 3, + nonterminal_produced: 98, } } 234 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 94, + states_to_pop: 4, + nonterminal_produced: 98, } } 235 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 94, + states_to_pop: 4, + nonterminal_produced: 98, } } 236 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 95, + states_to_pop: 3, + nonterminal_produced: 98, } } 237 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 95, + nonterminal_produced: 98, } } 238 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 95, + nonterminal_produced: 98, } } 239 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 95, + nonterminal_produced: 98, } } 240 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 96, + states_to_pop: 4, + nonterminal_produced: 98, } } 241 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 96, + states_to_pop: 1, + nonterminal_produced: 98, } } 242 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 96, + states_to_pop: 1, + nonterminal_produced: 98, } } 243 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 96, + states_to_pop: 1, + nonterminal_produced: 98, } } 244 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 97, + states_to_pop: 1, + nonterminal_produced: 98, } } 245 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 97, + nonterminal_produced: 99, } } 246 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 98, + states_to_pop: 1, + nonterminal_produced: 99, } } 247 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 98, + nonterminal_produced: 99, } } 248 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 99, } } 249 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 99, } } 250 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 4, nonterminal_produced: 99, } } 251 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 6, nonterminal_produced: 99, } } 252 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 4, nonterminal_produced: 99, } } 253 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 7, nonterminal_produced: 99, } } 254 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 5, nonterminal_produced: 99, } } 255 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 5, nonterminal_produced: 99, } } 256 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 99, } } 257 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 6, nonterminal_produced: 99, } } 258 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 4, nonterminal_produced: 99, } } 259 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 99, } } 260 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 99, } } 261 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 100, + states_to_pop: 4, + nonterminal_produced: 99, } } 262 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 101, + states_to_pop: 4, + nonterminal_produced: 99, } } 263 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 101, + states_to_pop: 3, + nonterminal_produced: 99, } } 264 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 101, + states_to_pop: 2, + nonterminal_produced: 99, } } 265 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 101, + states_to_pop: 4, + nonterminal_produced: 99, } } 266 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 101, + states_to_pop: 3, + nonterminal_produced: 99, } } 267 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 101, + nonterminal_produced: 99, } } 268 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 101, + states_to_pop: 1, + nonterminal_produced: 99, } } 269 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 101, + states_to_pop: 1, + nonterminal_produced: 99, } } 270 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 102, + states_to_pop: 1, + nonterminal_produced: 99, } } 271 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 102, + states_to_pop: 1, + nonterminal_produced: 99, } } 272 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 102, + states_to_pop: 1, + nonterminal_produced: 100, } } 273 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 102, + states_to_pop: 2, + nonterminal_produced: 100, } } 274 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 102, + states_to_pop: 4, + nonterminal_produced: 100, } } 275 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 102, + states_to_pop: 3, + nonterminal_produced: 100, } } 276 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 102, + states_to_pop: 1, + nonterminal_produced: 101, } } 277 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 102, + states_to_pop: 2, + nonterminal_produced: 101, } } 278 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 102, + states_to_pop: 4, + nonterminal_produced: 101, } } 279 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 102, + states_to_pop: 3, + nonterminal_produced: 101, } } 280 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, + states_to_pop: 1, nonterminal_produced: 102, } } 281 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, + states_to_pop: 2, nonterminal_produced: 102, } } @@ -7649,7 +8123,7 @@ mod __parse__Top { } 284 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 103, } } @@ -7661,80 +8135,80 @@ mod __parse__Top { } 286 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 103, + states_to_pop: 2, + nonterminal_produced: 104, } } 287 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 103, + nonterminal_produced: 104, } } 288 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 103, + states_to_pop: 2, + nonterminal_produced: 105, } } 289 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 103, + nonterminal_produced: 105, } } 290 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 103, + nonterminal_produced: 106, } } 291 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 104, + nonterminal_produced: 106, } } 292 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 104, + states_to_pop: 1, + nonterminal_produced: 106, } } 293 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 104, + states_to_pop: 1, + nonterminal_produced: 106, } } 294 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 104, + nonterminal_produced: 106, } } 295 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 105, + nonterminal_produced: 106, } } 296 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 105, + states_to_pop: 1, + nonterminal_produced: 106, } } 297 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 105, + states_to_pop: 1, + nonterminal_produced: 106, } } 298 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 105, + nonterminal_produced: 106, } } 299 => { @@ -7746,3694 +8220,4030 @@ mod __parse__Top { 300 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 107, + nonterminal_produced: 106, } } 301 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 107, + states_to_pop: 1, + nonterminal_produced: 106, } } 302 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 108, + nonterminal_produced: 106, } } 303 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 108, + nonterminal_produced: 107, } } 304 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 6, nonterminal_produced: 108, } } 305 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 5, nonterminal_produced: 108, } } 306 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 7, nonterminal_produced: 108, } } 307 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 6, nonterminal_produced: 108, } } 308 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 5, nonterminal_produced: 108, } } 309 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 4, nonterminal_produced: 108, } } 310 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 6, nonterminal_produced: 108, } } 311 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 5, nonterminal_produced: 108, } } 312 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 7, nonterminal_produced: 109, } } 313 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 6, nonterminal_produced: 109, } } 314 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 110, + states_to_pop: 5, + nonterminal_produced: 109, } } 315 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 110, + states_to_pop: 4, + nonterminal_produced: 109, } } 316 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 5, + nonterminal_produced: 109, } } 317 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 4, + nonterminal_produced: 109, } } 318 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 3, + nonterminal_produced: 109, } } 319 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 7, + nonterminal_produced: 109, } } 320 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 6, + nonterminal_produced: 109, } } 321 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 5, + nonterminal_produced: 109, } } 322 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 4, + nonterminal_produced: 109, } } 323 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 111, + states_to_pop: 5, + nonterminal_produced: 109, } } 324 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 112, + states_to_pop: 4, + nonterminal_produced: 109, } } 325 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 113, + states_to_pop: 3, + nonterminal_produced: 109, } } 326 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 113, + nonterminal_produced: 110, } } 327 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 114, + nonterminal_produced: 110, } } 328 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 114, + states_to_pop: 1, + nonterminal_produced: 110, } } 329 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 115, + nonterminal_produced: 110, } } 330 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 115, + nonterminal_produced: 110, } } 331 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 115, + nonterminal_produced: 110, } } 332 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 116, + nonterminal_produced: 110, } } 333 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 117, + nonterminal_produced: 111, } } 334 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 117, + states_to_pop: 0, + nonterminal_produced: 111, } } 335 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 118, + states_to_pop: 2, + nonterminal_produced: 111, } } 336 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 119, + states_to_pop: 1, + nonterminal_produced: 111, } } 337 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 119, + nonterminal_produced: 112, } } 338 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 120, + states_to_pop: 0, + nonterminal_produced: 112, } } 339 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 120, + nonterminal_produced: 112, } } 340 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 121, + states_to_pop: 1, + nonterminal_produced: 112, } } 341 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 122, + nonterminal_produced: 113, } } 342 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 122, + states_to_pop: 1, + nonterminal_produced: 114, } } 343 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 123, + states_to_pop: 0, + nonterminal_produced: 114, } } 344 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 124, + states_to_pop: 1, + nonterminal_produced: 115, } } 345 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 124, + nonterminal_produced: 115, } } 346 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 125, + nonterminal_produced: 115, } } 347 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 125, + states_to_pop: 1, + nonterminal_produced: 115, } } 348 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 126, + nonterminal_produced: 115, } } 349 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 126, + states_to_pop: 1, + nonterminal_produced: 115, } } 350 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 127, + states_to_pop: 1, + nonterminal_produced: 115, } } 351 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 127, + states_to_pop: 2, + nonterminal_produced: 115, } } 352 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 128, + nonterminal_produced: 115, } } 353 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 128, + states_to_pop: 2, + nonterminal_produced: 115, } } 354 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 129, + states_to_pop: 2, + nonterminal_produced: 116, } } 355 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 129, + states_to_pop: 1, + nonterminal_produced: 116, } } 356 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 129, + states_to_pop: 2, + nonterminal_produced: 117, } } 357 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 130, + nonterminal_produced: 117, } } 358 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 130, + states_to_pop: 1, + nonterminal_produced: 118, } } 359 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 131, + states_to_pop: 1, + nonterminal_produced: 118, } } 360 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 131, + states_to_pop: 1, + nonterminal_produced: 118, } } 361 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 132, + nonterminal_produced: 118, } } 362 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 132, + states_to_pop: 1, + nonterminal_produced: 118, } } 363 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 133, + states_to_pop: 1, + nonterminal_produced: 118, } } 364 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 133, + nonterminal_produced: 118, } } 365 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 134, + states_to_pop: 1, + nonterminal_produced: 118, } } 366 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 134, + states_to_pop: 2, + nonterminal_produced: 119, } } 367 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 135, + states_to_pop: 0, + nonterminal_produced: 120, } } 368 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 136, + states_to_pop: 1, + nonterminal_produced: 120, } } 369 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 136, + nonterminal_produced: 121, } } 370 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 137, + states_to_pop: 2, + nonterminal_produced: 121, } } 371 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 138, + nonterminal_produced: 122, } } 372 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 138, + nonterminal_produced: 122, } } 373 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 139, + nonterminal_produced: 122, } } 374 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 139, + states_to_pop: 1, + nonterminal_produced: 123, } } 375 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 139, + states_to_pop: 1, + nonterminal_produced: 124, } } 376 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 139, + states_to_pop: 2, + nonterminal_produced: 124, } } 377 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 139, + nonterminal_produced: 125, } } 378 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 140, + states_to_pop: 0, + nonterminal_produced: 126, } } 379 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 140, + nonterminal_produced: 126, } } 380 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 141, + states_to_pop: 1, + nonterminal_produced: 127, } } 381 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 141, + states_to_pop: 2, + nonterminal_produced: 127, } } 382 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 142, + states_to_pop: 2, + nonterminal_produced: 128, } } 383 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 142, + nonterminal_produced: 129, } } 384 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 142, + nonterminal_produced: 129, } } 385 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 142, + states_to_pop: 3, + nonterminal_produced: 130, } } 386 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 142, + states_to_pop: 2, + nonterminal_produced: 131, } } 387 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 142, + nonterminal_produced: 131, } } 388 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 143, + states_to_pop: 1, + nonterminal_produced: 132, } } 389 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 143, + states_to_pop: 0, + nonterminal_produced: 132, } } 390 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 143, + states_to_pop: 1, + nonterminal_produced: 133, } } 391 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 143, + states_to_pop: 2, + nonterminal_produced: 133, } } 392 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 144, + states_to_pop: 3, + nonterminal_produced: 134, } } 393 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 144, + states_to_pop: 1, + nonterminal_produced: 134, } } 394 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 144, + states_to_pop: 1, + nonterminal_produced: 135, } } 395 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 144, + states_to_pop: 0, + nonterminal_produced: 135, } } 396 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 144, + states_to_pop: 4, + nonterminal_produced: 136, } } 397 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 144, + states_to_pop: 3, + nonterminal_produced: 136, } } 398 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 144, + states_to_pop: 6, + nonterminal_produced: 136, } } 399 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 144, + states_to_pop: 1, + nonterminal_produced: 137, } } 400 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 144, + states_to_pop: 2, + nonterminal_produced: 137, } } 401 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 144, + states_to_pop: 5, + nonterminal_produced: 138, } } 402 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 144, + states_to_pop: 7, + nonterminal_produced: 138, } } 403 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 144, + states_to_pop: 1, + nonterminal_produced: 139, } } 404 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 144, + states_to_pop: 2, + nonterminal_produced: 139, } } 405 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 144, + states_to_pop: 3, + nonterminal_produced: 140, } } 406 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 144, + states_to_pop: 1, + nonterminal_produced: 140, } } 407 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 144, + states_to_pop: 3, + nonterminal_produced: 141, } } 408 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 145, + states_to_pop: 1, + nonterminal_produced: 141, } } 409 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 145, + states_to_pop: 3, + nonterminal_produced: 142, } } 410 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 145, + states_to_pop: 1, + nonterminal_produced: 142, } } 411 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 145, + states_to_pop: 1, + nonterminal_produced: 143, } } 412 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 145, + nonterminal_produced: 144, } } 413 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 146, + nonterminal_produced: 144, } } 414 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 146, + states_to_pop: 1, + nonterminal_produced: 145, } } 415 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 147, + states_to_pop: 1, + nonterminal_produced: 146, } } 416 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 147, + nonterminal_produced: 146, } } 417 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 147, + } + } + 418 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 147, + } + } + 419 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 147, + } + } + 420 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 147, + } + } + 421 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 147, + } + } + 422 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, nonterminal_produced: 148, } } - 418 => { + 423 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, nonterminal_produced: 148, } } - 419 => { + 424 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, nonterminal_produced: 149, } } - 420 => { + 425 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 149, + } + } + 426 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, nonterminal_produced: 150, } } - 421 => { + 427 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 150, + } + } + 428 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, nonterminal_produced: 151, } } - 422 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 152, - } - } - 423 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 152, - } - } - 424 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 152, - } - } - 425 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 152, - } - } - 426 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 153, - } - } - 427 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 153, - } - } - 428 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 154, - } - } 429 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 154, + nonterminal_produced: 151, } } 430 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 155, + states_to_pop: 2, + nonterminal_produced: 151, } } 431 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 155, + states_to_pop: 1, + nonterminal_produced: 151, } } 432 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 155, + states_to_pop: 1, + nonterminal_produced: 151, } } 433 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 155, + nonterminal_produced: 151, } } 434 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 156, + states_to_pop: 10, + nonterminal_produced: 152, } } 435 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 156, + states_to_pop: 7, + nonterminal_produced: 152, } } 436 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 157, + states_to_pop: 9, + nonterminal_produced: 152, } } 437 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 157, + states_to_pop: 6, + nonterminal_produced: 152, } } 438 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 158, + states_to_pop: 9, + nonterminal_produced: 153, } } 439 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 158, + states_to_pop: 8, + nonterminal_produced: 153, } } 440 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 159, + states_to_pop: 10, + nonterminal_produced: 153, } } 441 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 159, + states_to_pop: 9, + nonterminal_produced: 153, } } 442 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 159, + states_to_pop: 7, + nonterminal_produced: 153, } } 443 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 160, + states_to_pop: 6, + nonterminal_produced: 153, } } 444 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 160, + states_to_pop: 8, + nonterminal_produced: 153, } } 445 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 161, + states_to_pop: 7, + nonterminal_produced: 153, } } 446 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 161, + states_to_pop: 8, + nonterminal_produced: 153, } } 447 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 162, + states_to_pop: 7, + nonterminal_produced: 153, } } 448 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 162, + states_to_pop: 9, + nonterminal_produced: 153, } } 449 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 163, + states_to_pop: 8, + nonterminal_produced: 153, } } 450 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 163, + states_to_pop: 6, + nonterminal_produced: 153, } } 451 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 164, + states_to_pop: 5, + nonterminal_produced: 153, } } 452 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 165, + states_to_pop: 7, + nonterminal_produced: 153, } } 453 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 166, + states_to_pop: 6, + nonterminal_produced: 153, } } 454 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 166, + states_to_pop: 2, + nonterminal_produced: 154, } } 455 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 167, + nonterminal_produced: 154, } } 456 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 167, + states_to_pop: 3, + nonterminal_produced: 154, } } 457 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 168, + states_to_pop: 2, + nonterminal_produced: 154, } } 458 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 168, + states_to_pop: 2, + nonterminal_produced: 154, } } 459 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 168, + nonterminal_produced: 155, } } 460 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 168, + states_to_pop: 0, + nonterminal_produced: 155, } } 461 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 168, + states_to_pop: 2, + nonterminal_produced: 156, } } 462 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 168, + nonterminal_produced: 156, } } 463 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 169, + states_to_pop: 2, + nonterminal_produced: 157, } } 464 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 169, + nonterminal_produced: 157, } } 465 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 169, + states_to_pop: 2, + nonterminal_produced: 158, } } 466 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 169, + states_to_pop: 2, + nonterminal_produced: 159, } } 467 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 169, + states_to_pop: 2, + nonterminal_produced: 160, } } 468 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 169, + nonterminal_produced: 161, } } 469 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 169, + states_to_pop: 7, + nonterminal_produced: 162, } } 470 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 170, + states_to_pop: 4, + nonterminal_produced: 162, } } 471 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 170, + states_to_pop: 8, + nonterminal_produced: 162, } } 472 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 170, + states_to_pop: 5, + nonterminal_produced: 162, } } 473 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 170, + states_to_pop: 3, + nonterminal_produced: 163, } } 474 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 170, + states_to_pop: 1, + nonterminal_produced: 163, } } 475 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 170, + states_to_pop: 3, + nonterminal_produced: 164, } } 476 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 170, + states_to_pop: 1, + nonterminal_produced: 164, } } 477 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 171, + states_to_pop: 1, + nonterminal_produced: 165, } } 478 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 171, + nonterminal_produced: 165, } } 479 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 172, + states_to_pop: 3, + nonterminal_produced: 165, } } 480 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 172, + states_to_pop: 1, + nonterminal_produced: 165, } } 481 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 173, + states_to_pop: 1, + nonterminal_produced: 166, } } 482 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 174, + states_to_pop: 1, + nonterminal_produced: 166, } } 483 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 175, + states_to_pop: 0, + nonterminal_produced: 167, } } 484 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 176, + states_to_pop: 1, + nonterminal_produced: 167, } } 485 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 176, + states_to_pop: 1, + nonterminal_produced: 168, } } 486 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 177, + states_to_pop: 2, + nonterminal_produced: 168, } } 487 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 177, + states_to_pop: 1, + nonterminal_produced: 169, } } 488 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 177, + states_to_pop: 2, + nonterminal_produced: 169, } } 489 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 177, + states_to_pop: 1, + nonterminal_produced: 169, } } 490 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 178, + states_to_pop: 2, + nonterminal_produced: 170, } } 491 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 178, + states_to_pop: 4, + nonterminal_produced: 170, } } 492 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 178, + states_to_pop: 2, + nonterminal_produced: 171, } } 493 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 178, + nonterminal_produced: 171, } } 494 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 178, + states_to_pop: 2, + nonterminal_produced: 172, } } 495 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 179, + states_to_pop: 1, + nonterminal_produced: 172, } } 496 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 180, + states_to_pop: 4, + nonterminal_produced: 173, } } 497 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 180, + states_to_pop: 3, + nonterminal_produced: 173, } } 498 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 181, + nonterminal_produced: 174, } } 499 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 181, + nonterminal_produced: 175, } } 500 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 182, + nonterminal_produced: 176, } } 501 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 183, + states_to_pop: 1, + nonterminal_produced: 176, } } 502 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 183, + nonterminal_produced: 177, } } 503 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 184, + states_to_pop: 0, + nonterminal_produced: 177, } } 504 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 184, + nonterminal_produced: 178, } } 505 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 185, + nonterminal_produced: 178, } } 506 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 185, + states_to_pop: 1, + nonterminal_produced: 178, } } 507 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 186, + nonterminal_produced: 178, } } 508 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 186, + states_to_pop: 1, + nonterminal_produced: 178, } } 509 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 187, + nonterminal_produced: 178, } } 510 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 187, + states_to_pop: 1, + nonterminal_produced: 179, } } 511 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 188, + states_to_pop: 1, + nonterminal_produced: 179, } } 512 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 188, + nonterminal_produced: 179, } } 513 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 188, + states_to_pop: 1, + nonterminal_produced: 179, } } 514 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 188, + states_to_pop: 1, + nonterminal_produced: 179, } } 515 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 189, + states_to_pop: 1, + nonterminal_produced: 179, } } 516 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 189, + nonterminal_produced: 179, } } 517 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 189, + states_to_pop: 2, + nonterminal_produced: 180, } } 518 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 189, + states_to_pop: 4, + nonterminal_produced: 180, } } 519 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 190, + states_to_pop: 3, + nonterminal_produced: 180, } } 520 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 190, + states_to_pop: 5, + nonterminal_produced: 180, } } 521 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 191, + states_to_pop: 4, + nonterminal_produced: 180, } } 522 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 191, + states_to_pop: 7, + nonterminal_produced: 180, } } 523 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 192, + states_to_pop: 6, + nonterminal_produced: 180, } } 524 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 192, + states_to_pop: 5, + nonterminal_produced: 181, } } 525 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 193, + states_to_pop: 4, + nonterminal_produced: 181, } } 526 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 193, + states_to_pop: 1, + nonterminal_produced: 182, } } 527 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 194, + states_to_pop: 2, + nonterminal_produced: 182, } } 528 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 194, + nonterminal_produced: 183, } } 529 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 195, + states_to_pop: 3, + nonterminal_produced: 184, } } 530 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 195, + states_to_pop: 1, + nonterminal_produced: 185, } } 531 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 196, + states_to_pop: 3, + nonterminal_produced: 186, } } 532 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 196, + nonterminal_produced: 186, } } 533 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 197, + states_to_pop: 7, + nonterminal_produced: 187, } } 534 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 197, + states_to_pop: 8, + nonterminal_produced: 187, } } 535 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 198, + states_to_pop: 8, + nonterminal_produced: 187, } } 536 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 198, + states_to_pop: 7, + nonterminal_produced: 187, } } 537 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 199, + nonterminal_produced: 188, } } 538 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 199, + nonterminal_produced: 188, } } 539 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 200, + states_to_pop: 1, + nonterminal_produced: 188, } } 540 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 200, + nonterminal_produced: 188, } } 541 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 201, + states_to_pop: 1, + nonterminal_produced: 188, } } 542 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 201, + states_to_pop: 3, + nonterminal_produced: 189, } } 543 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 202, + nonterminal_produced: 190, } } 544 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 202, + states_to_pop: 1, + nonterminal_produced: 190, } } 545 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 203, + nonterminal_produced: 191, } } 546 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 203, + states_to_pop: 1, + nonterminal_produced: 191, } } 547 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 204, + states_to_pop: 2, + nonterminal_produced: 192, } } 548 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 204, + states_to_pop: 2, + nonterminal_produced: 193, } } 549 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 204, + states_to_pop: 1, + nonterminal_produced: 193, } } 550 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 194, + } + } + 551 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 194, + } + } + 552 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 195, + } + } + 553 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 195, + } + } + 554 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 196, + } + } + 555 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 196, + } + } + 556 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 197, + } + } + 557 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 197, + } + } + 558 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 198, + } + } + 559 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 198, + } + } + 560 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 198, + } + } + 561 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 198, + } + } + 562 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 199, + } + } + 563 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 199, + } + } + 564 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 199, + } + } + 565 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 199, + } + } + 566 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 200, + } + } + 567 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 200, + } + } + 568 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 201, + } + } + 569 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 201, + } + } + 570 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 202, + } + } + 571 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 202, + } + } + 572 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 203, + } + } + 573 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 203, + } + } + 574 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 204, + } + } + 575 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 204, + } + } + 576 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, nonterminal_produced: 205, } } - 551 => { + 577 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, nonterminal_produced: 205, } } - 552 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 205, - } - } - 553 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 554 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 206, - } - } - 555 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 206, - } - } - 556 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 557 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, - } - } - 558 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 206, - } - } - 559 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, - } - } - 560 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 206, - } - } - 561 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 11, - nonterminal_produced: 206, - } - } - 562 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 563 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 206, - } - } - 564 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 206, - } - } - 565 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 566 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 567 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, - } - } - 568 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 569 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 570 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 571 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 572 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, - } - } - 573 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 206, - } - } - 574 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 575 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 576 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, - } - } - 577 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 206, - } - } 578 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, + states_to_pop: 1, nonterminal_produced: 206, } } 579 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, + states_to_pop: 3, nonterminal_produced: 206, } } 580 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, + states_to_pop: 1, + nonterminal_produced: 207, } } 581 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, + states_to_pop: 3, + nonterminal_produced: 207, } } 582 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 206, + states_to_pop: 1, + nonterminal_produced: 208, } } 583 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, + states_to_pop: 3, + nonterminal_produced: 208, } } 584 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, + states_to_pop: 1, + nonterminal_produced: 209, } } 585 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, + states_to_pop: 1, + nonterminal_produced: 209, } } 586 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, + states_to_pop: 2, + nonterminal_produced: 210, } } 587 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 206, + states_to_pop: 1, + nonterminal_produced: 210, } } 588 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 206, + states_to_pop: 2, + nonterminal_produced: 211, } } 589 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, + states_to_pop: 1, + nonterminal_produced: 211, } } 590 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, - } - } - 591 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 206, - } - } - 592 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 593 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 594 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 595 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 206, - } - } - 596 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 597 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 598 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 599 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 600 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 206, - } - } - 601 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 602 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 603 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 604 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 206, - } - } - 605 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 206, - } - } - 606 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 607 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 608 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 609 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 206, - } - } - 610 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 206, - } - } - 611 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 612 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 613 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 614 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 615 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 206, - } - } - 616 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 617 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 206, - } - } - 618 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 206, - } - } - 619 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 620 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 206, - } - } - 621 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 622 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 206, - } - } - 623 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 206, - } - } - 624 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 206, - } - } - 625 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 206, - } - } - 626 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 206, - } - } - 627 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 206, - } - } - 628 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 206, - } - } - 629 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 206, - } - } - 630 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 206, - } - } - 631 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 632 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 207, - } - } - 633 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 207, - } - } - 634 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 635 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 636 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 207, - } - } - 637 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 638 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 207, - } - } - 639 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 11, - nonterminal_produced: 207, - } - } - 640 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 641 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 207, - } - } - 642 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 207, - } - } - 643 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 644 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 645 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 646 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 647 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 648 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 649 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 650 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 651 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 207, - } - } - 652 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 653 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 654 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 655 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 207, - } - } - 656 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 657 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 658 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 659 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 660 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 207, - } - } - 661 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 662 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 663 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 664 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 665 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 207, - } - } - 666 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 207, - } - } - 667 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 668 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 669 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 9, - nonterminal_produced: 207, - } - } - 670 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 671 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 672 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 673 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 207, - } - } - 674 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 675 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 676 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 677 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 678 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 207, - } - } - 679 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 680 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 681 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 682 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 207, - } - } - 683 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 207, - } - } - 684 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 685 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 686 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 687 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 207, - } - } - 688 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 207, - } - } - 689 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 690 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 691 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 692 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 693 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 207, - } - } - 694 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 695 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 207, - } - } - 696 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 207, - } - } - 697 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 698 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 207, - } - } - 699 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 700 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 207, - } - } - 701 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 207, - } - } - 702 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 207, - } - } - 703 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 207, - } - } - 704 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 207, - } - } - 705 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 207, - } - } - 706 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 207, - } - } - 707 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 207, - } - } - 708 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 207, - } - } - 709 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 208, - } - } - 710 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 208, - } - } - 711 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 209, - } - } - 712 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 209, - } - } - 713 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 209, - } - } - 714 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 209, - } - } - 715 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 209, - } - } - 716 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 209, - } - } - 717 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 209, - } - } - 718 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 209, - } - } - 719 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 210, - } - } - 720 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 210, - } - } - 721 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 210, - } - } - 722 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 210, - } - } - 723 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 210, - } - } - 724 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 210, - } - } - 725 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 210, - } - } - 726 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 210, - } - } - 727 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 211, - } - } - 728 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 211, - } - } - 729 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, nonterminal_produced: 212, } } - 730 => { + 591 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 212, + } + } + 592 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, nonterminal_produced: 213, } } + 593 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 213, + } + } + 594 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 214, + } + } + 595 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 214, + } + } + 596 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 214, + } + } + 597 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 215, + } + } + 598 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 215, + } + } + 599 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 215, + } + } + 600 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 601 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 216, + } + } + 602 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 216, + } + } + 603 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 604 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 605 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 216, + } + } + 606 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 607 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 216, + } + } + 608 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 11, + nonterminal_produced: 216, + } + } + 609 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 610 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 216, + } + } + 611 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 216, + } + } + 612 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 613 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 614 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 615 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 616 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 617 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 618 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 619 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 620 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 216, + } + } + 621 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 622 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 623 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 624 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 216, + } + } + 625 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 626 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 627 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 628 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 629 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 216, + } + } + 630 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 631 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 632 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 633 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 634 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 216, + } + } + 635 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 216, + } + } + 636 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 637 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 638 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 216, + } + } + 639 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 640 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 641 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 642 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 216, + } + } + 643 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 644 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 645 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 646 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 647 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 216, + } + } + 648 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 649 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 650 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 651 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 216, + } + } + 652 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 216, + } + } + 653 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 654 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 655 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 656 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 216, + } + } + 657 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 216, + } + } + 658 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 659 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 660 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 661 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 662 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 216, + } + } + 663 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 664 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 216, + } + } + 665 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 216, + } + } + 666 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 667 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 216, + } + } + 668 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 669 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 216, + } + } + 670 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 216, + } + } + 671 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 216, + } + } + 672 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 216, + } + } + 673 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 216, + } + } + 674 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 216, + } + } + 675 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 216, + } + } + 676 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 216, + } + } + 677 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 216, + } + } + 678 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 679 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 217, + } + } + 680 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 217, + } + } + 681 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 682 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 683 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 217, + } + } + 684 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 685 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 217, + } + } + 686 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 11, + nonterminal_produced: 217, + } + } + 687 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 688 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 217, + } + } + 689 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 217, + } + } + 690 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 217, + } + } + 691 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 692 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 693 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 217, + } + } + 694 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 695 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 696 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 697 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 698 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 217, + } + } + 699 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 217, + } + } + 700 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 701 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 702 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 217, + } + } + 703 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 217, + } + } + 704 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 217, + } + } + 705 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 706 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 707 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 217, + } + } + 708 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 217, + } + } + 709 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 710 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 711 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 712 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 217, + } + } + 713 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 10, + nonterminal_produced: 217, + } + } + 714 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 715 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 716 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 9, + nonterminal_produced: 217, + } + } + 717 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 217, + } + } + 718 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 719 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 720 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 217, + } + } + 721 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 217, + } + } + 722 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 723 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 217, + } + } + 724 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 725 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 8, + nonterminal_produced: 217, + } + } + 726 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 217, + } + } + 727 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 217, + } + } + 728 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 217, + } + } + 729 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 217, + } + } + 730 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 217, + } + } 731 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 213, + states_to_pop: 4, + nonterminal_produced: 217, } } 732 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 214, + states_to_pop: 4, + nonterminal_produced: 217, } } 733 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 214, + states_to_pop: 6, + nonterminal_produced: 217, } } 734 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 215, + states_to_pop: 7, + nonterminal_produced: 217, } } 735 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 215, + states_to_pop: 3, + nonterminal_produced: 217, } } 736 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 215, + states_to_pop: 5, + nonterminal_produced: 217, } } 737 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 215, + states_to_pop: 6, + nonterminal_produced: 217, } } 738 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 216, + states_to_pop: 5, + nonterminal_produced: 217, } } 739 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 216, + states_to_pop: 4, + nonterminal_produced: 217, } } 740 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, + states_to_pop: 6, nonterminal_produced: 217, } } 741 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 5, nonterminal_produced: 217, } } 742 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 218, + states_to_pop: 3, + nonterminal_produced: 217, } } 743 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 218, + nonterminal_produced: 217, } } 744 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 218, + nonterminal_produced: 217, } } 745 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 218, + states_to_pop: 3, + nonterminal_produced: 217, } } 746 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 218, + states_to_pop: 4, + nonterminal_produced: 217, } } 747 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 218, + states_to_pop: 3, + nonterminal_produced: 217, } } 748 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 218, + states_to_pop: 5, + nonterminal_produced: 217, } } 749 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 219, + states_to_pop: 4, + nonterminal_produced: 217, } } 750 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 219, + states_to_pop: 2, + nonterminal_produced: 217, } } 751 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 219, + states_to_pop: 1, + nonterminal_produced: 217, } } 752 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 220, + nonterminal_produced: 217, } } 753 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 220, + nonterminal_produced: 217, } } 754 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 220, + states_to_pop: 2, + nonterminal_produced: 217, } } 755 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 220, + states_to_pop: 1, + nonterminal_produced: 217, } } 756 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 220, + states_to_pop: 1, + nonterminal_produced: 218, } } 757 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 220, + states_to_pop: 0, + nonterminal_produced: 218, } } 758 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 220, + states_to_pop: 4, + nonterminal_produced: 219, } } 759 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 220, + states_to_pop: 3, + nonterminal_produced: 219, } } 760 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 220, + states_to_pop: 5, + nonterminal_produced: 219, } } 761 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 221, + states_to_pop: 4, + nonterminal_produced: 219, } } 762 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 221, + states_to_pop: 2, + nonterminal_produced: 219, } } 763 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 222, + states_to_pop: 1, + nonterminal_produced: 219, } } 764 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 222, + states_to_pop: 3, + nonterminal_produced: 219, } } 765 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 223, + states_to_pop: 2, + nonterminal_produced: 219, } } 766 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 223, + states_to_pop: 4, + nonterminal_produced: 220, } } 767 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 224, + states_to_pop: 3, + nonterminal_produced: 220, } } 768 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 224, + states_to_pop: 5, + nonterminal_produced: 220, } } 769 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 225, + states_to_pop: 4, + nonterminal_produced: 220, } } 770 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 225, + states_to_pop: 2, + nonterminal_produced: 220, } } 771 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 225, + states_to_pop: 1, + nonterminal_produced: 220, } } 772 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 225, + states_to_pop: 3, + nonterminal_produced: 220, } } 773 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 226, + states_to_pop: 2, + nonterminal_produced: 220, } } 774 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 226, + states_to_pop: 3, + nonterminal_produced: 221, } } 775 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 227, + nonterminal_produced: 221, } } 776 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 227, + nonterminal_produced: 222, } } 777 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 228, + nonterminal_produced: 223, } } 778 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 228, + states_to_pop: 1, + nonterminal_produced: 223, } } 779 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 229, + nonterminal_produced: 224, } } 780 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 229, + states_to_pop: 0, + nonterminal_produced: 224, } } 781 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 229, + states_to_pop: 2, + nonterminal_produced: 225, } } 782 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 229, + states_to_pop: 2, + nonterminal_produced: 225, } } 783 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 229, + nonterminal_produced: 225, } } 784 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 229, + nonterminal_produced: 225, } } 785 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 229, + states_to_pop: 3, + nonterminal_produced: 226, } } 786 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 229, + nonterminal_produced: 226, } } 787 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 229, + states_to_pop: 3, + nonterminal_produced: 227, } } 788 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 229, + nonterminal_produced: 227, } } 789 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 230, + states_to_pop: 3, + nonterminal_produced: 228, } } 790 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 231, + states_to_pop: 1, + nonterminal_produced: 228, } } 791 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 232, + states_to_pop: 0, + nonterminal_produced: 229, } } 792 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 232, + states_to_pop: 2, + nonterminal_produced: 229, } } 793 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 233, + states_to_pop: 4, + nonterminal_produced: 229, } } 794 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 233, + states_to_pop: 5, + nonterminal_produced: 229, } } 795 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 234, + states_to_pop: 3, + nonterminal_produced: 229, } } 796 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 235, + states_to_pop: 4, + nonterminal_produced: 229, } } 797 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 235, + states_to_pop: 2, + nonterminal_produced: 229, } } 798 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 236, + states_to_pop: 1, + nonterminal_produced: 230, } } 799 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 236, + nonterminal_produced: 230, } } 800 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 236, + nonterminal_produced: 230, } } 801 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 236, + nonterminal_produced: 231, } } 802 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 236, + states_to_pop: 2, + nonterminal_produced: 231, } } 803 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 236, + states_to_pop: 4, + nonterminal_produced: 231, } } 804 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 236, + states_to_pop: 5, + nonterminal_produced: 231, } } 805 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 236, + states_to_pop: 4, + nonterminal_produced: 231, } } 806 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 236, + nonterminal_produced: 231, } } 807 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 236, + states_to_pop: 2, + nonterminal_produced: 231, } } 808 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 237, + states_to_pop: 4, + nonterminal_produced: 231, } } 809 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 237, + states_to_pop: 3, + nonterminal_produced: 231, } } 810 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 237, + states_to_pop: 2, + nonterminal_produced: 232, } } 811 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 237, + states_to_pop: 1, + nonterminal_produced: 232, } } 812 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 237, + states_to_pop: 3, + nonterminal_produced: 233, } } 813 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 237, + states_to_pop: 1, + nonterminal_produced: 233, } } 814 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 237, + states_to_pop: 3, + nonterminal_produced: 234, } } 815 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 237, + states_to_pop: 1, + nonterminal_produced: 234, } } 816 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 237, + states_to_pop: 3, + nonterminal_produced: 235, } } 817 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 238, + nonterminal_produced: 235, } } 818 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 238, + states_to_pop: 1, + nonterminal_produced: 236, } } 819 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 238, + states_to_pop: 1, + nonterminal_produced: 236, } } 820 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 238, + states_to_pop: 5, + nonterminal_produced: 237, } } 821 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 239, + states_to_pop: 6, + nonterminal_produced: 237, } } 822 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 4, - nonterminal_produced: 239, + nonterminal_produced: 237, } } 823 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 239, + states_to_pop: 5, + nonterminal_produced: 237, } } 824 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 239, + states_to_pop: 1, + nonterminal_produced: 238, } } 825 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 239, + states_to_pop: 2, + nonterminal_produced: 238, } } 826 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 240, + states_to_pop: 2, + nonterminal_produced: 239, } } 827 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 240, + nonterminal_produced: 239, } } 828 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 241, + states_to_pop: 1, + nonterminal_produced: 240, } } 829 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 241, + states_to_pop: 0, + nonterminal_produced: 240, } } 830 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 242, + states_to_pop: 1, + nonterminal_produced: 241, } } 831 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 242, + nonterminal_produced: 241, } } 832 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 242, + nonterminal_produced: 241, } } 833 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 243, + nonterminal_produced: 241, } } 834 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 243, + states_to_pop: 1, + nonterminal_produced: 241, } } 835 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 244, + states_to_pop: 1, + nonterminal_produced: 241, } } 836 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 244, + nonterminal_produced: 241, } } 837 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 244, + nonterminal_produced: 241, } } 838 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 245, + nonterminal_produced: 241, } } 839 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 246, + nonterminal_produced: 241, } } 840 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 246, + states_to_pop: 1, + nonterminal_produced: 241, } } 841 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 247, + states_to_pop: 2, + nonterminal_produced: 242, } } 842 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 247, + states_to_pop: 2, + nonterminal_produced: 243, } } 843 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 248, + states_to_pop: 3, + nonterminal_produced: 244, } } 844 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 248, + nonterminal_produced: 244, } } 845 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 249, + nonterminal_produced: 245, } } 846 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 250, + states_to_pop: 0, + nonterminal_produced: 245, } } 847 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 250, + nonterminal_produced: 246, } } 848 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 251, + states_to_pop: 1, + nonterminal_produced: 247, } } 849 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 251, + states_to_pop: 0, + nonterminal_produced: 247, } } 850 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 251, + nonterminal_produced: 248, } } 851 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 252, + states_to_pop: 4, + nonterminal_produced: 248, } } 852 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 252, + states_to_pop: 2, + nonterminal_produced: 248, } } 853 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 252, + states_to_pop: 3, + nonterminal_produced: 248, } } 854 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 252, + states_to_pop: 1, + nonterminal_produced: 248, } } 855 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 10, - nonterminal_produced: 252, + states_to_pop: 2, + nonterminal_produced: 248, } } 856 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 252, + states_to_pop: 4, + nonterminal_produced: 248, } } 857 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 252, + states_to_pop: 5, + nonterminal_produced: 248, } } 858 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 252, + states_to_pop: 3, + nonterminal_produced: 248, } } 859 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 252, + states_to_pop: 4, + nonterminal_produced: 248, } } 860 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 253, + states_to_pop: 1, + nonterminal_produced: 249, } } 861 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 253, + states_to_pop: 4, + nonterminal_produced: 249, } } 862 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 254, + nonterminal_produced: 249, } } 863 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 254, + nonterminal_produced: 249, } } 864 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 255, + states_to_pop: 2, + nonterminal_produced: 249, } } 865 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 255, + nonterminal_produced: 249, } } 866 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 256, + states_to_pop: 2, + nonterminal_produced: 249, } } 867 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 256, + states_to_pop: 2, + nonterminal_produced: 249, } } 868 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 257, + nonterminal_produced: 249, } } 869 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 258, + states_to_pop: 1, + nonterminal_produced: 250, } } 870 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 258, + states_to_pop: 2, + nonterminal_produced: 250, } } 871 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 259, + states_to_pop: 2, + nonterminal_produced: 250, } } 872 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 259, + nonterminal_produced: 250, } } 873 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 259, + states_to_pop: 3, + nonterminal_produced: 251, } } 874 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 259, + states_to_pop: 4, + nonterminal_produced: 251, } } 875 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 260, + states_to_pop: 2, + nonterminal_produced: 251, } } 876 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, - nonterminal_produced: 260, + nonterminal_produced: 251, } } 877 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 261, + states_to_pop: 4, + nonterminal_produced: 251, } } 878 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 261, + states_to_pop: 3, + nonterminal_produced: 252, } } 879 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 262, + states_to_pop: 1, + nonterminal_produced: 252, } } 880 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 262, + states_to_pop: 3, + nonterminal_produced: 253, } } 881 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 263, + nonterminal_produced: 253, } } 882 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 263, + states_to_pop: 3, + nonterminal_produced: 254, } } 883 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 263, + nonterminal_produced: 254, } } 884 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 264, + states_to_pop: 5, + nonterminal_produced: 255, } } 885 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 265, + nonterminal_produced: 255, } } 886 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 266, + states_to_pop: 1, + nonterminal_produced: 255, } } 887 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 266, + states_to_pop: 1, + nonterminal_produced: 256, } } 888 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 267, + states_to_pop: 0, + nonterminal_produced: 256, } } 889 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 267, + states_to_pop: 5, + nonterminal_produced: 257, } } 890 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 268, + states_to_pop: 1, + nonterminal_produced: 257, } } 891 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 269, + nonterminal_produced: 257, } } 892 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 269, + states_to_pop: 1, + nonterminal_produced: 258, } } 893 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 259, } } 894 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 270, + states_to_pop: 0, + nonterminal_produced: 259, } } 895 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 260, } } 896 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 260, } } 897 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 261, } } 898 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 261, } } 899 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 262, } } 900 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 263, } } 901 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 6, - nonterminal_produced: 270, + states_to_pop: 1, + nonterminal_produced: 263, } } 902 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 270, + states_to_pop: 2, + nonterminal_produced: 264, } } 903 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 270, + states_to_pop: 2, + nonterminal_produced: 264, } } 904 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 270, + states_to_pop: 3, + nonterminal_produced: 264, } } 905 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 271, + states_to_pop: 10, + nonterminal_produced: 265, } } 906 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, - nonterminal_produced: 272, + states_to_pop: 7, + nonterminal_produced: 265, } } 907 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 272, + states_to_pop: 7, + nonterminal_produced: 265, } } 908 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 273, + states_to_pop: 4, + nonterminal_produced: 265, } } 909 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 273, + states_to_pop: 10, + nonterminal_produced: 265, } } 910 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 274, + states_to_pop: 7, + nonterminal_produced: 265, } } 911 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 274, + states_to_pop: 7, + nonterminal_produced: 265, } } 912 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 275, + states_to_pop: 4, + nonterminal_produced: 265, } } 913 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 275, + states_to_pop: 6, + nonterminal_produced: 265, } } 914 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 266, + } + } + 915 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 266, + } + } + 916 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 267, + } + } + 917 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 267, + } + } + 918 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 268, + } + } + 919 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 268, + } + } + 920 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 269, + } + } + 921 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 269, + } + } + 922 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 270, + } + } + 923 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 271, + } + } + 924 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 271, + } + } + 925 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 272, + } + } + 926 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 272, + } + } + 927 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 272, + } + } + 928 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 272, + } + } + 929 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 273, + } + } + 930 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 273, + } + } + 931 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 274, + } + } + 932 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 0, + nonterminal_produced: 274, + } + } + 933 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 3, nonterminal_produced: 275, } } - 915 => __state_machine::SimulatedReduce::Accept, + 934 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 275, + } + } + 935 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 276, + } + } + 936 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 276, + } + } + 937 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 276, + } + } + 938 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 277, + } + } + 939 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 278, + } + } + 940 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 279, + } + } + 941 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 279, + } + } + 942 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 280, + } + } + 943 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 280, + } + } + 944 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 281, + } + } + 945 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 282, + } + } + 946 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 282, + } + } + 947 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 283, + } + } + 948 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 283, + } + } + 949 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 283, + } + } + 950 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 283, + } + } + 951 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 7, + nonterminal_produced: 283, + } + } + 952 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 283, + } + } + 953 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 283, + } + } + 954 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 283, + } + } + 955 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 6, + nonterminal_produced: 283, + } + } + 956 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 283, + } + } + 957 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 283, + } + } + 958 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 283, + } + } + 959 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 284, + } + } + 960 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 5, + nonterminal_produced: 285, + } + } + 961 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 285, + } + } + 962 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 286, + } + } + 963 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 286, + } + } + 964 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 287, + } + } + 965 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 287, + } + } + 966 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 288, + } + } + 967 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 288, + } + } + 968 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 2, + nonterminal_produced: 289, + } + } + 969 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 1, + nonterminal_produced: 289, + } + } + 970 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 3, + nonterminal_produced: 289, + } + } + 971 => __state_machine::SimulatedReduce::Accept, _ => panic!("invalid reduction index {}", __reduce_index) } } @@ -11579,7 +12389,7 @@ mod __parse__Top { __reduce21(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 22 => { - // ("," >) = ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(943); + // ("," >) = ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1026); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -11588,7 +12398,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action943::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1026::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11596,7 +12406,7 @@ mod __parse__Top { (5, 13) } 23 => { - // ("," >) = ",", "*", ",", KwargParameter => ActionFn(944); + // ("," >) = ",", "*", ",", KwargParameter => ActionFn(1027); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant8(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -11604,7 +12414,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action944::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1027::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11612,7 +12422,7 @@ mod __parse__Top { (4, 13) } 24 => { - // ("," >) = ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(945); + // ("," >) = ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1028); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant8(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -11622,7 +12432,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action945::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1028::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11630,7 +12440,7 @@ mod __parse__Top { (6, 13) } 25 => { - // ("," >) = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(946); + // ("," >) = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1029); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -11639,7 +12449,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action946::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1029::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11647,14 +12457,14 @@ mod __parse__Top { (5, 13) } 26 => { - // ("," >) = ",", "*", StarTypedParameter => ActionFn(947); + // ("," >) = ",", "*", StarTypedParameter => ActionFn(1030); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant63(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action947::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1030::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11662,13 +12472,13 @@ mod __parse__Top { (3, 13) } 27 => { - // ("," >) = ",", "*" => ActionFn(948); + // ("," >) = ",", "*" => ActionFn(1031); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action948::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1031::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11676,7 +12486,7 @@ mod __parse__Top { (2, 13) } 28 => { - // ("," >) = ",", "*", StarTypedParameter, ("," >)+ => ActionFn(949); + // ("," >) = ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1032); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant63(__symbols); @@ -11684,7 +12494,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action949::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1032::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11692,14 +12502,14 @@ mod __parse__Top { (4, 13) } 29 => { - // ("," >) = ",", "*", ("," >)+ => ActionFn(950); + // ("," >) = ",", "*", ("," >)+ => ActionFn(1033); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant11(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action950::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1033::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11707,7 +12517,7 @@ mod __parse__Top { (3, 13) } 30 => { - // ("," >)? = ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(967); + // ("," >)? = ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1050); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -11716,7 +12526,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action967::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1050::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11724,7 +12534,7 @@ mod __parse__Top { (5, 14) } 31 => { - // ("," >)? = ",", "*", ",", KwargParameter => ActionFn(968); + // ("," >)? = ",", "*", ",", KwargParameter => ActionFn(1051); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant8(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -11732,7 +12542,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action968::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1051::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11740,7 +12550,7 @@ mod __parse__Top { (4, 14) } 32 => { - // ("," >)? = ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(969); + // ("," >)? = ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1052); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant8(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -11750,7 +12560,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action969::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1052::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11758,7 +12568,7 @@ mod __parse__Top { (6, 14) } 33 => { - // ("," >)? = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(970); + // ("," >)? = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1053); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -11767,7 +12577,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action970::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1053::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11775,14 +12585,14 @@ mod __parse__Top { (5, 14) } 34 => { - // ("," >)? = ",", "*", StarTypedParameter => ActionFn(971); + // ("," >)? = ",", "*", StarTypedParameter => ActionFn(1054); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant63(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action971::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1054::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11790,13 +12600,13 @@ mod __parse__Top { (3, 14) } 35 => { - // ("," >)? = ",", "*" => ActionFn(972); + // ("," >)? = ",", "*" => ActionFn(1055); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action972::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1055::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11804,7 +12614,7 @@ mod __parse__Top { (2, 14) } 36 => { - // ("," >)? = ",", "*", StarTypedParameter, ("," >)+ => ActionFn(973); + // ("," >)? = ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1056); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant63(__symbols); @@ -11812,7 +12622,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action973::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1056::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11820,14 +12630,14 @@ mod __parse__Top { (4, 14) } 37 => { - // ("," >)? = ",", "*", ("," >)+ => ActionFn(974); + // ("," >)? = ",", "*", ("," >)+ => ActionFn(1057); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant11(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action974::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1057::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11838,7 +12648,7 @@ mod __parse__Top { __reduce38(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 39 => { - // ("," >) = ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1003); + // ("," >) = ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1086); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -11847,7 +12657,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1003::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1086::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11855,7 +12665,7 @@ mod __parse__Top { (5, 15) } 40 => { - // ("," >) = ",", "*", ",", KwargParameter => ActionFn(1004); + // ("," >) = ",", "*", ",", KwargParameter => ActionFn(1087); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant8(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -11863,7 +12673,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1004::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1087::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11871,7 +12681,7 @@ mod __parse__Top { (4, 15) } 41 => { - // ("," >) = ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1005); + // ("," >) = ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1088); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant8(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -11881,7 +12691,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1005::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1088::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11889,7 +12699,7 @@ mod __parse__Top { (6, 15) } 42 => { - // ("," >) = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1006); + // ("," >) = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1089); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -11898,7 +12708,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1006::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1089::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11906,14 +12716,14 @@ mod __parse__Top { (5, 15) } 43 => { - // ("," >) = ",", "*", StarUntypedParameter => ActionFn(1007); + // ("," >) = ",", "*", StarUntypedParameter => ActionFn(1090); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant63(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1007::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1090::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11921,13 +12731,13 @@ mod __parse__Top { (3, 15) } 44 => { - // ("," >) = ",", "*" => ActionFn(1008); + // ("," >) = ",", "*" => ActionFn(1091); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action1008::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1091::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11935,7 +12745,7 @@ mod __parse__Top { (2, 15) } 45 => { - // ("," >) = ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1009); + // ("," >) = ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1092); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant63(__symbols); @@ -11943,7 +12753,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1009::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1092::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11951,14 +12761,14 @@ mod __parse__Top { (4, 15) } 46 => { - // ("," >) = ",", "*", ("," >)+ => ActionFn(1010); + // ("," >) = ",", "*", ("," >)+ => ActionFn(1093); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant11(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1010::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1093::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11966,7 +12776,7 @@ mod __parse__Top { (3, 15) } 47 => { - // ("," >)? = ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1027); + // ("," >)? = ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1110); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -11975,7 +12785,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1027::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1110::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11983,7 +12793,7 @@ mod __parse__Top { (5, 16) } 48 => { - // ("," >)? = ",", "*", ",", KwargParameter => ActionFn(1028); + // ("," >)? = ",", "*", ",", KwargParameter => ActionFn(1111); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant8(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -11991,7 +12801,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1028::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1111::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -11999,7 +12809,7 @@ mod __parse__Top { (4, 16) } 49 => { - // ("," >)? = ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1029); + // ("," >)? = ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1112); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant8(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -12009,7 +12819,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1029::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1112::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -12017,7 +12827,7 @@ mod __parse__Top { (6, 16) } 50 => { - // ("," >)? = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1030); + // ("," >)? = ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1113); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -12026,7 +12836,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1030::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1113::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -12034,14 +12844,14 @@ mod __parse__Top { (5, 16) } 51 => { - // ("," >)? = ",", "*", StarUntypedParameter => ActionFn(1031); + // ("," >)? = ",", "*", StarUntypedParameter => ActionFn(1114); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant63(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1031::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1114::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -12049,13 +12859,13 @@ mod __parse__Top { (3, 16) } 52 => { - // ("," >)? = ",", "*" => ActionFn(1032); + // ("," >)? = ",", "*" => ActionFn(1115); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action1032::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1115::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -12063,7 +12873,7 @@ mod __parse__Top { (2, 16) } 53 => { - // ("," >)? = ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1033); + // ("," >)? = ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1116); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant63(__symbols); @@ -12071,7 +12881,7 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1033::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1116::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -12079,14 +12889,14 @@ mod __parse__Top { (4, 16) } 54 => { - // ("," >)? = ",", "*", ("," >)+ => ActionFn(1034); + // ("," >)? = ",", "*", ("," >)+ => ActionFn(1117); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant11(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1034::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1117::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; @@ -12406,36 +13216,51 @@ mod __parse__Top { __reduce158(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 159 => { - // Arguments = "(", FunctionArgument, ")" => ActionFn(1510); + __reduce159(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 160 => { + __reduce160(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 161 => { + __reduce161(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 162 => { + __reduce162(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 163 => { + __reduce163(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 164 => { + // Arguments = "(", FunctionArgument, ")" => ActionFn(1645); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant30(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1510::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1645::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant49(__nt), __end)); - (3, 83) + (3, 86) } - 160 => { - // Arguments = "(", ")" => ActionFn(1511); + 165 => { + // Arguments = "(", ")" => ActionFn(1646); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action1511::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1646::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant49(__nt), __end)); - (2, 83) + (2, 86) } - 161 => { - // Arguments = "(", ( ",")+, FunctionArgument, ")" => ActionFn(1512); + 166 => { + // Arguments = "(", ( ",")+, FunctionArgument, ")" => ActionFn(1647); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant30(__symbols); @@ -12443,60 +13268,33 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1512::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1647::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant49(__nt), __end)); - (4, 83) + (4, 86) } - 162 => { - // Arguments = "(", ( ",")+, ")" => ActionFn(1513); + 167 => { + // Arguments = "(", ( ",")+, ")" => ActionFn(1648); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant31(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1513::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1648::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant49(__nt), __end)); - (3, 83) - } - 163 => { - __reduce163(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 164 => { - __reduce164(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 165 => { - __reduce165(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 166 => { - __reduce166(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 167 => { - __reduce167(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + (3, 86) } 168 => { __reduce168(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 169 => { - // AsPattern = OrPattern, "as", Identifier => ActionFn(1189); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant34(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1189::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (3, 87) + __reduce169(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 170 => { __reduce170(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12517,7 +13315,19 @@ mod __parse__Top { __reduce175(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 176 => { - __reduce176(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // AsPattern = OrPattern, "as", Identifier => ActionFn(1288); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1288::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (3, 91) } 177 => { __reduce177(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12529,16 +13339,7 @@ mod __parse__Top { __reduce179(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 180 => { - // Atom<"all"> = (@L string @R)+ => ActionFn(710); - let __sym0 = __pop_Variant42(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action710::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 93) + __reduce180(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 181 => { __reduce181(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12559,10 +13360,40 @@ mod __parse__Top { __reduce186(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 187 => { - __reduce187(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"All"> = (@L string @R)+ => ActionFn(762); + let __sym0 = __pop_Variant42(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action762::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 97) } 188 => { - // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ",", ")" => ActionFn(1198); + __reduce188(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 189 => { + __reduce189(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 190 => { + __reduce190(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 191 => { + __reduce191(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 192 => { + __reduce192(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 193 => { + __reduce193(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 194 => { + __reduce194(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 195 => { + // Atom<"All"> = "(", OneOrMore>, ",", NamedOrStarExpr, ",", ")" => ActionFn(1297); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -12572,15 +13403,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1198::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1297::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (6, 93) + (6, 97) } - 189 => { - // Atom<"all"> = "(", NamedOrStarExpr, ",", ")" => ActionFn(1199); + 196 => { + // Atom<"All"> = "(", NamedOrStarExpr, ",", ")" => ActionFn(1298); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -12588,15 +13419,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1199::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1298::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) + (4, 97) } - 190 => { - // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1200); + 197 => { + // Atom<"All"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1299); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -12607,15 +13438,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1200::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1299::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (7, 93) + (7, 97) } - 191 => { - // Atom<"all"> = "(", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1201); + 198 => { + // Atom<"All"> = "(", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1300); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -12624,15 +13455,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1201::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1300::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (5, 93) + (5, 97) } - 192 => { - // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ")" => ActionFn(1202); + 199 => { + // Atom<"All"> = "(", OneOrMore>, ",", NamedOrStarExpr, ")" => ActionFn(1301); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant14(__symbols); @@ -12641,30 +13472,30 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1202::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1301::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (5, 93) + (5, 97) } - 193 => { - // Atom<"all"> = "(", NamedOrStarExpr, ")" => ActionFn(1203); + 200 => { + // Atom<"All"> = "(", NamedOrStarExpr, ")" => ActionFn(1302); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1203::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1302::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 93) + (3, 97) } - 194 => { - // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ")" => ActionFn(1204); + 201 => { + // Atom<"All"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ")" => ActionFn(1303); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant16(__symbols); @@ -12674,15 +13505,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1204::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1303::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (6, 93) + (6, 97) } - 195 => { - // Atom<"all"> = "(", NamedOrStarExpr, ("," )+, ")" => ActionFn(1205); + 202 => { + // Atom<"All"> = "(", NamedOrStarExpr, ("," )+, ")" => ActionFn(1304); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant16(__symbols); @@ -12690,46 +13521,12 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1205::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1304::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) - } - 196 => { - __reduce196(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 197 => { - __reduce197(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 198 => { - __reduce198(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 199 => { - // Atom<"all"> = "(", "**", Expression<"all">, ")" => ActionFn(1208); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1208::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) - } - 200 => { - __reduce200(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 201 => { - __reduce201(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 202 => { - __reduce202(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + (4, 97) } 203 => { __reduce203(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12741,7 +13538,20 @@ mod __parse__Top { __reduce205(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 206 => { - __reduce206(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"All"> = "(", "**", Expression<"all">, ")" => ActionFn(1307); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1307::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 97) } 207 => { __reduce207(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12750,16 +13560,7 @@ mod __parse__Top { __reduce208(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 209 => { - // Atom<"no-withitems"> = (@L string @R)+ => ActionFn(730); - let __sym0 = __pop_Variant42(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action730::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 94) + __reduce209(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 210 => { __reduce210(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12777,7 +13578,43 @@ mod __parse__Top { __reduce214(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 215 => { - // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ",", ")" => ActionFn(1221); + __reduce215(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 216 => { + // Atom<"all"> = (@L string @R)+ => ActionFn(782); + let __sym0 = __pop_Variant42(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action782::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 98) + } + 217 => { + __reduce217(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 218 => { + __reduce218(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 219 => { + __reduce219(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 220 => { + __reduce220(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 221 => { + __reduce221(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 222 => { + __reduce222(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 223 => { + __reduce223(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 224 => { + // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ",", ")" => ActionFn(1322); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -12787,15 +13624,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1221::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1322::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (6, 94) + (6, 98) } - 216 => { - // Atom<"no-withitems"> = "(", NamedOrStarExpr, ",", ")" => ActionFn(1222); + 225 => { + // Atom<"all"> = "(", NamedOrStarExpr, ",", ")" => ActionFn(1323); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -12803,15 +13640,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1222::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1323::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 94) + (4, 98) } - 217 => { - // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1223); + 226 => { + // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1324); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -12822,15 +13659,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1223::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1324::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (7, 94) + (7, 98) } - 218 => { - // Atom<"no-withitems"> = "(", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1224); + 227 => { + // Atom<"all"> = "(", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1325); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -12839,15 +13676,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1224::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1325::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (5, 94) + (5, 98) } - 219 => { - // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ")" => ActionFn(1225); + 228 => { + // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ")" => ActionFn(1326); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant14(__symbols); @@ -12856,30 +13693,30 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1225::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1326::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (5, 94) + (5, 98) } - 220 => { - // Atom<"no-withitems"> = "(", NamedOrStarExpr, ")" => ActionFn(1226); + 229 => { + // Atom<"all"> = "(", NamedOrStarExpr, ")" => ActionFn(1327); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1226::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1327::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 94) + (3, 98) } - 221 => { - // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ")" => ActionFn(1227); + 230 => { + // Atom<"all"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ")" => ActionFn(1328); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant16(__symbols); @@ -12889,15 +13726,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1227::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1328::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (6, 94) + (6, 98) } - 222 => { - // Atom<"no-withitems"> = "(", NamedOrStarExpr, ("," )+, ")" => ActionFn(1228); + 231 => { + // Atom<"all"> = "(", NamedOrStarExpr, ("," )+, ")" => ActionFn(1329); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant16(__symbols); @@ -12905,52 +13742,12 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1228::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1329::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 94) - } - 223 => { - __reduce223(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 224 => { - __reduce224(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 225 => { - __reduce225(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 226 => { - // Atom<"no-withitems"> = "(", "**", Expression<"all">, ")" => ActionFn(1231); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1231::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 94) - } - 227 => { - __reduce227(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 228 => { - __reduce228(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 229 => { - __reduce229(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 230 => { - __reduce230(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 231 => { - __reduce231(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + (4, 98) } 232 => { __reduce232(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12962,7 +13759,20 @@ mod __parse__Top { __reduce234(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 235 => { - __reduce235(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"all"> = "(", "**", Expression<"all">, ")" => ActionFn(1332); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1332::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 98) } 236 => { __reduce236(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -12992,7 +13802,16 @@ mod __parse__Top { __reduce244(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 245 => { - __reduce245(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = (@L string @R)+ => ActionFn(802); + let __sym0 = __pop_Variant42(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action802::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 99) } 246 => { __reduce246(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13010,28 +13829,140 @@ mod __parse__Top { __reduce250(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 251 => { - __reduce251(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ",", ")" => ActionFn(1345); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1345::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (6, 99) } 252 => { - __reduce252(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", NamedOrStarExpr, ",", ")" => ActionFn(1346); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1346::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 99) } 253 => { - __reduce253(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1347); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant16(__symbols); + let __sym3 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1347::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (7, 99) } 254 => { - __reduce254(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", NamedOrStarExpr, ("," )+, ",", ")" => ActionFn(1348); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant16(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1348::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (5, 99) } 255 => { - __reduce255(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ")" => ActionFn(1349); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1349::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (5, 99) } 256 => { - __reduce256(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", NamedOrStarExpr, ")" => ActionFn(1350); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1350::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 99) } 257 => { - __reduce257(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", OneOrMore>, ",", NamedOrStarExpr, ("," )+, ")" => ActionFn(1351); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant16(__symbols); + let __sym3 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1351::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (6, 99) } 258 => { - __reduce258(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", NamedOrStarExpr, ("," )+, ")" => ActionFn(1352); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant16(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1352::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 99) } 259 => { __reduce259(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13043,7 +13974,20 @@ mod __parse__Top { __reduce261(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 262 => { - __reduce262(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Atom<"no-withitems"> = "(", "**", Expression<"all">, ")" => ActionFn(1355); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1355::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 99) } 263 => { __reduce263(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13604,59 +14548,16 @@ mod __parse__Top { __reduce448(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 449 => { - // LambdaDef = "lambda", ParameterList, ":", Test<"all"> => ActionFn(1680); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant14(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant45(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1680::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 163) + __reduce449(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 450 => { - // LambdaDef = "lambda", ":", Test<"all"> => ActionFn(1681); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1681::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 163) + __reduce450(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 451 => { - // LineMagicExpr = line_magic => ActionFn(1305); - let __sym0 = __pop_Variant4(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1305::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 164) + __reduce451(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 452 => { - // LineMagicStatement = line_magic => ActionFn(1306); - let __sym0 = __pop_Variant4(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1306::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 165) + __reduce452(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 453 => { __reduce453(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13686,16 +14587,7 @@ mod __parse__Top { __reduce461(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 462 => { - // LiteralPattern = (@L string @R)+ => ActionFn(1312); - let __sym0 = __pop_Variant42(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1312::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 168) + __reduce462(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 463 => { __reduce463(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13710,22 +14602,24 @@ mod __parse__Top { __reduce466(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 467 => { - __reduce467(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // HelpEndLineMagic = Expression<"All">, ("?")+ => ActionFn(1423); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant21(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1423::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (2, 160) } 468 => { __reduce468(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 469 => { - // MappingKey = (@L string @R)+ => ActionFn(831); - let __sym0 = __pop_Variant42(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action831::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 169) + __reduce469(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 470 => { __reduce470(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13806,16 +14700,59 @@ mod __parse__Top { __reduce495(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 496 => { - __reduce496(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // LambdaDef = "lambda", ParameterList, ":", Test<"all"> => ActionFn(1819); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant45(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1819::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 173) } 497 => { - __reduce497(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // LambdaDef = "lambda", ":", Test<"all"> => ActionFn(1820); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1820::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 173) } 498 => { - __reduce498(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // LineMagicExpr = line_magic => ActionFn(1436); + let __sym0 = __pop_Variant4(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1436::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 174) } 499 => { - __reduce499(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // LineMagicStatement = line_magic => ActionFn(1437); + let __sym0 = __pop_Variant4(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1437::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 175) } 500 => { __reduce500(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13845,7 +14782,16 @@ mod __parse__Top { __reduce508(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 509 => { - __reduce509(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // LiteralPattern = (@L string @R)+ => ActionFn(1443); + let __sym0 = __pop_Variant42(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1443::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 178) } 510 => { __reduce510(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13866,7 +14812,16 @@ mod __parse__Top { __reduce515(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 516 => { - __reduce516(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // MappingKey = (@L string @R)+ => ActionFn(910); + let __sym0 = __pop_Variant42(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action910::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 179) } 517 => { __reduce517(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -13977,1373 +14932,148 @@ mod __parse__Top { __reduce552(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 553 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1560); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant8(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1560::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce553(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 554 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1561); - assert!(__symbols.len() >= 9); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant8(__symbols); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym8.2; - let __nt = match super::__action1561::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 206) + __reduce554(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 555 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1562); - assert!(__symbols.len() >= 10); - let __sym9 = __pop_Variant0(__symbols); - let __sym8 = __pop_Variant8(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym9.2; - let __nt = match super::__action1562::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 206) + __reduce555(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 556 => { - // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter, "," => ActionFn(1563); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant8(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1563::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) + __reduce556(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 557 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter, "," => ActionFn(1564); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant8(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1564::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce557(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 558 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter, "," => ActionFn(1565); - assert!(__symbols.len() >= 9); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant8(__symbols); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym8.2; - let __nt = match super::__action1565::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 206) + __reduce558(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 559 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1566); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant8(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant11(__symbols); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1566::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce559(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 560 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1567); - assert!(__symbols.len() >= 10); - let __sym9 = __pop_Variant0(__symbols); - let __sym8 = __pop_Variant8(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym9.2; - let __nt = match super::__action1567::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 206) + __reduce560(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 561 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1568); - assert!(__symbols.len() >= 11); - let __sym10 = __pop_Variant0(__symbols); - let __sym9 = __pop_Variant8(__symbols); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant11(__symbols); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym10.2; - let __nt = match super::__action1568::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (11, 206) + __reduce561(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 562 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1569); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant8(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1569::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce562(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 563 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1570); - assert!(__symbols.len() >= 9); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant8(__symbols); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant11(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym8.2; - let __nt = match super::__action1570::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 206) + __reduce563(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 564 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1571); - assert!(__symbols.len() >= 10); - let __sym9 = __pop_Variant0(__symbols); - let __sym8 = __pop_Variant8(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym9.2; - let __nt = match super::__action1571::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 206) + __reduce564(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 565 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, "," => ActionFn(1572); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1572::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) + __reduce565(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 566 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, "," => ActionFn(1573); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1573::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce566(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 567 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, "," => ActionFn(1574); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1574::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce567(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 568 => { - // ParameterList = OneOrMore>, ",", "*", "," => ActionFn(1575); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1575::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) + __reduce568(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 569 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", "," => ActionFn(1576); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1576::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) + __reduce569(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 570 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", "," => ActionFn(1577); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1577::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce570(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 571 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+, "," => ActionFn(1578); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant11(__symbols); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1578::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) + __reduce571(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 572 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+, "," => ActionFn(1579); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1579::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce572(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 573 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+, "," => ActionFn(1580); - assert!(__symbols.len() >= 9); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant11(__symbols); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym8.2; - let __nt = match super::__action1580::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 206) + __reduce573(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 574 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+, "," => ActionFn(1581); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1581::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) + __reduce574(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 575 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, "," => ActionFn(1582); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant11(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1582::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce575(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 576 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, "," => ActionFn(1583); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1583::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce576(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 577 => { - // ParameterList = OneOrMore>, "," => ActionFn(1584); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1584::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 206) + __reduce577(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 578 => { - // ParameterList = OneOrMore>, ",", "/", "," => ActionFn(1585); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1585::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) + __reduce578(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 579 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, "," => ActionFn(1586); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1586::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) + __reduce579(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 580 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1587); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant8(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1587::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) + __reduce580(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 581 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1588); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant8(__symbols); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1588::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce581(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 582 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1589); - assert!(__symbols.len() >= 9); - let __sym8 = __pop_Variant8(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym8.2; - let __nt = match super::__action1589::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 206) + __reduce582(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 583 => { - // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter => ActionFn(1590); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant8(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1590::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) + __reduce583(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 584 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter => ActionFn(1591); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant8(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1591::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce584(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 585 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter => ActionFn(1592); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant8(__symbols); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1592::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce585(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 586 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1593); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant8(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant11(__symbols); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1593::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce586(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 587 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1594); - assert!(__symbols.len() >= 9); - let __sym8 = __pop_Variant8(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym8.2; - let __nt = match super::__action1594::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 206) + __reduce587(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 588 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1595); - assert!(__symbols.len() >= 10); - let __sym9 = __pop_Variant8(__symbols); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant11(__symbols); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym9.2; - let __nt = match super::__action1595::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 206) + __reduce588(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 589 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1596); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant8(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1596::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) + __reduce589(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 590 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1597); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant8(__symbols); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant11(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1597::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) + __reduce590(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 591 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1598); - assert!(__symbols.len() >= 9); - let __sym8 = __pop_Variant8(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym8.2; - let __nt = match super::__action1598::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 206) + __reduce591(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 592 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter => ActionFn(1599); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1599::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) + __reduce592(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 593 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter => ActionFn(1600); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1600::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) + __reduce593(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 594 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter => ActionFn(1601); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1601::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce594(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 595 => { - // ParameterList = OneOrMore>, ",", "*" => ActionFn(1602); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1602::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 206) + __reduce595(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 596 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*" => ActionFn(1603); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1603::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) + __reduce596(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 597 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*" => ActionFn(1604); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1604::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) + __reduce597(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 598 => { - // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1605); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant11(__symbols); - let __sym3 = __pop_Variant63(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1605::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) + __reduce598(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 599 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1606); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant63(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1606::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) + __reduce599(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 600 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1607); - assert!(__symbols.len() >= 8); - let __sym7 = __pop_Variant11(__symbols); - let __sym6 = __pop_Variant63(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym7.2; - let __nt = match super::__action1607::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 206) - } - 601 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+ => ActionFn(1608); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1608::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) - } - 602 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+ => ActionFn(1609); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant11(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1609::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) - } - 603 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+ => ActionFn(1610); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant11(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1610::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) - } - 604 => { - // ParameterList = OneOrMore> => ActionFn(1611); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1611::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (1, 206) - } - 605 => { - // ParameterList = OneOrMore>, ",", "/" => ActionFn(1612); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1612::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 206) - } - 606 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+ => ActionFn(1613); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1613::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) - } - 607 => { - // ParameterList = OneOrMore>, ",", KwargParameter, "," => ActionFn(1614); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant8(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1614::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) - } - 608 => { - // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter, "," => ActionFn(1615); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant8(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1615::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) - } - 609 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter, "," => ActionFn(1616); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant8(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = match super::__action1616::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 206) - } - 610 => { - // ParameterList = OneOrMore>, ",", KwargParameter => ActionFn(1617); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant8(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1617::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 206) - } - 611 => { - // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter => ActionFn(1618); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant8(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1618::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) - } - 612 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter => ActionFn(1619); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant8(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1619::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) - } - 613 => { - // ParameterList = "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1355); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant8(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1355::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) - } - 614 => { - // ParameterList = "*", ",", KwargParameter, "," => ActionFn(1356); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant8(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1356::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) - } - 615 => { - // ParameterList = "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1357); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant8(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant11(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = match super::__action1357::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 206) - } - 616 => { - // ParameterList = "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1358); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant8(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant11(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1358::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) - } - 617 => { - // ParameterList = "*", StarTypedParameter, "," => ActionFn(1359); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1359::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 206) - } - 618 => { - // ParameterList = "*", "," => ActionFn(1360); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1360::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 206) - } - 619 => { - // ParameterList = "*", StarTypedParameter, ("," >)+, "," => ActionFn(1361); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant11(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1361::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) - } - 620 => { - // ParameterList = "*", ("," >)+, "," => ActionFn(1362); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant11(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1362::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 206) - } - 621 => { - // ParameterList = "*", StarTypedParameter, ",", KwargParameter => ActionFn(1363); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant8(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1363::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) - } - 622 => { - // ParameterList = "*", ",", KwargParameter => ActionFn(1364); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant8(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1364::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 206) - } - 623 => { - // ParameterList = "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1365); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant8(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant11(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1365::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 206) - } - 624 => { - // ParameterList = "*", ("," >)+, ",", KwargParameter => ActionFn(1366); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant8(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant11(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1366::<>(mode, __sym0, __sym1, __sym2, __sym3) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 206) - } - 625 => { - // ParameterList = "*", StarTypedParameter => ActionFn(1367); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1367::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 206) - } - 626 => { - // ParameterList = "*" => ActionFn(1368); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1368::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (1, 206) - } - 627 => { - // ParameterList = "*", StarTypedParameter, ("," >)+ => ActionFn(1369); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant11(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1369::<>(mode, __sym0, __sym1, __sym2) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 206) - } - 628 => { - // ParameterList = "*", ("," >)+ => ActionFn(1370); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant11(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1370::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 206) - } - 629 => { - __reduce629(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 630 => { - __reduce630(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 631 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1620); + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1699); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant8(__symbols); @@ -15354,15 +15084,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1620::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1699::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 632 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1621); + 601 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1700); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant0(__symbols); let __sym7 = __pop_Variant8(__symbols); @@ -15375,15 +15105,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = match super::__action1621::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + let __nt = match super::__action1700::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 207) + (9, 216) } - 633 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1622); + 602 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1701); assert!(__symbols.len() >= 10); let __sym9 = __pop_Variant0(__symbols); let __sym8 = __pop_Variant8(__symbols); @@ -15397,15 +15127,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym9.2; - let __nt = match super::__action1622::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + let __nt = match super::__action1701::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 207) + (10, 216) } - 634 => { - // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter, "," => ActionFn(1623); + 603 => { + // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter, "," => ActionFn(1702); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant8(__symbols); @@ -15415,15 +15145,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1623::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1702::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 635 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter, "," => ActionFn(1624); + 604 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter, "," => ActionFn(1703); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant8(__symbols); @@ -15435,15 +15165,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1624::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1703::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 636 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter, "," => ActionFn(1625); + 605 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter, "," => ActionFn(1704); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant0(__symbols); let __sym7 = __pop_Variant8(__symbols); @@ -15456,15 +15186,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = match super::__action1625::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + let __nt = match super::__action1704::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 207) + (9, 216) } - 637 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1626); + 606 => { + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1705); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant8(__symbols); @@ -15476,15 +15206,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1626::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1705::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 638 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1627); + 607 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1706); assert!(__symbols.len() >= 10); let __sym9 = __pop_Variant0(__symbols); let __sym8 = __pop_Variant8(__symbols); @@ -15498,15 +15228,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym9.2; - let __nt = match super::__action1627::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + let __nt = match super::__action1706::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 207) + (10, 216) } - 639 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1628); + 608 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1707); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant8(__symbols); @@ -15521,15 +15251,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym10.2; - let __nt = match super::__action1628::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10) { + let __nt = match super::__action1707::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (11, 207) + (11, 216) } - 640 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1629); + 609 => { + // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1708); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant8(__symbols); @@ -15540,15 +15270,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1629::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1708::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 641 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1630); + 610 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1709); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant0(__symbols); let __sym7 = __pop_Variant8(__symbols); @@ -15561,15 +15291,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = match super::__action1630::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + let __nt = match super::__action1709::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 207) + (9, 216) } - 642 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1631); + 611 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1710); assert!(__symbols.len() >= 10); let __sym9 = __pop_Variant0(__symbols); let __sym8 = __pop_Variant8(__symbols); @@ -15583,15 +15313,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym9.2; - let __nt = match super::__action1631::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + let __nt = match super::__action1710::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 207) + (10, 216) } - 643 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, "," => ActionFn(1632); + 612 => { + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, "," => ActionFn(1711); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant63(__symbols); @@ -15600,15 +15330,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1632::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1711::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 644 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, "," => ActionFn(1633); + 613 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, "," => ActionFn(1712); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant63(__symbols); @@ -15619,15 +15349,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1633::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1712::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 645 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, "," => ActionFn(1634); + 614 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, "," => ActionFn(1713); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant63(__symbols); @@ -15639,15 +15369,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1634::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1713::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 646 => { - // ParameterList = OneOrMore>, ",", "*", "," => ActionFn(1635); + 615 => { + // ParameterList = OneOrMore>, ",", "*", "," => ActionFn(1714); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -15655,15 +15385,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1635::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1714::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (4, 216) } - 647 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", "," => ActionFn(1636); + 616 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", "," => ActionFn(1715); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -15673,15 +15403,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1636::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1715::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 648 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", "," => ActionFn(1637); + 617 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", "," => ActionFn(1716); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -15692,15 +15422,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1637::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1716::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 649 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1638); + 618 => { + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+, "," => ActionFn(1717); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant11(__symbols); @@ -15710,15 +15440,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1638::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1717::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 650 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1639); + 619 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+, "," => ActionFn(1718); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant11(__symbols); @@ -15730,15 +15460,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1639::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1718::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 651 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1640); + 620 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+, "," => ActionFn(1719); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant0(__symbols); let __sym7 = __pop_Variant11(__symbols); @@ -15751,15 +15481,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = match super::__action1640::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + let __nt = match super::__action1719::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 207) + (9, 216) } - 652 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+, "," => ActionFn(1641); + 621 => { + // ParameterList = OneOrMore>, ",", "*", ("," >)+, "," => ActionFn(1720); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant11(__symbols); @@ -15768,15 +15498,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1641::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1720::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 653 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, "," => ActionFn(1642); + 622 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, "," => ActionFn(1721); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant11(__symbols); @@ -15787,15 +15517,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1642::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1721::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 654 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, "," => ActionFn(1643); + 623 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, "," => ActionFn(1722); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant11(__symbols); @@ -15807,29 +15537,29 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1643::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1722::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 655 => { - // ParameterList = OneOrMore>, "," => ActionFn(1644); + 624 => { + // ParameterList = OneOrMore>, "," => ActionFn(1723); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action1644::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1723::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 207) + (2, 216) } - 656 => { - // ParameterList = OneOrMore>, ",", "/", "," => ActionFn(1645); + 625 => { + // ParameterList = OneOrMore>, ",", "/", "," => ActionFn(1724); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -15837,15 +15567,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1645::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1724::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (4, 216) } - 657 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, "," => ActionFn(1646); + 626 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, "," => ActionFn(1725); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant11(__symbols); @@ -15854,15 +15584,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1646::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1725::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 658 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1647); + 627 => { + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1726); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant8(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -15872,15 +15602,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1647::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1726::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 659 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1648); + 628 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1727); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant8(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -15892,15 +15622,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1648::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1727::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 660 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1649); + 629 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ",", KwargParameter => ActionFn(1728); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant8(__symbols); let __sym7 = __pop_Variant0(__symbols); @@ -15913,15 +15643,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = match super::__action1649::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + let __nt = match super::__action1728::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 207) + (9, 216) } - 661 => { - // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter => ActionFn(1650); + 630 => { + // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter => ActionFn(1729); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -15930,15 +15660,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1650::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1729::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 662 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter => ActionFn(1651); + 631 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter => ActionFn(1730); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant8(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -15949,15 +15679,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1651::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1730::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 663 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter => ActionFn(1652); + 632 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter => ActionFn(1731); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant8(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -15969,15 +15699,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1652::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1731::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 664 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1653); + 633 => { + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1732); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant8(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -15988,15 +15718,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1653::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1732::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 665 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1654); + 634 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1733); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant8(__symbols); let __sym7 = __pop_Variant0(__symbols); @@ -16009,15 +15739,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = match super::__action1654::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + let __nt = match super::__action1733::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 207) + (9, 216) } - 666 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1655); + 635 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1734); assert!(__symbols.len() >= 10); let __sym9 = __pop_Variant8(__symbols); let __sym8 = __pop_Variant0(__symbols); @@ -16031,15 +15761,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym9.2; - let __nt = match super::__action1655::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + let __nt = match super::__action1734::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (10, 207) + (10, 216) } - 667 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1656); + 636 => { + // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1735); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant8(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -16049,15 +15779,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1656::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1735::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 668 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1657); + 637 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1736); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant8(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -16069,15 +15799,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1657::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1736::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 669 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1658); + 638 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1737); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant8(__symbols); let __sym7 = __pop_Variant0(__symbols); @@ -16090,15 +15820,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = match super::__action1658::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + let __nt = match super::__action1737::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (9, 207) + (9, 216) } - 670 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter => ActionFn(1659); + 639 => { + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter => ActionFn(1738); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant63(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -16106,15 +15836,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1659::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1738::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (4, 216) } - 671 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter => ActionFn(1660); + 640 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter => ActionFn(1739); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant63(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -16124,15 +15854,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1660::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1739::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 672 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter => ActionFn(1661); + 641 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter => ActionFn(1740); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant63(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -16143,30 +15873,30 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1661::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1740::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 673 => { - // ParameterList = OneOrMore>, ",", "*" => ActionFn(1662); + 642 => { + // ParameterList = OneOrMore>, ",", "*" => ActionFn(1741); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1662::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1741::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 207) + (3, 216) } - 674 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*" => ActionFn(1663); + 643 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*" => ActionFn(1742); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -16175,15 +15905,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1663::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1742::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 675 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*" => ActionFn(1664); + 644 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*" => ActionFn(1743); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -16193,15 +15923,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1664::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1743::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 676 => { - // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1665); + 645 => { + // ParameterList = OneOrMore>, ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1744); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant11(__symbols); let __sym3 = __pop_Variant63(__symbols); @@ -16210,15 +15940,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1665::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1744::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 677 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1666); + 646 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1745); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant11(__symbols); let __sym5 = __pop_Variant63(__symbols); @@ -16229,15 +15959,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1666::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1745::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 678 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1667); + 647 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarTypedParameter, ("," >)+ => ActionFn(1746); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant11(__symbols); let __sym6 = __pop_Variant63(__symbols); @@ -16249,15 +15979,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = match super::__action1667::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + let __nt = match super::__action1746::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (8, 207) + (8, 216) } - 679 => { - // ParameterList = OneOrMore>, ",", "*", ("," >)+ => ActionFn(1668); + 648 => { + // ParameterList = OneOrMore>, ",", "*", ("," >)+ => ActionFn(1747); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -16265,15 +15995,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1668::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1747::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (4, 216) } - 680 => { - // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+ => ActionFn(1669); + 649 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+ => ActionFn(1748); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant11(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -16283,15 +16013,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1669::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1748::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 681 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+ => ActionFn(1670); + 650 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+ => ActionFn(1749); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant11(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -16302,42 +16032,42 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1670::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1749::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 682 => { - // ParameterList = OneOrMore> => ActionFn(1671); + 651 => { + // ParameterList = OneOrMore> => ActionFn(1750); let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = match super::__action1671::<>(mode, __sym0) { + let __nt = match super::__action1750::<>(mode, __sym0) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (1, 207) + (1, 216) } - 683 => { - // ParameterList = OneOrMore>, ",", "/" => ActionFn(1672); + 652 => { + // ParameterList = OneOrMore>, ",", "/" => ActionFn(1751); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1672::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1751::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 207) + (3, 216) } - 684 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+ => ActionFn(1673); + 653 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+ => ActionFn(1752); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -16345,15 +16075,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1673::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1752::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (4, 216) } - 685 => { - // ParameterList = OneOrMore>, ",", KwargParameter, "," => ActionFn(1674); + 654 => { + // ParameterList = OneOrMore>, ",", KwargParameter, "," => ActionFn(1753); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant8(__symbols); @@ -16361,15 +16091,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1674::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1753::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (4, 216) } - 686 => { - // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter, "," => ActionFn(1675); + 655 => { + // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter, "," => ActionFn(1754); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant8(__symbols); @@ -16379,15 +16109,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1675::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1754::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 687 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter, "," => ActionFn(1676); + 656 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter, "," => ActionFn(1755); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant8(__symbols); @@ -16398,30 +16128,30 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = match super::__action1676::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + let __nt = match super::__action1755::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (7, 207) + (7, 216) } - 688 => { - // ParameterList = OneOrMore>, ",", KwargParameter => ActionFn(1677); + 657 => { + // ParameterList = OneOrMore>, ",", KwargParameter => ActionFn(1756); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant8(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1677::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1756::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 207) + (3, 216) } - 689 => { - // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter => ActionFn(1678); + 658 => { + // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter => ActionFn(1757); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -16430,15 +16160,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1678::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1757::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 690 => { - // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter => ActionFn(1679); + 659 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter => ActionFn(1758); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant8(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -16448,15 +16178,15 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1679::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1758::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 691 => { - // ParameterList = "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1393); + 660 => { + // ParameterList = "*", StarTypedParameter, ",", KwargParameter, "," => ActionFn(1486); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant8(__symbols); @@ -16465,15 +16195,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1393::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1486::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) } - 692 => { - // ParameterList = "*", ",", KwargParameter, "," => ActionFn(1394); + 661 => { + // ParameterList = "*", ",", KwargParameter, "," => ActionFn(1487); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant8(__symbols); @@ -16481,15 +16211,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action1394::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1487::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (4, 216) } - 693 => { - // ParameterList = "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1395); + 662 => { + // ParameterList = "*", StarTypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1488); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant8(__symbols); @@ -16499,15 +16229,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = match super::__action1395::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + let __nt = match super::__action1488::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (6, 207) + (6, 216) } - 694 => { - // ParameterList = "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1396); + 663 => { + // ParameterList = "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1489); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant8(__symbols); @@ -16516,325 +16246,1441 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action1396::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1489::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (5, 216) + } + 664 => { + // ParameterList = "*", StarTypedParameter, "," => ActionFn(1490); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1490::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 216) + } + 665 => { + // ParameterList = "*", "," => ActionFn(1491); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1491::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (2, 216) + } + 666 => { + // ParameterList = "*", StarTypedParameter, ("," >)+, "," => ActionFn(1492); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1492::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 216) + } + 667 => { + // ParameterList = "*", ("," >)+, "," => ActionFn(1493); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1493::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 216) + } + 668 => { + // ParameterList = "*", StarTypedParameter, ",", KwargParameter => ActionFn(1494); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant8(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1494::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 216) + } + 669 => { + // ParameterList = "*", ",", KwargParameter => ActionFn(1495); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant8(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1495::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 216) + } + 670 => { + // ParameterList = "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1496); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant8(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1496::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 216) + } + 671 => { + // ParameterList = "*", ("," >)+, ",", KwargParameter => ActionFn(1497); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant8(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1497::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 216) + } + 672 => { + // ParameterList = "*", StarTypedParameter => ActionFn(1498); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1498::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (2, 216) + } + 673 => { + // ParameterList = "*" => ActionFn(1499); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1499::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (1, 216) + } + 674 => { + // ParameterList = "*", StarTypedParameter, ("," >)+ => ActionFn(1500); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1500::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 216) + } + 675 => { + // ParameterList = "*", ("," >)+ => ActionFn(1501); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1501::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (2, 216) + } + 676 => { + __reduce676(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 677 => { + __reduce677(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 678 => { + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1759); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant8(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant63(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1759::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) + } + 679 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1760); + assert!(__symbols.len() >= 9); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant8(__symbols); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym8.2; + let __nt = match super::__action1760::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (9, 217) + } + 680 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1761); + assert!(__symbols.len() >= 10); + let __sym9 = __pop_Variant0(__symbols); + let __sym8 = __pop_Variant8(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym9.2; + let __nt = match super::__action1761::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (10, 217) + } + 681 => { + // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter, "," => ActionFn(1762); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant8(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1762::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) + } + 682 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter, "," => ActionFn(1763); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant8(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym7.2; + let __nt = match super::__action1763::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (8, 217) + } + 683 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter, "," => ActionFn(1764); + assert!(__symbols.len() >= 9); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant8(__symbols); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym8.2; + let __nt = match super::__action1764::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (9, 217) + } + 684 => { + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1765); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant8(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant11(__symbols); + let __sym3 = __pop_Variant63(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym7.2; + let __nt = match super::__action1765::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (8, 217) + } + 685 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1766); + assert!(__symbols.len() >= 10); + let __sym9 = __pop_Variant0(__symbols); + let __sym8 = __pop_Variant8(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym9.2; + let __nt = match super::__action1766::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (10, 217) + } + 686 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1767); + assert!(__symbols.len() >= 11); + let __sym10 = __pop_Variant0(__symbols); + let __sym9 = __pop_Variant8(__symbols); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant11(__symbols); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym10.2; + let __nt = match super::__action1767::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (11, 217) + } + 687 => { + // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1768); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant8(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1768::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) + } + 688 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1769); + assert!(__symbols.len() >= 9); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant8(__symbols); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant11(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym8.2; + let __nt = match super::__action1769::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (9, 217) + } + 689 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1770); + assert!(__symbols.len() >= 10); + let __sym9 = __pop_Variant0(__symbols); + let __sym8 = __pop_Variant8(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym9.2; + let __nt = match super::__action1770::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (10, 217) + } + 690 => { + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, "," => ActionFn(1771); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant63(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1771::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) + } + 691 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, "," => ActionFn(1772); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1772::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) + } + 692 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, "," => ActionFn(1773); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym7.2; + let __nt = match super::__action1773::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (8, 217) + } + 693 => { + // ParameterList = OneOrMore>, ",", "*", "," => ActionFn(1774); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1774::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) + } + 694 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", "," => ActionFn(1775); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1775::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) } 695 => { - // ParameterList = "*", StarUntypedParameter, "," => ActionFn(1397); - assert!(__symbols.len() >= 3); + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", "," => ActionFn(1776); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1397::<>(mode, __sym0, __sym1, __sym2) { + let __end = __sym6.2; + let __nt = match super::__action1776::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 207) + (7, 217) } 696 => { - // ParameterList = "*", "," => ActionFn(1398); - assert!(__symbols.len() >= 2); + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1777); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant11(__symbols); + let __sym3 = __pop_Variant63(__symbols); + let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1398::<>(mode, __sym0, __sym1) { + let __end = __sym5.2; + let __nt = match super::__action1777::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 207) + (6, 217) } 697 => { - // ParameterList = "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1399); - assert!(__symbols.len() >= 4); + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1778); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant11(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1399::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __end = __sym7.2; + let __nt = match super::__action1778::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (8, 217) } 698 => { - // ParameterList = "*", ("," >)+, "," => ActionFn(1400); - assert!(__symbols.len() >= 3); + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1779); + assert!(__symbols.len() >= 9); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant11(__symbols); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant11(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1400::<>(mode, __sym0, __sym1, __sym2) { + let __end = __sym8.2; + let __nt = match super::__action1779::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 207) + (9, 217) } 699 => { - // ParameterList = "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1401); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant8(__symbols); + // ParameterList = OneOrMore>, ",", "*", ("," >)+, "," => ActionFn(1780); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1401::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __end = __sym4.2; + let __nt = match super::__action1780::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (5, 217) } 700 => { - // ParameterList = "*", ",", KwargParameter => ActionFn(1402); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant8(__symbols); + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, "," => ActionFn(1781); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant11(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1402::<>(mode, __sym0, __sym1, __sym2) { + let __end = __sym6.2; + let __nt = match super::__action1781::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 207) + (7, 217) } 701 => { - // ParameterList = "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1403); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant8(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant11(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, "," => ActionFn(1782); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action1403::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __end = __sym7.2; + let __nt = match super::__action1782::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (5, 207) + (8, 217) } 702 => { - // ParameterList = "*", ("," >)+, ",", KwargParameter => ActionFn(1404); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant8(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant11(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ParameterList = OneOrMore>, "," => ActionFn(1783); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action1404::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __end = __sym1.2; + let __nt = match super::__action1783::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (4, 207) + (2, 217) } 703 => { - // ParameterList = "*", StarUntypedParameter => ActionFn(1405); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ParameterList = OneOrMore>, ",", "/", "," => ActionFn(1784); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1405::<>(mode, __sym0, __sym1) { + let __end = __sym3.2; + let __nt = match super::__action1784::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 207) + (4, 217) } 704 => { - // ParameterList = "*" => ActionFn(1406); - let __sym0 = __pop_Variant0(__symbols); + // ParameterList = OneOrMore>, ",", "/", ("," >)+, "," => ActionFn(1785); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1406::<>(mode, __sym0) { + let __end = __sym4.2; + let __nt = match super::__action1785::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (1, 207) + (5, 217) } 705 => { - // ParameterList = "*", StarUntypedParameter, ("," >)+ => ActionFn(1407); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant11(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1786); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant8(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant63(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1407::<>(mode, __sym0, __sym1, __sym2) { + let __end = __sym5.2; + let __nt = match super::__action1786::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 207) + (6, 217) } 706 => { - // ParameterList = "*", ("," >)+ => ActionFn(1408); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant11(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1787); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant8(__symbols); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1408::<>(mode, __sym0, __sym1) { + let __end = __sym7.2; + let __nt = match super::__action1787::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 207) + (8, 217) } 707 => { - __reduce707(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1788); + assert!(__symbols.len() >= 9); + let __sym8 = __pop_Variant8(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym8.2; + let __nt = match super::__action1788::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (9, 217) } 708 => { - __reduce708(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterList = OneOrMore>, ",", "*", ",", KwargParameter => ActionFn(1789); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant8(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1789::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) } 709 => { - __reduce709(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterList = OneOrMore>, ",", "/", ",", "*", ",", KwargParameter => ActionFn(1790); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant8(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1790::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) } 710 => { - __reduce710(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ",", KwargParameter => ActionFn(1791); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant8(__symbols); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym7.2; + let __nt = match super::__action1791::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (8, 217) } 711 => { - // ParameterListStarArgs = "*", StarTypedParameter, ",", KwargParameter => ActionFn(870); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant8(__symbols); + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1792); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant8(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant11(__symbols); + let __sym3 = __pop_Variant63(__symbols); let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action870::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __end = __sym6.2; + let __nt = match super::__action1792::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (4, 209) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) } 712 => { - // ParameterListStarArgs = "*", ",", KwargParameter => ActionFn(871); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant8(__symbols); + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1793); + assert!(__symbols.len() >= 9); + let __sym8 = __pop_Variant8(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action871::<>(mode, __sym0, __sym1, __sym2) { + let __end = __sym8.2; + let __nt = match super::__action1793::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (3, 209) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (9, 217) } 713 => { - // ParameterListStarArgs = "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(872); + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1794); + assert!(__symbols.len() >= 10); + let __sym9 = __pop_Variant8(__symbols); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant11(__symbols); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym9.2; + let __nt = match super::__action1794::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (10, 217) + } + 714 => { + // ParameterList = OneOrMore>, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1795); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant8(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1795::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) + } + 715 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1796); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant8(__symbols); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant11(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym7.2; + let __nt = match super::__action1796::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (8, 217) + } + 716 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+, ",", KwargParameter => ActionFn(1797); + assert!(__symbols.len() >= 9); + let __sym8 = __pop_Variant8(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym8.2; + let __nt = match super::__action1797::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (9, 217) + } + 717 => { + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter => ActionFn(1798); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant63(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1798::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) + } + 718 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter => ActionFn(1799); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1799::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) + } + 719 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter => ActionFn(1800); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1800::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) + } + 720 => { + // ParameterList = OneOrMore>, ",", "*" => ActionFn(1801); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1801::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 217) + } + 721 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*" => ActionFn(1802); assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1802::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) + } + 722 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*" => ActionFn(1803); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1803::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) + } + 723 => { + // ParameterList = OneOrMore>, ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1804); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant11(__symbols); + let __sym3 = __pop_Variant63(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1804::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) + } + 724 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1805); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant63(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1805::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) + } + 725 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", StarUntypedParameter, ("," >)+ => ActionFn(1806); + assert!(__symbols.len() >= 8); + let __sym7 = __pop_Variant11(__symbols); + let __sym6 = __pop_Variant63(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym7.2; + let __nt = match super::__action1806::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (8, 217) + } + 726 => { + // ParameterList = OneOrMore>, ",", "*", ("," >)+ => ActionFn(1807); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1807::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) + } + 727 => { + // ParameterList = OneOrMore>, ",", "/", ",", "*", ("," >)+ => ActionFn(1808); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant11(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1808::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) + } + 728 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", "*", ("," >)+ => ActionFn(1809); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant11(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1809::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) + } + 729 => { + // ParameterList = OneOrMore> => ActionFn(1810); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1810::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (1, 217) + } + 730 => { + // ParameterList = OneOrMore>, ",", "/" => ActionFn(1811); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1811::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 217) + } + 731 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+ => ActionFn(1812); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1812::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) + } + 732 => { + // ParameterList = OneOrMore>, ",", KwargParameter, "," => ActionFn(1813); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant8(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1813::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) + } + 733 => { + // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter, "," => ActionFn(1814); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant8(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1814::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) + } + 734 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter, "," => ActionFn(1815); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant8(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = match super::__action1815::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (7, 217) + } + 735 => { + // ParameterList = OneOrMore>, ",", KwargParameter => ActionFn(1816); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant8(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1816::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 217) + } + 736 => { + // ParameterList = OneOrMore>, ",", "/", ",", KwargParameter => ActionFn(1817); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant8(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1817::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) + } + 737 => { + // ParameterList = OneOrMore>, ",", "/", ("," >)+, ",", KwargParameter => ActionFn(1818); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant8(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = match super::__action1818::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) + } + 738 => { + // ParameterList = "*", StarUntypedParameter, ",", KwargParameter, "," => ActionFn(1524); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant8(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1524::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) + } + 739 => { + // ParameterList = "*", ",", KwargParameter, "," => ActionFn(1525); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant8(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1525::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) + } + 740 => { + // ParameterList = "*", StarUntypedParameter, ("," >)+, ",", KwargParameter, "," => ActionFn(1526); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant11(__symbols); let __sym1 = __pop_Variant63(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = match super::__action872::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __end = __sym5.2; + let __nt = match super::__action1526::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (5, 209) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (6, 217) } - 714 => { - // ParameterListStarArgs = "*", ("," >)+, ",", KwargParameter => ActionFn(873); - assert!(__symbols.len() >= 4); + 741 => { + // ParameterList = "*", ("," >)+, ",", KwargParameter, "," => ActionFn(1527); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant8(__symbols); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant11(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = match super::__action873::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __end = __sym4.2; + let __nt = match super::__action1527::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (4, 209) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) } - 715 => { - // ParameterListStarArgs = "*", StarTypedParameter => ActionFn(874); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action874::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (2, 209) - } - 716 => { - // ParameterListStarArgs = "*" => ActionFn(875); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action875::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (1, 209) - } - 717 => { - // ParameterListStarArgs = "*", StarTypedParameter, ("," >)+ => ActionFn(876); + 742 => { + // ParameterList = "*", StarUntypedParameter, "," => ActionFn(1528); assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant63(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action876::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1528::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (3, 209) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 217) } - 718 => { - // ParameterListStarArgs = "*", ("," >)+ => ActionFn(877); + 743 => { + // ParameterList = "*", "," => ActionFn(1529); assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action877::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1529::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (2, 209) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (2, 217) } - 719 => { - // ParameterListStarArgs = "*", StarUntypedParameter, ",", KwargParameter => ActionFn(995); + 744 => { + // ParameterList = "*", StarUntypedParameter, ("," >)+, "," => ActionFn(1530); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1530::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) + } + 745 => { + // ParameterList = "*", ("," >)+, "," => ActionFn(1531); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1531::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 217) + } + 746 => { + // ParameterList = "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1532); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant8(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -16842,30 +17688,30 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action995::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1532::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (4, 210) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) } - 720 => { - // ParameterListStarArgs = "*", ",", KwargParameter => ActionFn(996); + 747 => { + // ParameterList = "*", ",", KwargParameter => ActionFn(1533); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant8(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action996::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1533::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (3, 210) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 217) } - 721 => { - // ParameterListStarArgs = "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(997); + 748 => { + // ParameterList = "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1534); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant8(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -16874,15 +17720,15 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = match super::__action997::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + let __nt = match super::__action1534::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (5, 210) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (5, 217) } - 722 => { - // ParameterListStarArgs = "*", ("," >)+, ",", KwargParameter => ActionFn(998); + 749 => { + // ParameterList = "*", ("," >)+, ",", KwargParameter => ActionFn(1535); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant8(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -16890,171 +17736,67 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = match super::__action998::<>(mode, __sym0, __sym1, __sym2, __sym3) { + let __nt = match super::__action1535::<>(mode, __sym0, __sym1, __sym2, __sym3) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (4, 210) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (4, 217) } - 723 => { - // ParameterListStarArgs = "*", StarUntypedParameter => ActionFn(999); + 750 => { + // ParameterList = "*", StarUntypedParameter => ActionFn(1536); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant63(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action999::<>(mode, __sym0, __sym1) { + let __nt = match super::__action1536::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (2, 210) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (2, 217) } - 724 => { - // ParameterListStarArgs = "*" => ActionFn(1000); + 751 => { + // ParameterList = "*" => ActionFn(1537); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = match super::__action1000::<>(mode, __sym0) { + let __nt = match super::__action1537::<>(mode, __sym0) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (1, 210) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (1, 217) } - 725 => { - // ParameterListStarArgs = "*", StarUntypedParameter, ("," >)+ => ActionFn(1001); + 752 => { + // ParameterList = "*", StarUntypedParameter, ("," >)+ => ActionFn(1538); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant11(__symbols); let __sym1 = __pop_Variant63(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = match super::__action1001::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1538::<>(mode, __sym0, __sym1, __sym2) { Ok(v) => v, Err(e) => return Some(Err(e)), }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (3, 210) + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 217) } - 726 => { - // ParameterListStarArgs = "*", ("," >)+ => ActionFn(1002); + 753 => { + // ParameterList = "*", ("," >)+ => ActionFn(1539); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant11(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = match super::__action1002::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant12(__nt), __end)); - (2, 210) - } - 727 => { - // Parameters = "(", ParameterList, ")" => ActionFn(1498); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant45(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = match super::__action1498::<>(mode, __sym0, __sym1, __sym2) { + let __nt = match super::__action1539::<>(mode, __sym0, __sym1) { Ok(v) => v, Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (3, 211) - } - 728 => { - // Parameters = "(", ")" => ActionFn(1499); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1499::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 211) - } - 729 => { - __reduce729(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 730 => { - __reduce730(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 731 => { - __reduce731(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 732 => { - __reduce732(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 733 => { - __reduce733(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 734 => { - __reduce734(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 735 => { - __reduce735(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 736 => { - __reduce736(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 737 => { - __reduce737(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 738 => { - __reduce738(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 739 => { - __reduce739(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 740 => { - __reduce740(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 741 => { - __reduce741(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 742 => { - __reduce742(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 743 => { - __reduce743(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 744 => { - __reduce744(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 745 => { - __reduce745(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 746 => { - __reduce746(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 747 => { - __reduce747(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 748 => { - __reduce748(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 749 => { - __reduce749(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 750 => { - __reduce750(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 751 => { - __reduce751(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 752 => { - __reduce752(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) - } - 753 => { - __reduce753(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + (2, 217) } 754 => { __reduce754(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -17069,58 +17811,271 @@ mod __parse__Top { __reduce757(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 758 => { - __reduce758(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarTypedParameter, ",", KwargParameter => ActionFn(949); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant8(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action949::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (4, 219) } 759 => { - __reduce759(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", ",", KwargParameter => ActionFn(950); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant8(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action950::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (3, 219) } 760 => { - __reduce760(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarTypedParameter, ("," >)+, ",", KwargParameter => ActionFn(951); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant8(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action951::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (5, 219) } 761 => { - __reduce761(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", ("," >)+, ",", KwargParameter => ActionFn(952); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant8(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action952::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (4, 219) } 762 => { - __reduce762(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarTypedParameter => ActionFn(953); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action953::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (2, 219) } 763 => { - __reduce763(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*" => ActionFn(954); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action954::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (1, 219) } 764 => { - __reduce764(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarTypedParameter, ("," >)+ => ActionFn(955); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action955::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (3, 219) } 765 => { - __reduce765(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", ("," >)+ => ActionFn(956); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action956::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (2, 219) } 766 => { - __reduce766(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarUntypedParameter, ",", KwargParameter => ActionFn(1078); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant8(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1078::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (4, 220) } 767 => { - __reduce767(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", ",", KwargParameter => ActionFn(1079); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant8(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1079::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (3, 220) } 768 => { - __reduce768(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarUntypedParameter, ("," >)+, ",", KwargParameter => ActionFn(1080); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant8(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = match super::__action1080::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (5, 220) } 769 => { - __reduce769(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", ("," >)+, ",", KwargParameter => ActionFn(1081); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant8(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = match super::__action1081::<>(mode, __sym0, __sym1, __sym2, __sym3) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (4, 220) } 770 => { - __reduce770(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarUntypedParameter => ActionFn(1082); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1082::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (2, 220) } 771 => { - __reduce771(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*" => ActionFn(1083); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1083::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (1, 220) } 772 => { - __reduce772(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", StarUntypedParameter, ("," >)+ => ActionFn(1084); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant11(__symbols); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1084::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (3, 220) } 773 => { - __reduce773(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // ParameterListStarArgs = "*", ("," >)+ => ActionFn(1085); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant11(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1085::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant12(__nt), __end)); + (2, 220) } 774 => { - __reduce774(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Parameters = "(", ParameterList, ")" => ActionFn(1633); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant45(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = match super::__action1633::<>(mode, __sym0, __sym1, __sym2) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (3, 221) } 775 => { - __reduce775(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // Parameters = "(", ")" => ActionFn(1634); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1634::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (2, 221) } 776 => { __reduce776(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -17540,6 +18495,174 @@ mod __parse__Top { __reduce914(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 915 => { + __reduce915(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 916 => { + __reduce916(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 917 => { + __reduce917(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 918 => { + __reduce918(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 919 => { + __reduce919(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 920 => { + __reduce920(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 921 => { + __reduce921(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 922 => { + __reduce922(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 923 => { + __reduce923(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 924 => { + __reduce924(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 925 => { + __reduce925(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 926 => { + __reduce926(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 927 => { + __reduce927(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 928 => { + __reduce928(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 929 => { + __reduce929(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 930 => { + __reduce930(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 931 => { + __reduce931(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 932 => { + __reduce932(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 933 => { + __reduce933(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 934 => { + __reduce934(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 935 => { + __reduce935(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 936 => { + __reduce936(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 937 => { + __reduce937(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 938 => { + __reduce938(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 939 => { + __reduce939(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 940 => { + __reduce940(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 941 => { + __reduce941(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 942 => { + __reduce942(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 943 => { + __reduce943(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 944 => { + __reduce944(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 945 => { + __reduce945(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 946 => { + __reduce946(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 947 => { + __reduce947(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 948 => { + __reduce948(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 949 => { + __reduce949(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 950 => { + __reduce950(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 951 => { + __reduce951(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 952 => { + __reduce952(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 953 => { + __reduce953(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 954 => { + __reduce954(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 955 => { + __reduce955(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 956 => { + __reduce956(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 957 => { + __reduce957(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 958 => { + __reduce958(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 959 => { + __reduce959(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 960 => { + __reduce960(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 961 => { + __reduce961(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 962 => { + __reduce962(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 963 => { + __reduce963(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 964 => { + __reduce964(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 965 => { + __reduce965(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 966 => { + __reduce966(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 967 => { + __reduce967(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 968 => { + __reduce968(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 969 => { + __reduce969(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 970 => { + __reduce970(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 971 => { // __Top = Top => ActionFn(0); let __sym0 = __pop_Variant89(__symbols); let __start = __sym0.0; @@ -18508,11 +19631,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ","? = "," => ActionFn(356); + // ","? = "," => ActionFn(363); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action356::<>(mode, __sym0); + let __nt = super::__action363::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 0) } @@ -18524,10 +19647,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ","? = => ActionFn(357); + // ","? = => ActionFn(364); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action357::<>(mode, &__start, &__end); + let __nt = super::__action364::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 0) } @@ -18539,11 +19662,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ";"? = ";" => ActionFn(380); + // ";"? = ";" => ActionFn(387); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action380::<>(mode, __sym0); + let __nt = super::__action387::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 1) } @@ -18555,10 +19678,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ";"? = => ActionFn(381); + // ";"? = => ActionFn(388); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action381::<>(mode, &__start, &__end); + let __nt = super::__action388::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 1) } @@ -18570,11 +19693,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // "async"? = "async" => ActionFn(313); + // "async"? = "async" => ActionFn(315); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action313::<>(mode, __sym0); + let __nt = super::__action315::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 2) } @@ -18586,10 +19709,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // "async"? = => ActionFn(314); + // "async"? = => ActionFn(316); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action314::<>(mode, &__start, &__end); + let __nt = super::__action316::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 2) } @@ -18601,13 +19724,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >) = ",", KwargParameter => ActionFn(410); + // ("," >) = ",", KwargParameter => ActionFn(419); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant8(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action410::<>(mode, __sym0, __sym1); + let __nt = super::__action419::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (2, 3) } @@ -18619,13 +19742,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = ",", KwargParameter => ActionFn(663); + // ("," >)? = ",", KwargParameter => ActionFn(713); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant8(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action663::<>(mode, __sym0, __sym1); + let __nt = super::__action713::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 4) } @@ -18637,10 +19760,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = => ActionFn(465); + // ("," >)? = => ActionFn(472); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action465::<>(mode, &__start, &__end); + let __nt = super::__action472::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 4) } @@ -18652,13 +19775,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >) = ",", KwargParameter => ActionFn(418); + // ("," >) = ",", KwargParameter => ActionFn(427); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant8(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action418::<>(mode, __sym0, __sym1); + let __nt = super::__action427::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (2, 5) } @@ -18670,13 +19793,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = ",", KwargParameter => ActionFn(668); + // ("," >)? = ",", KwargParameter => ActionFn(718); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant8(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action668::<>(mode, __sym0, __sym1); + let __nt = super::__action718::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 6) } @@ -18688,10 +19811,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = => ActionFn(454); + // ("," >)? = => ActionFn(461); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action454::<>(mode, &__start, &__end); + let __nt = super::__action461::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 6) } @@ -18703,13 +19826,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >) = ",", ParameterDef => ActionFn(468); + // ("," >) = ",", ParameterDef => ActionFn(475); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant10(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action468::<>(mode, __sym0, __sym1); + let __nt = super::__action475::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 7) } @@ -18721,10 +19844,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)* = => ActionFn(466); + // ("," >)* = => ActionFn(473); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action466::<>(mode, &__start, &__end); + let __nt = super::__action473::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (0, 8) } @@ -18736,11 +19859,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)* = ("," >)+ => ActionFn(467); + // ("," >)* = ("," >)+ => ActionFn(474); let __sym0 = __pop_Variant11(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action467::<>(mode, __sym0); + let __nt = super::__action474::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 8) } @@ -18752,13 +19875,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)+ = ",", ParameterDef => ActionFn(673); + // ("," >)+ = ",", ParameterDef => ActionFn(723); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant10(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action673::<>(mode, __sym0, __sym1); + let __nt = super::__action723::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (2, 9) } @@ -18770,14 +19893,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)+ = ("," >)+, ",", ParameterDef => ActionFn(674); + // ("," >)+ = ("," >)+, ",", ParameterDef => ActionFn(724); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant10(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant11(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action674::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action724::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (3, 9) } @@ -18789,13 +19912,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >) = ",", ParameterDef => ActionFn(457); + // ("," >) = ",", ParameterDef => ActionFn(464); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant10(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action457::<>(mode, __sym0, __sym1); + let __nt = super::__action464::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 10) } @@ -18807,10 +19930,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)* = => ActionFn(455); + // ("," >)* = => ActionFn(462); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action455::<>(mode, &__start, &__end); + let __nt = super::__action462::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (0, 11) } @@ -18822,11 +19945,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)* = ("," >)+ => ActionFn(456); + // ("," >)* = ("," >)+ => ActionFn(463); let __sym0 = __pop_Variant11(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action456::<>(mode, __sym0); + let __nt = super::__action463::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 11) } @@ -18838,13 +19961,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)+ = ",", ParameterDef => ActionFn(681); + // ("," >)+ = ",", ParameterDef => ActionFn(731); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant10(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action681::<>(mode, __sym0, __sym1); + let __nt = super::__action731::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (2, 12) } @@ -18856,14 +19979,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)+ = ("," >)+, ",", ParameterDef => ActionFn(682); + // ("," >)+ = ("," >)+, ",", ParameterDef => ActionFn(732); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant10(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant11(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action682::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action732::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (3, 12) } @@ -18875,10 +19998,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = => ActionFn(413); + // ("," >)? = => ActionFn(422); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action413::<>(mode, &__start, &__end); + let __nt = super::__action422::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (0, 14) } @@ -18890,10 +20013,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = => ActionFn(421); + // ("," >)? = => ActionFn(430); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action421::<>(mode, &__start, &__end); + let __nt = super::__action430::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (0, 16) } @@ -18905,13 +20028,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >) = ",", Test<"all"> => ActionFn(350); + // ("," >) = ",", Test<"all"> => ActionFn(357); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action350::<>(mode, __sym0, __sym1); + let __nt = super::__action357::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 17) } @@ -18923,13 +20046,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = ",", Test<"all"> => ActionFn(1053); + // ("," >)? = ",", Test<"all"> => ActionFn(1136); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1053::<>(mode, __sym0, __sym1); + let __nt = super::__action1136::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (2, 18) } @@ -18941,10 +20064,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)? = => ActionFn(349); + // ("," >)? = => ActionFn(356); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action349::<>(mode, &__start, &__end); + let __nt = super::__action356::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (0, 18) } @@ -18956,13 +20079,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," ) = ",", TestOrStarNamedExpr => ActionFn(543); + // ("," ) = ",", TestOrStarNamedExpr => ActionFn(587); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action543::<>(mode, __sym0, __sym1); + let __nt = super::__action587::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 19) } @@ -18974,10 +20097,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," )* = => ActionFn(541); + // ("," )* = => ActionFn(585); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action541::<>(mode, &__start, &__end); + let __nt = super::__action585::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (0, 20) } @@ -18989,11 +20112,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," )* = ("," )+ => ActionFn(542); + // ("," )* = ("," )+ => ActionFn(586); let __sym0 = __pop_Variant16(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action542::<>(mode, __sym0); + let __nt = super::__action586::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 20) } @@ -19005,13 +20128,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," )+ = ",", TestOrStarNamedExpr => ActionFn(1056); + // ("," )+ = ",", TestOrStarNamedExpr => ActionFn(1139); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1056::<>(mode, __sym0, __sym1); + let __nt = super::__action1139::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (2, 21) } @@ -19023,14 +20146,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," )+ = ("," )+, ",", TestOrStarNamedExpr => ActionFn(1057); + // ("," )+ = ("," )+, ",", TestOrStarNamedExpr => ActionFn(1140); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant16(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1057::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1140::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (3, 21) } @@ -19042,13 +20165,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >) = ",", WithItem<"all"> => ActionFn(296); + // ("," >) = ",", WithItem<"all"> => ActionFn(298); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant17(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action296::<>(mode, __sym0, __sym1); + let __nt = super::__action298::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (2, 22) } @@ -19060,10 +20183,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)* = => ActionFn(294); + // ("," >)* = => ActionFn(296); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action294::<>(mode, &__start, &__end); + let __nt = super::__action296::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (0, 23) } @@ -19075,11 +20198,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)* = ("," >)+ => ActionFn(295); + // ("," >)* = ("," >)+ => ActionFn(297); let __sym0 = __pop_Variant18(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action295::<>(mode, __sym0); + let __nt = super::__action297::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 23) } @@ -19091,13 +20214,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)+ = ",", WithItem<"all"> => ActionFn(1066); + // ("," >)+ = ",", WithItem<"all"> => ActionFn(1153); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant17(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1066::<>(mode, __sym0, __sym1); + let __nt = super::__action1153::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (2, 24) } @@ -19109,14 +20232,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("," >)+ = ("," >)+, ",", WithItem<"all"> => ActionFn(1067); + // ("," >)+ = ("," >)+, ",", WithItem<"all"> => ActionFn(1154); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant17(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant18(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1067::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1154::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (3, 24) } @@ -19128,13 +20251,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("->" >) = "->", Test<"all"> => ActionFn(283); + // ("->" >) = "->", Test<"all"> => ActionFn(285); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action283::<>(mode, __sym0, __sym1); + let __nt = super::__action285::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 25) } @@ -19146,13 +20269,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("->" >)? = "->", Test<"all"> => ActionFn(1072); + // ("->" >)? = "->", Test<"all"> => ActionFn(1159); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1072::<>(mode, __sym0, __sym1); + let __nt = super::__action1159::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (2, 26) } @@ -19164,10 +20287,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("->" >)? = => ActionFn(282); + // ("->" >)? = => ActionFn(284); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action282::<>(mode, &__start, &__end); + let __nt = super::__action284::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (0, 26) } @@ -19179,13 +20302,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("." Identifier) = ".", Identifier => ActionFn(355); + // ("." Identifier) = ".", Identifier => ActionFn(362); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action355::<>(mode, __sym0, __sym1); + let __nt = super::__action362::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (2, 27) } @@ -19197,13 +20320,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("." Identifier)+ = ".", Identifier => ActionFn(1077); + // ("." Identifier)+ = ".", Identifier => ActionFn(1164); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1077::<>(mode, __sym0, __sym1); + let __nt = super::__action1164::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (2, 28) } @@ -19215,14 +20338,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("." Identifier)+ = ("." Identifier)+, ".", Identifier => ActionFn(1078); + // ("." Identifier)+ = ("." Identifier)+, ".", Identifier => ActionFn(1165); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant20(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1078::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1165::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (3, 28) } @@ -19234,13 +20357,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (":" >) = ":", Test<"all"> => ActionFn(273); + // (":" >) = ":", Test<"all"> => ActionFn(275); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action273::<>(mode, __sym0, __sym1); + let __nt = super::__action275::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 29) } @@ -19252,13 +20375,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (":" >)? = ":", Test<"all"> => ActionFn(1079); + // (":" >)? = ":", Test<"all"> => ActionFn(1166); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1079::<>(mode, __sym0, __sym1); + let __nt = super::__action1166::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (2, 30) } @@ -19270,10 +20393,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (":" >)? = => ActionFn(272); + // (":" >)? = => ActionFn(274); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action272::<>(mode, &__start, &__end); + let __nt = super::__action274::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (0, 30) } @@ -19285,13 +20408,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (":" ) = ":", TestOrStarExpr => ActionFn(270); + // (":" ) = ":", TestOrStarExpr => ActionFn(272); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action270::<>(mode, __sym0, __sym1); + let __nt = super::__action272::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 31) } @@ -19303,13 +20426,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (":" )? = ":", TestOrStarExpr => ActionFn(1086); + // (":" )? = ":", TestOrStarExpr => ActionFn(1173); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1086::<>(mode, __sym0, __sym1); + let __nt = super::__action1173::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (2, 32) } @@ -19321,10 +20444,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (":" )? = => ActionFn(269); + // (":" )? = => ActionFn(271); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action269::<>(mode, &__start, &__end); + let __nt = super::__action271::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (0, 32) } @@ -19336,11 +20459,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("\n") = "\n" => ActionFn(387); + // ("?") = "?" => ActionFn(352); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action387::<>(mode, __sym0); + let __nt = super::__action352::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant0(__nt), __end)); (1, 33) } @@ -19352,12 +20475,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("\n")* = => ActionFn(385); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action385::<>(mode, &__start, &__end); + // ("?")+ = "?" => ActionFn(1176); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1176::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant21(__nt), __end)); - (0, 34) + (1, 34) } pub(crate) fn __reduce83< >( @@ -19367,13 +20491,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("\n")* = ("\n")+ => ActionFn(386); + // ("?")+ = ("?")+, "?" => ActionFn(1177); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant21(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action386::<>(mode, __sym0); + let __end = __sym1.2; + let __nt = super::__action1177::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant21(__nt), __end)); - (1, 34) + (2, 34) } pub(crate) fn __reduce84< >( @@ -19383,12 +20509,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("\n")+ = "\n" => ActionFn(1089); + // ("\n") = "\n" => ActionFn(394); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1089::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant21(__nt), __end)); + let __nt = super::__action394::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant0(__nt), __end)); (1, 35) } pub(crate) fn __reduce85< @@ -19399,15 +20525,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("\n")+ = ("\n")+, "\n" => ActionFn(1090); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant21(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1090::<>(mode, __sym0, __sym1); + // ("\n")* = => ActionFn(392); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action392::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant21(__nt), __end)); - (2, 35) + (0, 36) } pub(crate) fn __reduce86< >( @@ -19417,15 +20540,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("as" ) = "as", Identifier => ActionFn(398); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant22(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ("\n")* = ("\n")+ => ActionFn(393); + let __sym0 = __pop_Variant21(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action398::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant22(__nt), __end)); - (2, 36) + let __end = __sym0.2; + let __nt = super::__action393::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant21(__nt), __end)); + (1, 36) } pub(crate) fn __reduce87< >( @@ -19435,15 +20556,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("as" )? = "as", Identifier => ActionFn(1093); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant22(__symbols); + // ("\n")+ = "\n" => ActionFn(1178); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1093::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant23(__nt), __end)); - (2, 37) + let __end = __sym0.2; + let __nt = super::__action1178::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant21(__nt), __end)); + (1, 37) } pub(crate) fn __reduce88< >( @@ -19453,12 +20572,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("as" )? = => ActionFn(397); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action397::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant23(__nt), __end)); - (0, 37) + // ("\n")+ = ("\n")+, "\n" => ActionFn(1179); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant21(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1179::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant21(__nt), __end)); + (2, 37) } pub(crate) fn __reduce89< >( @@ -19468,16 +20590,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("else" ":" ) = "else", ":", Suite => ActionFn(317); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // ("as" ) = "as", Identifier => ActionFn(405); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action317::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (3, 38) + let __end = __sym1.2; + let __nt = super::__action405::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant22(__nt), __end)); + (2, 38) } pub(crate) fn __reduce90< >( @@ -19487,16 +20608,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("else" ":" )? = "else", ":", Suite => ActionFn(1098); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // ("as" )? = "as", Identifier => ActionFn(1182); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1098::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant25(__nt), __end)); - (3, 39) + let __end = __sym1.2; + let __nt = super::__action1182::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant23(__nt), __end)); + (2, 39) } pub(crate) fn __reduce91< >( @@ -19506,11 +20626,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("else" ":" )? = => ActionFn(316); + // ("as" )? = => ActionFn(404); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action316::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant25(__nt), __end)); + let __nt = super::__action404::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant23(__nt), __end)); (0, 39) } pub(crate) fn __reduce92< @@ -19521,14 +20641,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("finally" ":" ) = "finally", ":", Suite => ActionFn(310); + // ("else" ":" ) = "else", ":", Suite => ActionFn(319); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant24(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action310::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action319::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); (3, 40) } @@ -19540,14 +20660,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("finally" ":" )? = "finally", ":", Suite => ActionFn(1109); + // ("else" ":" )? = "else", ":", Suite => ActionFn(1187); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant24(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1109::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1187::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant25(__nt), __end)); (3, 41) } @@ -19559,10 +20679,10 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("finally" ":" )? = => ActionFn(309); + // ("else" ":" )? = => ActionFn(318); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action309::<>(mode, &__start, &__end); + let __nt = super::__action318::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant25(__nt), __end)); (0, 41) } @@ -19574,15 +20694,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("from" >) = "from", Test<"all"> => ActionFn(370); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); + // ("finally" ":" ) = "finally", ":", Suite => ActionFn(312); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action370::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 42) + let __end = __sym2.2; + let __nt = super::__action312::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant24(__nt), __end)); + (3, 42) } pub(crate) fn __reduce96< >( @@ -19592,15 +20713,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("from" >)? = "from", Test<"all"> => ActionFn(1119); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); + // ("finally" ":" )? = "finally", ":", Suite => ActionFn(1198); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1119::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (2, 43) + let __end = __sym2.2; + let __nt = super::__action1198::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant25(__nt), __end)); + (3, 43) } pub(crate) fn __reduce97< >( @@ -19610,11 +20732,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ("from" >)? = => ActionFn(369); + // ("finally" ":" )? = => ActionFn(311); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action369::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + let __nt = super::__action311::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant25(__nt), __end)); (0, 43) } pub(crate) fn __reduce98< @@ -19625,17 +20747,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "elif" ":" ) = "elif", NamedExpressionTest, ":", Suite => ActionFn(697); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant24(__symbols); - let __sym2 = __pop_Variant0(__symbols); + // ("from" >) = "from", Test<"all"> => ActionFn(377); + assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action697::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant26(__nt), __end)); - (4, 44) + let __end = __sym1.2; + let __nt = super::__action377::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 44) } pub(crate) fn __reduce99< >( @@ -19645,12 +20765,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "elif" ":" )* = => ActionFn(321); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action321::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant27(__nt), __end)); - (0, 45) + // ("from" >)? = "from", Test<"all"> => ActionFn(1208); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1208::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (2, 45) } pub(crate) fn __reduce100< >( @@ -19660,13 +20783,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "elif" ":" )* = (<@L> "elif" ":" )+ => ActionFn(322); - let __sym0 = __pop_Variant27(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action322::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant27(__nt), __end)); - (1, 45) + // ("from" >)? = => ActionFn(376); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action376::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (0, 45) } pub(crate) fn __reduce101< >( @@ -19676,7 +20798,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "elif" ":" )+ = "elif", NamedExpressionTest, ":", Suite => ActionFn(1122); + // (<@L> "elif" ":" ) = "elif", NamedExpressionTest, ":", Suite => ActionFn(747); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant24(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -19684,8 +20806,8 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1122::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant27(__nt), __end)); + let __nt = super::__action747::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant26(__nt), __end)); (4, 46) } pub(crate) fn __reduce102< @@ -19696,18 +20818,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "elif" ":" )+ = (<@L> "elif" ":" )+, "elif", NamedExpressionTest, ":", Suite => ActionFn(1123); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant24(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant27(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1123::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + // (<@L> "elif" ":" )* = => ActionFn(323); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action323::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant27(__nt), __end)); - (5, 46) + (0, 47) } pub(crate) fn __reduce103< >( @@ -19717,16 +20833,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "else" ":" ) = "else", ":", Suite => ActionFn(698); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // (<@L> "elif" ":" )* = (<@L> "elif" ":" )+ => ActionFn(324); + let __sym0 = __pop_Variant27(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action698::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant28(__nt), __end)); - (3, 47) + let __end = __sym0.2; + let __nt = super::__action324::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant27(__nt), __end)); + (1, 47) } pub(crate) fn __reduce104< >( @@ -19736,16 +20849,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "else" ":" )? = "else", ":", Suite => ActionFn(1126); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // (<@L> "elif" ":" )+ = "elif", NamedExpressionTest, ":", Suite => ActionFn(1211); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant24(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1126::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant29(__nt), __end)); - (3, 48) + let __end = __sym3.2; + let __nt = super::__action1211::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant27(__nt), __end)); + (4, 48) } pub(crate) fn __reduce105< >( @@ -19755,12 +20869,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (<@L> "else" ":" )? = => ActionFn(319); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action319::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant29(__nt), __end)); - (0, 48) + // (<@L> "elif" ":" )+ = (<@L> "elif" ":" )+, "elif", NamedExpressionTest, ":", Suite => ActionFn(1212); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant24(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant27(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action1212::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant27(__nt), __end)); + (5, 48) } pub(crate) fn __reduce106< >( @@ -19770,15 +20890,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (> "or") = AndTest<"all">, "or" => ActionFn(432); - assert!(__symbols.len() >= 2); + // (<@L> "else" ":" ) = "else", ":", Suite => ActionFn(748); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant24(__symbols); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action432::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 49) + let __end = __sym2.2; + let __nt = super::__action748::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant28(__nt), __end)); + (3, 49) } pub(crate) fn __reduce107< >( @@ -19788,15 +20909,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (> "or")+ = AndTest<"all">, "or" => ActionFn(1131); - assert!(__symbols.len() >= 2); + // (<@L> "else" ":" )? = "else", ":", Suite => ActionFn(1215); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant24(__symbols); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1131::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (2, 50) + let __end = __sym2.2; + let __nt = super::__action1215::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant29(__nt), __end)); + (3, 50) } pub(crate) fn __reduce108< >( @@ -19806,16 +20928,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (> "or")+ = (> "or")+, AndTest<"all">, "or" => ActionFn(1132); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1132::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (3, 50) + // (<@L> "else" ":" )? = => ActionFn(321); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action321::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant29(__nt), __end)); + (0, 50) } pub(crate) fn __reduce109< >( @@ -19825,14 +20943,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",") = FunctionArgument, "," => ActionFn(441); + // (> "or") = AndTest<"all">, "or" => ActionFn(441); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant30(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym1.2; let __nt = super::__action441::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant30(__nt), __end)); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 51) } pub(crate) fn __reduce110< @@ -19843,12 +20961,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(439); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action439::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant31(__nt), __end)); - (0, 52) + // (> "or")+ = AndTest<"all">, "or" => ActionFn(1220); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1220::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (2, 52) } pub(crate) fn __reduce111< >( @@ -19858,13 +20979,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(440); - let __sym0 = __pop_Variant31(__symbols); + // (> "or")+ = (> "or")+, AndTest<"all">, "or" => ActionFn(1221); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action440::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant31(__nt), __end)); - (1, 52) + let __end = __sym2.2; + let __nt = super::__action1221::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (3, 52) } pub(crate) fn __reduce112< >( @@ -19874,14 +20998,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")+ = FunctionArgument, "," => ActionFn(1133); + // ( ",") = FunctionArgument, "," => ActionFn(450); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant30(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1133::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant31(__nt), __end)); + let __nt = super::__action450::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant30(__nt), __end)); (2, 53) } pub(crate) fn __reduce113< @@ -19892,16 +21016,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, FunctionArgument, "," => ActionFn(1134); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant30(__symbols); - let __sym0 = __pop_Variant31(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1134::<>(mode, __sym0, __sym1, __sym2); + // ( ",")* = => ActionFn(448); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action448::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant31(__nt), __end)); - (3, 53) + (0, 54) } pub(crate) fn __reduce114< >( @@ -19911,15 +21031,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (> "and") = NotTest<"all">, "and" => ActionFn(446); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // ( ",")* = ( ",")+ => ActionFn(449); + let __sym0 = __pop_Variant31(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action446::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 54) + let __end = __sym0.2; + let __nt = super::__action449::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant31(__nt), __end)); + (1, 54) } pub(crate) fn __reduce115< >( @@ -19929,14 +21047,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (> "and")+ = NotTest<"all">, "and" => ActionFn(1137); + // ( ",")+ = FunctionArgument, "," => ActionFn(1222); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant30(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1137::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + let __nt = super::__action1222::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant31(__nt), __end)); (2, 55) } pub(crate) fn __reduce116< @@ -19947,15 +21065,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (> "and")+ = (> "and")+, NotTest<"all">, "and" => ActionFn(1138); + // ( ",")+ = ( ",")+, FunctionArgument, "," => ActionFn(1223); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); + let __sym1 = __pop_Variant30(__symbols); + let __sym0 = __pop_Variant31(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1138::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + let __nt = super::__action1223::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant31(__nt), __end)); (3, 55) } pub(crate) fn __reduce117< @@ -19966,14 +21084,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (>> ",") = OneOrMore>, "," => ActionFn(546); + // (> "and") = NotTest<"all">, "and" => ActionFn(455); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action546::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + let __nt = super::__action455::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 56) } pub(crate) fn __reduce118< @@ -19984,14 +21102,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (>> ",")? = OneOrMore>, "," => ActionFn(1139); + // (> "and")+ = NotTest<"all">, "and" => ActionFn(1226); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1139::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant33(__nt), __end)); + let __nt = super::__action1226::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (2, 57) } pub(crate) fn __reduce119< @@ -20002,12 +21120,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (>> ",")? = => ActionFn(545); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action545::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant33(__nt), __end)); - (0, 57) + // (> "and")+ = (> "and")+, NotTest<"all">, "and" => ActionFn(1227); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1227::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (3, 57) } pub(crate) fn __reduce120< >( @@ -20017,14 +21139,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",") = Pattern, "," => ActionFn(336); + // (>> ",") = OneOrMore>, "," => ActionFn(590); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant34(__symbols); + let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action336::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + let __nt = super::__action590::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); (2, 58) } pub(crate) fn __reduce121< @@ -20035,12 +21157,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(401); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action401::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant35(__nt), __end)); - (0, 59) + // (>> ",")? = OneOrMore>, "," => ActionFn(1228); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1228::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant33(__nt), __end)); + (2, 59) } pub(crate) fn __reduce122< >( @@ -20050,13 +21175,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(402); - let __sym0 = __pop_Variant35(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action402::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant35(__nt), __end)); - (1, 59) + // (>> ",")? = => ActionFn(589); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action589::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant33(__nt), __end)); + (0, 59) } pub(crate) fn __reduce123< >( @@ -20066,14 +21190,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")+ = Pattern, "," => ActionFn(1156); + // ( ",") = Pattern, "," => ActionFn(338); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1156::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant35(__nt), __end)); + let __nt = super::__action338::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); (2, 60) } pub(crate) fn __reduce124< @@ -20084,16 +21208,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Pattern, "," => ActionFn(1157); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant34(__symbols); - let __sym0 = __pop_Variant35(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1157::<>(mode, __sym0, __sym1, __sym2); + // ( ",")* = => ActionFn(410); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action410::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant35(__nt), __end)); - (3, 60) + (0, 61) } pub(crate) fn __reduce125< >( @@ -20103,15 +21223,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ";") = SmallStatement, ";" => ActionFn(384); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant36(__symbols); + // ( ",")* = ( ",")+ => ActionFn(411); + let __sym0 = __pop_Variant35(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action384::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 61) + let __end = __sym0.2; + let __nt = super::__action411::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant35(__nt), __end)); + (1, 61) } pub(crate) fn __reduce126< >( @@ -20121,12 +21239,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ";")* = => ActionFn(382); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action382::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant37(__nt), __end)); - (0, 62) + // ( ",")+ = Pattern, "," => ActionFn(1253); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1253::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant35(__nt), __end)); + (2, 62) } pub(crate) fn __reduce127< >( @@ -20136,13 +21257,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ";")* = ( ";")+ => ActionFn(383); - let __sym0 = __pop_Variant37(__symbols); + // ( ",")+ = ( ",")+, Pattern, "," => ActionFn(1254); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant34(__symbols); + let __sym0 = __pop_Variant35(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action383::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant37(__nt), __end)); - (1, 62) + let __end = __sym2.2; + let __nt = super::__action1254::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant35(__nt), __end)); + (3, 62) } pub(crate) fn __reduce128< >( @@ -20152,14 +21276,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ";")+ = SmallStatement, ";" => ActionFn(1160); + // ( ";") = SmallStatement, ";" => ActionFn(391); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1160::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant37(__nt), __end)); + let __nt = super::__action391::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); (2, 63) } pub(crate) fn __reduce129< @@ -20170,16 +21294,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ";")+ = ( ";")+, SmallStatement, ";" => ActionFn(1161); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant36(__symbols); - let __sym0 = __pop_Variant37(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1161::<>(mode, __sym0, __sym1, __sym2); + // ( ";")* = => ActionFn(389); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action389::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant37(__nt), __end)); - (3, 63) + (0, 64) } pub(crate) fn __reduce130< >( @@ -20189,16 +21309,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (> "as" ) = Test<"all">, "as", Identifier => ActionFn(305); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // ( ";")* = ( ";")+ => ActionFn(390); + let __sym0 = __pop_Variant37(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action305::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant38(__nt), __end)); - (3, 64) + let __end = __sym0.2; + let __nt = super::__action390::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant37(__nt), __end)); + (1, 64) } pub(crate) fn __reduce131< >( @@ -20208,14 +21325,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",") = OneOrMore>, "," => ActionFn(1478); + // ( ";")+ = SmallStatement, ";" => ActionFn(1257); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1478::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant39(__nt), __end)); + let __nt = super::__action1257::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant37(__nt), __end)); (2, 65) } pub(crate) fn __reduce132< @@ -20226,15 +21343,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")? = OneOrMore>, "," => ActionFn(1481); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); + // ( ";")+ = ( ";")+, SmallStatement, ";" => ActionFn(1258); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant36(__symbols); + let __sym0 = __pop_Variant37(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1481::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant40(__nt), __end)); - (2, 66) + let __end = __sym2.2; + let __nt = super::__action1258::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant37(__nt), __end)); + (3, 65) } pub(crate) fn __reduce133< >( @@ -20244,12 +21362,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ( ",")? = => ActionFn(301); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action301::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant40(__nt), __end)); - (0, 66) + // (> "as" ) = Test<"all">, "as", Identifier => ActionFn(307); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action307::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant38(__nt), __end)); + (3, 66) } pub(crate) fn __reduce134< >( @@ -20259,13 +21381,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (@L string @R) = string => ActionFn(1180); - let __sym0 = __pop_Variant6(__symbols); + // ( ",") = OneOrMore>, "," => ActionFn(1613); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1180::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant41(__nt), __end)); - (1, 67) + let __end = __sym1.2; + let __nt = super::__action1613::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant39(__nt), __end)); + (2, 67) } pub(crate) fn __reduce135< >( @@ -20275,13 +21399,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (@L string @R)+ = string => ActionFn(1490); - let __sym0 = __pop_Variant6(__symbols); + // ( ",")? = OneOrMore>, "," => ActionFn(1616); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1490::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant42(__nt), __end)); - (1, 68) + let __end = __sym1.2; + let __nt = super::__action1616::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant40(__nt), __end)); + (2, 68) } pub(crate) fn __reduce136< >( @@ -20291,15 +21417,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (@L string @R)+ = (@L string @R)+, string => ActionFn(1491); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant6(__symbols); - let __sym0 = __pop_Variant42(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1491::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant42(__nt), __end)); - (2, 68) + // ( ",")? = => ActionFn(303); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action303::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant40(__nt), __end)); + (0, 68) } pub(crate) fn __reduce137< >( @@ -20309,15 +21432,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (CompOp Expression<"all">) = CompOp, Expression<"all"> => ActionFn(489); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant55(__symbols); + // (@L string @R) = string => ActionFn(1277); + let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action489::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant43(__nt), __end)); - (2, 69) + let __end = __sym0.2; + let __nt = super::__action1277::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant41(__nt), __end)); + (1, 69) } pub(crate) fn __reduce138< >( @@ -20327,15 +21448,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (CompOp Expression<"all">)+ = CompOp, Expression<"all"> => ActionFn(1492); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant55(__symbols); + // (@L string @R)+ = string => ActionFn(1625); + let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1492::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant44(__nt), __end)); - (2, 70) + let __end = __sym0.2; + let __nt = super::__action1625::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant42(__nt), __end)); + (1, 70) } pub(crate) fn __reduce139< >( @@ -20345,16 +21464,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (CompOp Expression<"all">)+ = (CompOp Expression<"all">)+, CompOp, Expression<"all"> => ActionFn(1493); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant55(__symbols); - let __sym0 = __pop_Variant44(__symbols); + // (@L string @R)+ = (@L string @R)+, string => ActionFn(1626); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant6(__symbols); + let __sym0 = __pop_Variant42(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1493::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant44(__nt), __end)); - (3, 70) + let __end = __sym1.2; + let __nt = super::__action1626::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant42(__nt), __end)); + (2, 70) } pub(crate) fn __reduce140< >( @@ -20364,13 +21482,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (Guard) = Guard => ActionFn(343); - let __sym0 = __pop_Variant14(__symbols); + // (CompOp Expression<"all">) = CompOp, Expression<"all"> => ActionFn(502); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant55(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action343::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 71) + let __end = __sym1.2; + let __nt = super::__action502::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant43(__nt), __end)); + (2, 71) } pub(crate) fn __reduce141< >( @@ -20380,13 +21500,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (Guard)? = Guard => ActionFn(1494); - let __sym0 = __pop_Variant14(__symbols); + // (CompOp Expression<"all">)+ = CompOp, Expression<"all"> => ActionFn(1627); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant55(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1494::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (1, 72) + let __end = __sym1.2; + let __nt = super::__action1627::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant44(__nt), __end)); + (2, 72) } pub(crate) fn __reduce142< >( @@ -20396,12 +21518,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (Guard)? = => ActionFn(342); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action342::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (0, 72) + // (CompOp Expression<"all">)+ = (CompOp Expression<"all">)+, CompOp, Expression<"all"> => ActionFn(1628); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant55(__symbols); + let __sym0 = __pop_Variant44(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1628::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant44(__nt), __end)); + (3, 72) } pub(crate) fn __reduce143< >( @@ -20411,12 +21537,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (ParameterList) = ParameterList => ActionFn(276); - let __sym0 = __pop_Variant45(__symbols); + // (Guard) = Guard => ActionFn(345); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action276::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + let __nt = super::__action345::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 73) } pub(crate) fn __reduce144< @@ -20427,12 +21553,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (ParameterList)? = ParameterList => ActionFn(1497); - let __sym0 = __pop_Variant45(__symbols); + // (Guard)? = Guard => ActionFn(1629); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1497::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant46(__nt), __end)); + let __nt = super::__action1629::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 74) } pub(crate) fn __reduce145< @@ -20443,11 +21569,11 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // (ParameterList)? = => ActionFn(275); + // (Guard)? = => ActionFn(344); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action275::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant46(__nt), __end)); + let __nt = super::__action344::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (0, 74) } pub(crate) fn __reduce146< @@ -20458,12 +21584,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // @L = => ActionFn(389); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action389::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant47(__nt), __end)); - (0, 75) + // (ParameterList) = ParameterList => ActionFn(278); + let __sym0 = __pop_Variant45(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action278::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant45(__nt), __end)); + (1, 75) } pub(crate) fn __reduce147< >( @@ -20473,12 +21600,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // @R = => ActionFn(388); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action388::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant47(__nt), __end)); - (0, 76) + // (ParameterList)? = ParameterList => ActionFn(1632); + let __sym0 = __pop_Variant45(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1632::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant46(__nt), __end)); + (1, 76) } pub(crate) fn __reduce148< >( @@ -20488,13 +21616,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AddOp = "+" => ActionFn(194); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action194::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 77) + // (ParameterList)? = => ActionFn(277); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action277::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant46(__nt), __end)); + (0, 76) } pub(crate) fn __reduce149< >( @@ -20504,13 +21631,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AddOp = "-" => ActionFn(195); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action195::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 77) + // @L = => ActionFn(396); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action396::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant47(__nt), __end)); + (0, 77) } pub(crate) fn __reduce150< >( @@ -20520,16 +21646,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AddOpExpr = ConstantExpr, AddOp, ConstantAtom => ActionFn(1181); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant48(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1181::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 78) + // @R = => ActionFn(395); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action395::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant47(__nt), __end)); + (0, 78) } pub(crate) fn __reduce151< >( @@ -20539,16 +21661,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndExpression<"all"> = AndExpression<"all">, "&", ShiftExpression<"all"> => ActionFn(1182); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // AddOp = "+" => ActionFn(196); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1182::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 79) + let __end = __sym0.2; + let __nt = super::__action196::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 79) } pub(crate) fn __reduce152< >( @@ -20558,12 +21677,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndExpression<"all"> = ShiftExpression<"all"> => ActionFn(450); - let __sym0 = __pop_Variant14(__symbols); + // AddOp = "-" => ActionFn(197); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action450::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + let __nt = super::__action197::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); (1, 79) } pub(crate) fn __reduce153< @@ -20574,14 +21693,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndExpression<"no-withitems"> = AndExpression<"all">, "&", ShiftExpression<"all"> => ActionFn(1183); + // AddOpExpr = ConstantExpr, AddOp, ConstantAtom => ActionFn(1278); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant48(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1183::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1278::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (3, 80) } @@ -20593,13 +21712,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndExpression<"no-withitems"> = ShiftExpression<"no-withitems"> => ActionFn(509); + // AndExpression<"All"> = AndExpression<"all">, "&", ShiftExpression<"all"> => ActionFn(1279); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action509::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action1279::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 80) + (3, 81) } pub(crate) fn __reduce155< >( @@ -20609,15 +21731,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndTest<"all"> = (> "and")+, NotTest<"all"> => ActionFn(1184); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); + // AndExpression<"All"> = ShiftExpression<"All"> => ActionFn(485); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1184::<>(mode, __sym0, __sym1); + let __end = __sym0.2; + let __nt = super::__action485::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 81) + (1, 81) } pub(crate) fn __reduce156< >( @@ -20627,13 +21747,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndTest<"all"> = NotTest<"all"> => ActionFn(434); + // AndExpression<"all"> = AndExpression<"all">, "&", ShiftExpression<"all"> => ActionFn(1280); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action434::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action1280::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 81) + (3, 82) } pub(crate) fn __reduce157< >( @@ -20643,15 +21766,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndTest<"no-withitems"> = (> "and")+, NotTest<"all"> => ActionFn(1185); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); + // AndExpression<"all"> = ShiftExpression<"all"> => ActionFn(487); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1185::<>(mode, __sym0, __sym1); + let __end = __sym0.2; + let __nt = super::__action487::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 82) + (1, 82) } pub(crate) fn __reduce158< >( @@ -20661,13 +21782,84 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AndTest<"no-withitems"> = NotTest<"no-withitems"> => ActionFn(478); + // AndExpression<"no-withitems"> = AndExpression<"all">, "&", ShiftExpression<"all"> => ActionFn(1281); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1281::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 83) + } + pub(crate) fn __reduce159< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // AndExpression<"no-withitems"> = ShiftExpression<"no-withitems"> => ActionFn(528); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action478::<>(mode, __sym0); + let __nt = super::__action528::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 82) + (1, 83) + } + pub(crate) fn __reduce160< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // AndTest<"all"> = (> "and")+, NotTest<"all"> => ActionFn(1282); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1282::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 84) + } + pub(crate) fn __reduce161< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // AndTest<"all"> = NotTest<"all"> => ActionFn(443); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action443::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 84) + } + pub(crate) fn __reduce162< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // AndTest<"no-withitems"> = (> "and")+, NotTest<"all"> => ActionFn(1283); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1283::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 85) } pub(crate) fn __reduce163< >( @@ -20677,83 +21869,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Arguments? = Arguments => ActionFn(266); - let __sym0 = __pop_Variant49(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action266::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant50(__nt), __end)); - (1, 84) - } - pub(crate) fn __reduce164< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Arguments? = => ActionFn(267); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action267::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant50(__nt), __end)); - (0, 84) - } - pub(crate) fn __reduce165< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ArithmeticExpression<"all"> = ArithmeticExpression<"all">, AddOp, Term<"all"> => ActionFn(1187); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant48(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1187::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 85) - } - pub(crate) fn __reduce166< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ArithmeticExpression<"all"> = Term<"all"> => ActionFn(491); + // AndTest<"no-withitems"> = NotTest<"no-withitems"> => ActionFn(493); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action491::<>(mode, __sym0); + let __nt = super::__action493::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 85) } - pub(crate) fn __reduce167< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ArithmeticExpression<"no-withitems"> = ArithmeticExpression<"all">, AddOp, Term<"all"> => ActionFn(1188); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant48(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1188::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 86) - } pub(crate) fn __reduce168< >( mode: Mode, @@ -20762,13 +21885,28 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ArithmeticExpression<"no-withitems"> = Term<"no-withitems"> => ActionFn(536); - let __sym0 = __pop_Variant14(__symbols); + // Arguments? = Arguments => ActionFn(268); + let __sym0 = __pop_Variant49(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action536::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 86) + let __nt = super::__action268::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant50(__nt), __end)); + (1, 87) + } + pub(crate) fn __reduce169< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Arguments? = => ActionFn(269); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action269::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant50(__nt), __end)); + (0, 87) } pub(crate) fn __reduce170< >( @@ -20778,17 +21916,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssertStatement = "assert", Test<"all">, ",", Test<"all"> => ActionFn(1190); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant14(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ArithmeticExpression<"All"> = ArithmeticExpression<"all">, AddOp, Term<"all"> => ActionFn(1285); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant48(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1190::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 88) + let __end = __sym2.2; + let __nt = super::__action1285::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 88) } pub(crate) fn __reduce171< >( @@ -20798,15 +21935,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssertStatement = "assert", Test<"all"> => ActionFn(1191); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ArithmeticExpression<"All"> = Term<"All"> => ActionFn(506); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1191::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 88) + let __end = __sym0.2; + let __nt = super::__action506::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 88) } pub(crate) fn __reduce172< >( @@ -20816,15 +21951,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix = "=", TestListOrYieldExpr => ActionFn(28); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ArithmeticExpression<"all"> = ArithmeticExpression<"all">, AddOp, Term<"all"> => ActionFn(1286); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant48(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action28::<>(mode, __sym0, __sym1); + let __end = __sym2.2; + let __nt = super::__action1286::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 89) + (3, 89) } pub(crate) fn __reduce173< >( @@ -20834,15 +21970,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix = "=", LineMagicExpr => ActionFn(29); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ArithmeticExpression<"all"> = Term<"all"> => ActionFn(508); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action29::<>(mode, __sym0, __sym1); + let __end = __sym0.2; + let __nt = super::__action508::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 89) + (1, 89) } pub(crate) fn __reduce174< >( @@ -20852,12 +21986,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix* = => ActionFn(378); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action378::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (0, 90) + // ArithmeticExpression<"no-withitems"> = ArithmeticExpression<"all">, AddOp, Term<"all"> => ActionFn(1287); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant48(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1287::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 90) } pub(crate) fn __reduce175< >( @@ -20867,29 +22005,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix* = AssignSuffix+ => ActionFn(379); - let __sym0 = __pop_Variant16(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action379::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (1, 90) - } - pub(crate) fn __reduce176< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AssignSuffix+ = AssignSuffix => ActionFn(394); + // ArithmeticExpression<"no-withitems"> = Term<"no-withitems"> => ActionFn(544); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action394::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (1, 91) + let __nt = super::__action544::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 90) } pub(crate) fn __reduce177< >( @@ -20899,15 +22021,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix+ = AssignSuffix+, AssignSuffix => ActionFn(395); - assert!(__symbols.len() >= 2); + // AssertStatement = "assert", Test<"all">, ",", Test<"all"> => ActionFn(1289); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action395::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (2, 91) + let __end = __sym3.2; + let __nt = super::__action1289::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (4, 92) } pub(crate) fn __reduce178< >( @@ -20917,13 +22041,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix? = AssignSuffix => ActionFn(373); - let __sym0 = __pop_Variant14(__symbols); + // AssertStatement = "assert", Test<"all"> => ActionFn(1290); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action373::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (1, 92) + let __end = __sym1.2; + let __nt = super::__action1290::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (2, 92) } pub(crate) fn __reduce179< >( @@ -20933,12 +22059,33 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix? = => ActionFn(374); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action374::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (0, 92) + // AssignSuffix = "=", TestListOrYieldExpr => ActionFn(29); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action29::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 93) + } + pub(crate) fn __reduce180< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // AssignSuffix = "=", LineMagicExpr => ActionFn(30); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action30::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 93) } pub(crate) fn __reduce181< >( @@ -20948,13 +22095,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = Constant => ActionFn(1192); - let __sym0 = __pop_Variant56(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1192::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 93) + // AssignSuffix* = => ActionFn(385); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action385::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (0, 94) } pub(crate) fn __reduce182< >( @@ -20964,13 +22110,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = Identifier => ActionFn(1193); - let __sym0 = __pop_Variant22(__symbols); + // AssignSuffix* = AssignSuffix+ => ActionFn(386); + let __sym0 = __pop_Variant16(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1193::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 93) + let __nt = super::__action386::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (1, 94) } pub(crate) fn __reduce183< >( @@ -20980,16 +22126,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "[", ListLiteralValues, "]" => ActionFn(1556); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant32(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // AssignSuffix+ = AssignSuffix => ActionFn(401); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1556::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 93) + let __end = __sym0.2; + let __nt = super::__action401::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (1, 95) } pub(crate) fn __reduce184< >( @@ -20999,15 +22142,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "[", "]" => ActionFn(1557); + // AssignSuffix+ = AssignSuffix+, AssignSuffix => ActionFn(402); assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1557::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 93) + let __nt = super::__action402::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (2, 95) } pub(crate) fn __reduce185< >( @@ -21017,17 +22160,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "[", TestOrStarNamedExpr, CompFor, "]" => ActionFn(1195); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant53(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // AssignSuffix? = AssignSuffix => ActionFn(380); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1195::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) + let __end = __sym0.2; + let __nt = super::__action380::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (1, 96) } pub(crate) fn __reduce186< >( @@ -21037,19 +22176,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "(", OneOrMore>, ",", ")" => ActionFn(1196); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant32(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1196::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) + // AssignSuffix? = => ActionFn(381); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action381::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (0, 96) } - pub(crate) fn __reduce187< + pub(crate) fn __reduce188< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -21057,18 +22191,50 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "(", OneOrMore>, ")" => ActionFn(1197); + // Atom<"All"> = Constant => ActionFn(1291); + let __sym0 = __pop_Variant56(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1291::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 97) + } + pub(crate) fn __reduce189< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"All"> = Identifier => ActionFn(1292); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1292::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 97) + } + pub(crate) fn __reduce190< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"All"> = "[", ListLiteralValues, "]" => ActionFn(1693); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant32(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1197::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1693::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 93) + (3, 97) } - pub(crate) fn __reduce196< + pub(crate) fn __reduce191< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -21076,17 +22242,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "(", ")" => ActionFn(1206); + // Atom<"All"> = "[", "]" => ActionFn(1694); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1206::<>(mode, __sym0, __sym1); + let __nt = super::__action1694::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 93) + (2, 97) } - pub(crate) fn __reduce197< + pub(crate) fn __reduce192< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -21094,26 +22260,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "(", YieldExpr, ")" => ActionFn(524); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action524::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 93) - } - pub(crate) fn __reduce198< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"all"> = "(", NamedExpressionTest, CompFor, ")" => ActionFn(1207); + // Atom<"All"> = "[", TestOrStarNamedExpr, CompFor, "]" => ActionFn(1294); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant53(__symbols); @@ -21121,11 +22268,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1207::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1294::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) + (4, 97) } - pub(crate) fn __reduce200< + pub(crate) fn __reduce193< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -21133,54 +22280,36 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "{", DictLiteralValues, "}" => ActionFn(1540); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant61(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1540::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 93) - } - pub(crate) fn __reduce201< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"all"> = "{", "}" => ActionFn(1541); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1541::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 93) - } - pub(crate) fn __reduce202< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"all"> = "{", DictEntry, CompFor, "}" => ActionFn(1210); + // Atom<"All"> = "(", OneOrMore>, ",", ")" => ActionFn(1295); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant53(__symbols); - let __sym1 = __pop_Variant60(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1210::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1295::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) + (4, 97) + } + pub(crate) fn __reduce194< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"All"> = "(", OneOrMore>, ")" => ActionFn(1296); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1296::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 97) } pub(crate) fn __reduce203< >( @@ -21190,16 +22319,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "{", SetLiteralValues, "}" => ActionFn(1211); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant32(__symbols); + // Atom<"All"> = "(", ")" => ActionFn(1305); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1211::<>(mode, __sym0, __sym1, __sym2); + let __end = __sym1.2; + let __nt = super::__action1305::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 93) + (2, 97) } pub(crate) fn __reduce204< >( @@ -21209,17 +22337,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "{", NamedExpressionTest, CompFor, "}" => ActionFn(1212); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant53(__symbols); + // Atom<"All"> = "(", YieldExpr, ")" => ActionFn(572); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1212::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __end = __sym2.2; + let __nt = super::__action572::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 93) + (3, 97) } pub(crate) fn __reduce205< >( @@ -21229,29 +22356,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "True" => ActionFn(1213); + // Atom<"All"> = "(", NamedExpressionTest, CompFor, ")" => ActionFn(1306); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1213::<>(mode, __sym0); + let __end = __sym3.2; + let __nt = super::__action1306::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 93) - } - pub(crate) fn __reduce206< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"all"> = "False" => ActionFn(1214); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1214::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 93) + (4, 97) } pub(crate) fn __reduce207< >( @@ -21261,13 +22376,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "None" => ActionFn(1215); + // Atom<"All"> = "{", DictLiteralValues, "}" => ActionFn(1675); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant61(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1215::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action1675::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 93) + (3, 97) } pub(crate) fn __reduce208< >( @@ -21277,13 +22395,35 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"all"> = "..." => ActionFn(1216); + // Atom<"All"> = "{", "}" => ActionFn(1676); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1216::<>(mode, __sym0); + let __end = __sym1.2; + let __nt = super::__action1676::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 93) + (2, 97) + } + pub(crate) fn __reduce209< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"All"> = "{", DictEntry, CompFor, "}" => ActionFn(1309); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant60(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1309::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 97) } pub(crate) fn __reduce210< >( @@ -21293,13 +22433,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = Constant => ActionFn(1217); - let __sym0 = __pop_Variant56(__symbols); + // Atom<"All"> = "{", SetLiteralValues, "}" => ActionFn(1310); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1217::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action1310::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 94) + (3, 97) } pub(crate) fn __reduce211< >( @@ -21309,13 +22452,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = Identifier => ActionFn(1218); - let __sym0 = __pop_Variant22(__symbols); + // Atom<"All"> = "{", NamedExpressionTest, CompFor, "}" => ActionFn(1311); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1218::<>(mode, __sym0); + let __end = __sym3.2; + let __nt = super::__action1311::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 94) + (4, 97) } pub(crate) fn __reduce212< >( @@ -21325,16 +22472,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = "[", ListLiteralValues, "]" => ActionFn(1558); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant32(__symbols); + // Atom<"All"> = "True" => ActionFn(1312); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1558::<>(mode, __sym0, __sym1, __sym2); + let __end = __sym0.2; + let __nt = super::__action1312::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 94) + (1, 97) } pub(crate) fn __reduce213< >( @@ -21344,15 +22488,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = "[", "]" => ActionFn(1559); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); + // Atom<"All"> = "False" => ActionFn(1313); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1559::<>(mode, __sym0, __sym1); + let __end = __sym0.2; + let __nt = super::__action1313::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 94) + (1, 97) } pub(crate) fn __reduce214< >( @@ -21362,7 +22504,108 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = "[", TestOrStarNamedExpr, CompFor, "]" => ActionFn(1220); + // Atom<"All"> = "None" => ActionFn(1314); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1314::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 97) + } + pub(crate) fn __reduce215< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"All"> = "..." => ActionFn(1315); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1315::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 97) + } + pub(crate) fn __reduce217< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"all"> = Constant => ActionFn(1316); + let __sym0 = __pop_Variant56(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1316::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 98) + } + pub(crate) fn __reduce218< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"all"> = Identifier => ActionFn(1317); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1317::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 98) + } + pub(crate) fn __reduce219< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"all"> = "[", ListLiteralValues, "]" => ActionFn(1695); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1695::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 98) + } + pub(crate) fn __reduce220< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"all"> = "[", "]" => ActionFn(1696); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1696::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 98) + } + pub(crate) fn __reduce221< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"all"> = "[", TestOrStarNamedExpr, CompFor, "]" => ActionFn(1319); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant53(__symbols); @@ -21370,9 +22613,29 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1220::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1319::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 94) + (4, 98) + } + pub(crate) fn __reduce222< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Atom<"all"> = "(", OneOrMore>, ",", ")" => ActionFn(1320); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1320::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 98) } pub(crate) fn __reduce223< >( @@ -21382,150 +22645,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = "(", ")" => ActionFn(1229); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1229::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 94) - } - pub(crate) fn __reduce224< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "(", YieldExpr, ")" => ActionFn(568); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action568::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 94) - } - pub(crate) fn __reduce225< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "(", NamedExpressionTest, CompFor, ")" => ActionFn(1230); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant53(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1230::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 94) - } - pub(crate) fn __reduce227< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "{", DictLiteralValues, "}" => ActionFn(1542); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant61(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1542::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 94) - } - pub(crate) fn __reduce228< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "{", "}" => ActionFn(1543); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1543::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 94) - } - pub(crate) fn __reduce229< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "{", DictEntry, CompFor, "}" => ActionFn(1233); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant53(__symbols); - let __sym1 = __pop_Variant60(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1233::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 94) - } - pub(crate) fn __reduce230< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "{", SetLiteralValues, "}" => ActionFn(1234); + // Atom<"all"> = "(", OneOrMore>, ")" => ActionFn(1321); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant32(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1234::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1321::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 94) - } - pub(crate) fn __reduce231< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "{", NamedExpressionTest, CompFor, "}" => ActionFn(1235); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant53(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1235::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 94) + (3, 98) } pub(crate) fn __reduce232< >( @@ -21535,13 +22664,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = "True" => ActionFn(1236); + // Atom<"all"> = "(", ")" => ActionFn(1330); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1236::<>(mode, __sym0); + let __end = __sym1.2; + let __nt = super::__action1330::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 94) + (2, 98) } pub(crate) fn __reduce233< >( @@ -21551,13 +22682,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = "False" => ActionFn(1237); + // Atom<"all"> = "(", YieldExpr, ")" => ActionFn(553); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1237::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action553::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 94) + (3, 98) } pub(crate) fn __reduce234< >( @@ -21567,29 +22701,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Atom<"no-withitems"> = "None" => ActionFn(1238); + // Atom<"all"> = "(", NamedExpressionTest, CompFor, ")" => ActionFn(1331); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1238::<>(mode, __sym0); + let __end = __sym3.2; + let __nt = super::__action1331::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 94) - } - pub(crate) fn __reduce235< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Atom<"no-withitems"> = "..." => ActionFn(1239); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1239::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 94) + (4, 98) } pub(crate) fn __reduce236< >( @@ -21599,13 +22721,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"all"> = Atom<"all"> => ActionFn(512); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"all"> = "{", DictLiteralValues, "}" => ActionFn(1677); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant61(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action512::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action1677::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 95) + (3, 98) } pub(crate) fn __reduce237< >( @@ -21615,15 +22740,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"all"> = AtomExpr2<"all">, Arguments => ActionFn(1240); + // Atom<"all"> = "{", "}" => ActionFn(1678); assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant49(__symbols); - let __sym0 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1240::<>(mode, __sym0, __sym1); + let __nt = super::__action1678::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 95) + (2, 98) } pub(crate) fn __reduce238< >( @@ -21633,17 +22758,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"all"> = AtomExpr2<"all">, "[", SubscriptList, "]" => ActionFn(1241); + // Atom<"all"> = "{", DictEntry, CompFor, "}" => ActionFn(1334); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant60(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1241::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1334::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 95) + (4, 98) } pub(crate) fn __reduce239< >( @@ -21653,16 +22778,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"all"> = AtomExpr2<"all">, ".", Identifier => ActionFn(1242); + // Atom<"all"> = "{", SetLiteralValues, "}" => ActionFn(1335); assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1242::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1335::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 95) + (3, 98) } pub(crate) fn __reduce240< >( @@ -21672,13 +22797,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"no-withitems"> = Atom<"no-withitems"> => ActionFn(557); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"all"> = "{", NamedExpressionTest, CompFor, "}" => ActionFn(1336); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action557::<>(mode, __sym0); + let __end = __sym3.2; + let __nt = super::__action1336::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 96) + (4, 98) } pub(crate) fn __reduce241< >( @@ -21688,15 +22817,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"no-withitems"> = AtomExpr2<"all">, Arguments => ActionFn(1243); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant49(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"all"> = "True" => ActionFn(1337); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1243::<>(mode, __sym0, __sym1); + let __end = __sym0.2; + let __nt = super::__action1337::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 96) + (1, 98) } pub(crate) fn __reduce242< >( @@ -21706,17 +22833,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"no-withitems"> = AtomExpr2<"all">, "[", SubscriptList, "]" => ActionFn(1244); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"all"> = "False" => ActionFn(1338); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1244::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __end = __sym0.2; + let __nt = super::__action1338::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 96) + (1, 98) } pub(crate) fn __reduce243< >( @@ -21726,16 +22849,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr2<"no-withitems"> = AtomExpr2<"all">, ".", Identifier => ActionFn(1245); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"all"> = "None" => ActionFn(1339); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1245::<>(mode, __sym0, __sym1, __sym2); + let __end = __sym0.2; + let __nt = super::__action1339::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 96) + (1, 98) } pub(crate) fn __reduce244< >( @@ -21745,31 +22865,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr<"all"> = "await", AtomExpr2<"all"> => ActionFn(1246); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); + // Atom<"all"> = "..." => ActionFn(1340); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1246::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 97) - } - pub(crate) fn __reduce245< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AtomExpr<"all"> = AtomExpr2<"all"> => ActionFn(507); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action507::<>(mode, __sym0); + let __nt = super::__action1340::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 97) + (1, 98) } pub(crate) fn __reduce246< >( @@ -21779,15 +22881,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr<"no-withitems"> = "await", AtomExpr2<"all"> => ActionFn(1247); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // Atom<"no-withitems"> = Constant => ActionFn(1341); + let __sym0 = __pop_Variant56(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1247::<>(mode, __sym0, __sym1); + let __end = __sym0.2; + let __nt = super::__action1341::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 98) + (1, 99) } pub(crate) fn __reduce247< >( @@ -21797,13 +22897,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AtomExpr<"no-withitems"> = AtomExpr2<"no-withitems"> => ActionFn(556); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"no-withitems"> = Identifier => ActionFn(1342); + let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action556::<>(mode, __sym0); + let __nt = super::__action1342::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 98) + (1, 99) } pub(crate) fn __reduce248< >( @@ -21813,13 +22913,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AugAssign = "+=" => ActionFn(39); + // Atom<"no-withitems"> = "[", ListLiteralValues, "]" => ActionFn(1697); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action39::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) + let __end = __sym2.2; + let __nt = super::__action1697::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 99) } pub(crate) fn __reduce249< >( @@ -21829,13 +22932,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AugAssign = "-=" => ActionFn(40); + // Atom<"no-withitems"> = "[", "]" => ActionFn(1698); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action40::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) + let __end = __sym1.2; + let __nt = super::__action1698::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 99) } pub(crate) fn __reduce250< >( @@ -21845,141 +22950,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AugAssign = "*=" => ActionFn(41); + // Atom<"no-withitems"> = "[", TestOrStarNamedExpr, CompFor, "]" => ActionFn(1344); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action41::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce251< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = "@=" => ActionFn(42); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action42::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce252< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = "/=" => ActionFn(43); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action43::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce253< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = "%=" => ActionFn(44); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action44::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce254< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = "&=" => ActionFn(45); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action45::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce255< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = "|=" => ActionFn(46); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action46::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce256< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = "^=" => ActionFn(47); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action47::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce257< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = "<<=" => ActionFn(48); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action48::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) - } - pub(crate) fn __reduce258< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // AugAssign = ">>=" => ActionFn(49); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action49::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) + let __end = __sym3.2; + let __nt = super::__action1344::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 99) } pub(crate) fn __reduce259< >( @@ -21989,13 +22970,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AugAssign = "**=" => ActionFn(50); + // Atom<"no-withitems"> = "(", ")" => ActionFn(1353); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action50::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) + let __end = __sym1.2; + let __nt = super::__action1353::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 99) } pub(crate) fn __reduce260< >( @@ -22005,13 +22988,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AugAssign = "//=" => ActionFn(51); + // Atom<"no-withitems"> = "(", YieldExpr, ")" => ActionFn(614); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action51::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 99) + let __end = __sym2.2; + let __nt = super::__action614::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 99) } pub(crate) fn __reduce261< >( @@ -22021,35 +23007,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CapturePattern = Identifier => ActionFn(1248); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1248::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 100) - } - pub(crate) fn __reduce262< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ClassDef = "class", Identifier, TypeParams, Arguments, ":", Suite => ActionFn(1712); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant24(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant49(__symbols); - let __sym2 = __pop_Variant91(__symbols); - let __sym1 = __pop_Variant22(__symbols); + // Atom<"no-withitems"> = "(", NamedExpressionTest, CompFor, ")" => ActionFn(1354); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1712::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 101) + let __end = __sym3.2; + let __nt = super::__action1354::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 99) } pub(crate) fn __reduce263< >( @@ -22059,18 +23027,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassDef = "class", Identifier, Arguments, ":", Suite => ActionFn(1713); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant24(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant49(__symbols); - let __sym1 = __pop_Variant22(__symbols); + // Atom<"no-withitems"> = "{", DictLiteralValues, "}" => ActionFn(1679); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant61(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1713::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 101) + let __end = __sym2.2; + let __nt = super::__action1679::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 99) } pub(crate) fn __reduce264< >( @@ -22080,20 +23046,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassDef = Decorator+, "class", Identifier, TypeParams, Arguments, ":", Suite => ActionFn(1714); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant24(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant49(__symbols); - let __sym3 = __pop_Variant91(__symbols); - let __sym2 = __pop_Variant22(__symbols); + // Atom<"no-withitems"> = "{", "}" => ActionFn(1680); + assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant58(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1714::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 101) + let __end = __sym1.2; + let __nt = super::__action1680::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 99) } pub(crate) fn __reduce265< >( @@ -22103,19 +23064,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassDef = Decorator+, "class", Identifier, Arguments, ":", Suite => ActionFn(1715); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant24(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant49(__symbols); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant58(__symbols); + // Atom<"no-withitems"> = "{", DictEntry, CompFor, "}" => ActionFn(1357); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant60(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1715::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 101) + let __end = __sym3.2; + let __nt = super::__action1357::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 99) } pub(crate) fn __reduce266< >( @@ -22125,18 +23084,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassDef = "class", Identifier, TypeParams, ":", Suite => ActionFn(1716); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant24(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant91(__symbols); - let __sym1 = __pop_Variant22(__symbols); + // Atom<"no-withitems"> = "{", SetLiteralValues, "}" => ActionFn(1358); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant32(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1716::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 101) + let __end = __sym2.2; + let __nt = super::__action1358::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 99) } pub(crate) fn __reduce267< >( @@ -22146,17 +23103,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassDef = "class", Identifier, ":", Suite => ActionFn(1717); + // Atom<"no-withitems"> = "{", NamedExpressionTest, CompFor, "}" => ActionFn(1359); assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant24(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant22(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant53(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1717::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 101) + let __nt = super::__action1359::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 99) } pub(crate) fn __reduce268< >( @@ -22166,19 +23123,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassDef = Decorator+, "class", Identifier, TypeParams, ":", Suite => ActionFn(1718); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant24(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant91(__symbols); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant58(__symbols); + // Atom<"no-withitems"> = "True" => ActionFn(1360); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1718::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 101) + let __end = __sym0.2; + let __nt = super::__action1360::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 99) } pub(crate) fn __reduce269< >( @@ -22188,18 +23139,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassDef = Decorator+, "class", Identifier, ":", Suite => ActionFn(1719); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant24(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant58(__symbols); + // Atom<"no-withitems"> = "False" => ActionFn(1361); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1719::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 101) + let __end = __sym0.2; + let __nt = super::__action1361::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 99) } pub(crate) fn __reduce270< >( @@ -22209,20 +23155,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchName, "(", OneOrMore, ",", OneOrMore, ",", ")" => ActionFn(1249); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant78(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"no-withitems"> = "None" => ActionFn(1362); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1249::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (7, 102) + let __end = __sym0.2; + let __nt = super::__action1362::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 99) } pub(crate) fn __reduce271< >( @@ -22232,19 +23171,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchName, "(", OneOrMore, ",", OneOrMore, ")" => ActionFn(1250); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant78(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // Atom<"no-withitems"> = "..." => ActionFn(1363); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1250::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (6, 102) + let __end = __sym0.2; + let __nt = super::__action1363::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 99) } pub(crate) fn __reduce272< >( @@ -22254,18 +23187,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchName, "(", OneOrMore, ",", ")" => ActionFn(1251); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // AtomExpr2<"All"> = Atom<"All"> => ActionFn(533); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1251::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (5, 102) + let __end = __sym0.2; + let __nt = super::__action533::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 100) } pub(crate) fn __reduce273< >( @@ -22275,17 +23203,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchName, "(", OneOrMore, ")" => ActionFn(1252); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // AtomExpr2<"All"> = AtomExpr2<"all">, Arguments => ActionFn(1364); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant49(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1252::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 102) + let __end = __sym1.2; + let __nt = super::__action1364::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 100) } pub(crate) fn __reduce274< >( @@ -22295,18 +23221,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchName, "(", OneOrMore, ",", ")" => ActionFn(1253); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); + // AtomExpr2<"All"> = AtomExpr2<"all">, "[", SubscriptList, "]" => ActionFn(1365); + assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant78(__symbols); + let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1253::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (5, 102) + let __end = __sym3.2; + let __nt = super::__action1365::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 100) } pub(crate) fn __reduce275< >( @@ -22316,17 +23241,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchName, "(", OneOrMore, ")" => ActionFn(1254); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant78(__symbols); + // AtomExpr2<"All"> = AtomExpr2<"all">, ".", Identifier => ActionFn(1366); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1254::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 102) + let __end = __sym2.2; + let __nt = super::__action1366::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 100) } pub(crate) fn __reduce276< >( @@ -22336,16 +23260,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchName, "(", ")" => ActionFn(1255); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // AtomExpr2<"all"> = Atom<"all"> => ActionFn(537); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1255::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (3, 102) + let __end = __sym0.2; + let __nt = super::__action537::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 101) } pub(crate) fn __reduce277< >( @@ -22355,20 +23276,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", OneOrMore, ",", ")" => ActionFn(1256); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant78(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // AtomExpr2<"all"> = AtomExpr2<"all">, Arguments => ActionFn(1367); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant49(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1256::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (7, 102) + let __end = __sym1.2; + let __nt = super::__action1367::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 101) } pub(crate) fn __reduce278< >( @@ -22378,19 +23294,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", OneOrMore, ")" => ActionFn(1257); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant78(__symbols); + // AtomExpr2<"all"> = AtomExpr2<"all">, "[", SubscriptList, "]" => ActionFn(1368); + assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); + let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1257::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (6, 102) + let __end = __sym3.2; + let __nt = super::__action1368::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (4, 101) } pub(crate) fn __reduce279< >( @@ -22400,18 +23314,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", ")" => ActionFn(1258); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); + // AtomExpr2<"all"> = AtomExpr2<"all">, ".", Identifier => ActionFn(1369); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1258::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (5, 102) + let __end = __sym2.2; + let __nt = super::__action1369::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 101) } pub(crate) fn __reduce280< >( @@ -22421,17 +23333,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ")" => ActionFn(1259); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant52(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // AtomExpr2<"no-withitems"> = Atom<"no-withitems"> => ActionFn(603); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1259::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 102) + let __end = __sym0.2; + let __nt = super::__action603::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 102) } pub(crate) fn __reduce281< >( @@ -22441,18 +23349,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", ")" => ActionFn(1260); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant78(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // AtomExpr2<"no-withitems"> = AtomExpr2<"all">, Arguments => ActionFn(1370); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant49(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1260::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (5, 102) + let __end = __sym1.2; + let __nt = super::__action1370::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 102) } pub(crate) fn __reduce282< >( @@ -22462,16 +23367,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ")" => ActionFn(1261); + // AtomExpr2<"no-withitems"> = AtomExpr2<"all">, "[", SubscriptList, "]" => ActionFn(1371); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant78(__symbols); + let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1261::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + let __nt = super::__action1371::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 102) } pub(crate) fn __reduce283< @@ -22482,15 +23387,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClassPattern = MatchNameOrAttr, "(", ")" => ActionFn(1262); + // AtomExpr2<"no-withitems"> = AtomExpr2<"all">, ".", Identifier => ActionFn(1372); assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1262::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + let __nt = super::__action1372::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (3, 102) } pub(crate) fn __reduce284< @@ -22501,13 +23406,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClosedPattern = LiteralPattern => ActionFn(96); - let __sym0 = __pop_Variant34(__symbols); + // AtomExpr<"All"> = "await", AtomExpr2<"all"> => ActionFn(1373); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action96::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 103) + let __end = __sym1.2; + let __nt = super::__action1373::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 103) } pub(crate) fn __reduce285< >( @@ -22517,12 +23424,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClosedPattern = CapturePattern => ActionFn(97); - let __sym0 = __pop_Variant34(__symbols); + // AtomExpr<"All"> = AtomExpr2<"All"> => ActionFn(530); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action97::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + let __nt = super::__action530::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 103) } pub(crate) fn __reduce286< @@ -22533,13 +23440,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClosedPattern = StarPattern => ActionFn(98); - let __sym0 = __pop_Variant34(__symbols); + // AtomExpr<"all"> = "await", AtomExpr2<"all"> => ActionFn(1374); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action98::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 103) + let __end = __sym1.2; + let __nt = super::__action1374::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 104) } pub(crate) fn __reduce287< >( @@ -22549,13 +23458,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClosedPattern = ValuePattern => ActionFn(99); - let __sym0 = __pop_Variant34(__symbols); + // AtomExpr<"all"> = AtomExpr2<"all"> => ActionFn(532); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action99::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 103) + let __nt = super::__action532::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 104) } pub(crate) fn __reduce288< >( @@ -22565,13 +23474,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClosedPattern = SequencePattern => ActionFn(100); - let __sym0 = __pop_Variant34(__symbols); + // AtomExpr<"no-withitems"> = "await", AtomExpr2<"all"> => ActionFn(1375); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action100::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 103) + let __end = __sym1.2; + let __nt = super::__action1375::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 105) } pub(crate) fn __reduce289< >( @@ -22581,13 +23492,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClosedPattern = MappingPattern => ActionFn(101); - let __sym0 = __pop_Variant34(__symbols); + // AtomExpr<"no-withitems"> = AtomExpr2<"no-withitems"> => ActionFn(602); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action101::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 103) + let __nt = super::__action602::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 105) } pub(crate) fn __reduce290< >( @@ -22597,13 +23508,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ClosedPattern = ClassPattern => ActionFn(102); - let __sym0 = __pop_Variant34(__symbols); + // AugAssign = "+=" => ActionFn(40); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action102::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 103) + let __nt = super::__action40::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce291< >( @@ -22613,13 +23524,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = FunctionArgument => ActionFn(1506); - let __sym0 = __pop_Variant30(__symbols); + // AugAssign = "-=" => ActionFn(41); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1506::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant51(__nt), __end)); - (1, 104) + let __nt = super::__action41::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce292< >( @@ -22629,12 +23540,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = => ActionFn(1507); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action1507::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant51(__nt), __end)); - (0, 104) + // AugAssign = "*=" => ActionFn(42); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action42::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce293< >( @@ -22644,15 +23556,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = ( ",")+, FunctionArgument => ActionFn(1508); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant30(__symbols); - let __sym0 = __pop_Variant31(__symbols); + // AugAssign = "@=" => ActionFn(43); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1508::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant51(__nt), __end)); - (2, 104) + let __end = __sym0.2; + let __nt = super::__action43::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce294< >( @@ -22662,13 +23572,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(1509); - let __sym0 = __pop_Variant31(__symbols); + // AugAssign = "/=" => ActionFn(44); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1509::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant51(__nt), __end)); - (1, 104) + let __nt = super::__action44::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce295< >( @@ -22678,13 +23588,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = Pattern => ActionFn(1514); - let __sym0 = __pop_Variant34(__symbols); + // AugAssign = "%=" => ActionFn(45); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1514::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (1, 105) + let __nt = super::__action45::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce296< >( @@ -22694,12 +23604,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = => ActionFn(1515); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action1515::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (0, 105) + // AugAssign = "&=" => ActionFn(46); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action46::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce297< >( @@ -22709,15 +23620,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = ( ",")+, Pattern => ActionFn(1516); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant34(__symbols); - let __sym0 = __pop_Variant35(__symbols); + // AugAssign = "|=" => ActionFn(47); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1516::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (2, 105) + let __end = __sym0.2; + let __nt = super::__action47::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce298< >( @@ -22727,13 +23636,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(1517); - let __sym0 = __pop_Variant35(__symbols); + // AugAssign = "^=" => ActionFn(48); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1517::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (1, 105) + let __nt = super::__action48::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce299< >( @@ -22743,12 +23652,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompFor = SingleForComprehension+ => ActionFn(222); - let __sym0 = __pop_Variant85(__symbols); + // AugAssign = "<<=" => ActionFn(49); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action222::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant53(__nt), __end)); + let __nt = super::__action49::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); (1, 106) } pub(crate) fn __reduce300< @@ -22759,13 +23668,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompFor? = CompFor => ActionFn(235); - let __sym0 = __pop_Variant53(__symbols); + // AugAssign = ">>=" => ActionFn(50); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action235::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant54(__nt), __end)); - (1, 107) + let __nt = super::__action50::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce301< >( @@ -22775,12 +23684,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompFor? = => ActionFn(236); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action236::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant54(__nt), __end)); - (0, 107) + // AugAssign = "**=" => ActionFn(51); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action51::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce302< >( @@ -22790,13 +23700,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "==" => ActionFn(182); + // AugAssign = "//=" => ActionFn(52); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action182::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __nt = super::__action52::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 106) } pub(crate) fn __reduce303< >( @@ -22806,13 +23716,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "!=" => ActionFn(183); - let __sym0 = __pop_Variant0(__symbols); + // CapturePattern = Identifier => ActionFn(1376); + let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action183::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __nt = super::__action1376::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 107) } pub(crate) fn __reduce304< >( @@ -22822,13 +23732,19 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "<" => ActionFn(184); + // ClassDef = "class", Identifier, TypeParams, Arguments, ":", Suite => ActionFn(1851); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant24(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant49(__symbols); + let __sym2 = __pop_Variant91(__symbols); + let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action184::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __end = __sym5.2; + let __nt = super::__action1851::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (6, 108) } pub(crate) fn __reduce305< >( @@ -22838,13 +23754,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "<=" => ActionFn(185); + // ClassDef = "class", Identifier, Arguments, ":", Suite => ActionFn(1852); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant24(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant49(__symbols); + let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action185::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __end = __sym4.2; + let __nt = super::__action1852::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (5, 108) } pub(crate) fn __reduce306< >( @@ -22854,13 +23775,20 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = ">" => ActionFn(186); - let __sym0 = __pop_Variant0(__symbols); + // ClassDef = Decorator+, "class", Identifier, TypeParams, Arguments, ":", Suite => ActionFn(1853); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant24(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant49(__symbols); + let __sym3 = __pop_Variant91(__symbols); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action186::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __end = __sym6.2; + let __nt = super::__action1853::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (7, 108) } pub(crate) fn __reduce307< >( @@ -22870,13 +23798,19 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = ">=" => ActionFn(187); - let __sym0 = __pop_Variant0(__symbols); + // ClassDef = Decorator+, "class", Identifier, Arguments, ":", Suite => ActionFn(1854); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant24(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant49(__symbols); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action187::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __end = __sym5.2; + let __nt = super::__action1854::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (6, 108) } pub(crate) fn __reduce308< >( @@ -22886,13 +23820,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "in" => ActionFn(188); + // ClassDef = "class", Identifier, TypeParams, ":", Suite => ActionFn(1855); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant24(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant91(__symbols); + let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action188::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __end = __sym4.2; + let __nt = super::__action1855::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (5, 108) } pub(crate) fn __reduce309< >( @@ -22902,15 +23841,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "not", "in" => ActionFn(189); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); + // ClassDef = "class", Identifier, ":", Suite => ActionFn(1856); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant24(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action189::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (2, 108) + let __end = __sym3.2; + let __nt = super::__action1856::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (4, 108) } pub(crate) fn __reduce310< >( @@ -22920,13 +23861,19 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "is" => ActionFn(190); - let __sym0 = __pop_Variant0(__symbols); + // ClassDef = Decorator+, "class", Identifier, TypeParams, ":", Suite => ActionFn(1857); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant24(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant91(__symbols); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action190::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (1, 108) + let __end = __sym5.2; + let __nt = super::__action1857::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (6, 108) } pub(crate) fn __reduce311< >( @@ -22936,15 +23883,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompOp = "is", "not" => ActionFn(191); - assert!(__symbols.len() >= 2); + // ClassDef = Decorator+, "class", Identifier, ":", Suite => ActionFn(1858); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant24(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action191::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant55(__nt), __end)); - (2, 108) + let __end = __sym4.2; + let __nt = super::__action1858::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (5, 108) } pub(crate) fn __reduce312< >( @@ -22954,15 +23904,20 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comparison<"all"> = Expression<"all">, (CompOp Expression<"all">)+ => ActionFn(1263); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant44(__symbols); + // ClassPattern = MatchName, "(", OneOrMore, ",", OneOrMore, ",", ")" => ActionFn(1377); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant78(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1263::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 109) + let __end = __sym6.2; + let __nt = super::__action1377::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (7, 109) } pub(crate) fn __reduce313< >( @@ -22972,13 +23927,19 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comparison<"all"> = Expression<"all"> => ActionFn(486); + // ClassPattern = MatchName, "(", OneOrMore, ",", OneOrMore, ")" => ActionFn(1378); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant78(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action486::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 109) + let __end = __sym5.2; + let __nt = super::__action1378::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (6, 109) } pub(crate) fn __reduce314< >( @@ -22988,15 +23949,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comparison<"no-withitems"> = Expression<"all">, (CompOp Expression<"all">)+ => ActionFn(1264); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant44(__symbols); + // ClassPattern = MatchName, "(", OneOrMore, ",", ")" => ActionFn(1379); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1264::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 110) + let __end = __sym4.2; + let __nt = super::__action1379::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (5, 109) } pub(crate) fn __reduce315< >( @@ -23006,13 +23970,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Comparison<"no-withitems"> = Expression<"no-withitems"> => ActionFn(495); + // ClassPattern = MatchName, "(", OneOrMore, ")" => ActionFn(1380); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action495::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 110) + let __end = __sym3.2; + let __nt = super::__action1380::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (4, 109) } pub(crate) fn __reduce316< >( @@ -23022,13 +23990,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = MatchStatement => ActionFn(75); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchName, "(", OneOrMore, ",", ")" => ActionFn(1381); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant78(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action75::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym4.2; + let __nt = super::__action1381::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (5, 109) } pub(crate) fn __reduce317< >( @@ -23038,13 +24011,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = IfStatement => ActionFn(76); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchName, "(", OneOrMore, ")" => ActionFn(1382); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant78(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action76::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym3.2; + let __nt = super::__action1382::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (4, 109) } pub(crate) fn __reduce318< >( @@ -23054,13 +24031,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = WhileStatement => ActionFn(77); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchName, "(", ")" => ActionFn(1383); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action77::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym2.2; + let __nt = super::__action1383::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (3, 109) } pub(crate) fn __reduce319< >( @@ -23070,13 +24050,20 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = ForStatement => ActionFn(78); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", OneOrMore, ",", ")" => ActionFn(1384); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant78(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action78::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym6.2; + let __nt = super::__action1384::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (7, 109) } pub(crate) fn __reduce320< >( @@ -23086,13 +24073,19 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = TryStatement => ActionFn(79); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", OneOrMore, ")" => ActionFn(1385); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant78(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action79::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym5.2; + let __nt = super::__action1385::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (6, 109) } pub(crate) fn __reduce321< >( @@ -23102,13 +24095,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = WithStatement => ActionFn(80); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", ")" => ActionFn(1386); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action80::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym4.2; + let __nt = super::__action1386::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (5, 109) } pub(crate) fn __reduce322< >( @@ -23118,13 +24116,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = FuncDef => ActionFn(81); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ")" => ActionFn(1387); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant52(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action81::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym3.2; + let __nt = super::__action1387::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (4, 109) } pub(crate) fn __reduce323< >( @@ -23134,13 +24136,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // CompoundStatement = ClassDef => ActionFn(82); - let __sym0 = __pop_Variant36(__symbols); + // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ",", ")" => ActionFn(1388); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant78(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action82::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 111) + let __end = __sym4.2; + let __nt = super::__action1388::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (5, 109) } pub(crate) fn __reduce324< >( @@ -23150,15 +24157,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ComprehensionIf = "if", ExpressionNoCond => ActionFn(225); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ClassPattern = MatchNameOrAttr, "(", OneOrMore, ")" => ActionFn(1389); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant78(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action225::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 112) + let __end = __sym3.2; + let __nt = super::__action1389::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (4, 109) } pub(crate) fn __reduce325< >( @@ -23168,12 +24177,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ComprehensionIf* = => ActionFn(238); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action238::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (0, 113) + // ClassPattern = MatchNameOrAttr, "(", ")" => ActionFn(1390); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1390::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (3, 109) } pub(crate) fn __reduce326< >( @@ -23183,13 +24196,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ComprehensionIf* = ComprehensionIf+ => ActionFn(239); - let __sym0 = __pop_Variant16(__symbols); + // ClosedPattern = LiteralPattern => ActionFn(98); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action239::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (1, 113) + let __nt = super::__action98::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 110) } pub(crate) fn __reduce327< >( @@ -23199,13 +24212,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ComprehensionIf+ = ComprehensionIf => ActionFn(435); - let __sym0 = __pop_Variant14(__symbols); + // ClosedPattern = CapturePattern => ActionFn(99); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action435::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (1, 114) + let __nt = super::__action99::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 110) } pub(crate) fn __reduce328< >( @@ -23215,15 +24228,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ComprehensionIf+ = ComprehensionIf+, ComprehensionIf => ActionFn(436); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); + // ClosedPattern = StarPattern => ActionFn(100); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action436::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant16(__nt), __end)); - (2, 114) + let __end = __sym0.2; + let __nt = super::__action100::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 110) } pub(crate) fn __reduce329< >( @@ -23233,13 +24244,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Constant = int => ActionFn(231); - let __sym0 = __pop_Variant3(__symbols); + // ClosedPattern = ValuePattern => ActionFn(101); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action231::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant56(__nt), __end)); - (1, 115) + let __nt = super::__action101::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 110) } pub(crate) fn __reduce330< >( @@ -23249,13 +24260,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Constant = float => ActionFn(232); - let __sym0 = __pop_Variant2(__symbols); + // ClosedPattern = SequencePattern => ActionFn(102); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action232::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant56(__nt), __end)); - (1, 115) + let __nt = super::__action102::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 110) } pub(crate) fn __reduce331< >( @@ -23265,13 +24276,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Constant = complex => ActionFn(233); - let __sym0 = __pop_Variant1(__symbols); + // ClosedPattern = MappingPattern => ActionFn(103); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action233::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant56(__nt), __end)); - (1, 115) + let __nt = super::__action103::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 110) } pub(crate) fn __reduce332< >( @@ -23281,13 +24292,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ConstantAtom = Constant => ActionFn(1265); - let __sym0 = __pop_Variant56(__symbols); + // ClosedPattern = ClassPattern => ActionFn(104); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1265::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 116) + let __nt = super::__action104::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 110) } pub(crate) fn __reduce333< >( @@ -23297,13 +24308,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ConstantExpr = ConstantAtom => ActionFn(110); - let __sym0 = __pop_Variant14(__symbols); + // Comma = FunctionArgument => ActionFn(1641); + let __sym0 = __pop_Variant30(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action110::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 117) + let __nt = super::__action1641::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant51(__nt), __end)); + (1, 111) } pub(crate) fn __reduce334< >( @@ -23313,15 +24324,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ConstantExpr = "-", ConstantAtom => ActionFn(1266); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1266::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 117) + // Comma = => ActionFn(1642); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action1642::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant51(__nt), __end)); + (0, 111) } pub(crate) fn __reduce335< >( @@ -23331,16 +24339,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Decorator = "@", NamedExpressionTest, "\n" => ActionFn(1267); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // Comma = ( ",")+, FunctionArgument => ActionFn(1643); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant30(__symbols); + let __sym0 = __pop_Variant31(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1267::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant57(__nt), __end)); - (3, 118) + let __end = __sym1.2; + let __nt = super::__action1643::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant51(__nt), __end)); + (2, 111) } pub(crate) fn __reduce336< >( @@ -23350,12 +24357,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Decorator* = => ActionFn(286); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action286::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant58(__nt), __end)); - (0, 119) + // Comma = ( ",")+ => ActionFn(1644); + let __sym0 = __pop_Variant31(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1644::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant51(__nt), __end)); + (1, 111) } pub(crate) fn __reduce337< >( @@ -23365,13 +24373,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Decorator* = Decorator+ => ActionFn(287); - let __sym0 = __pop_Variant58(__symbols); + // Comma = Pattern => ActionFn(1649); + let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action287::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant58(__nt), __end)); - (1, 119) + let __nt = super::__action1649::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (1, 112) } pub(crate) fn __reduce338< >( @@ -23381,13 +24389,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Decorator+ = Decorator => ActionFn(408); - let __sym0 = __pop_Variant57(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action408::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant58(__nt), __end)); - (1, 120) + // Comma = => ActionFn(1650); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action1650::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (0, 112) } pub(crate) fn __reduce339< >( @@ -23397,15 +24404,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Decorator+ = Decorator+, Decorator => ActionFn(409); + // Comma = ( ",")+, Pattern => ActionFn(1651); assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant57(__symbols); - let __sym0 = __pop_Variant58(__symbols); + let __sym1 = __pop_Variant34(__symbols); + let __sym0 = __pop_Variant35(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action409::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant58(__nt), __end)); - (2, 120) + let __nt = super::__action1651::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (2, 112) } pub(crate) fn __reduce340< >( @@ -23415,15 +24422,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DelStatement = "del", ExpressionList2 => ActionFn(1268); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant32(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // Comma = ( ",")+ => ActionFn(1652); + let __sym0 = __pop_Variant35(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1268::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 121) + let __end = __sym0.2; + let __nt = super::__action1652::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (1, 112) } pub(crate) fn __reduce341< >( @@ -23433,13 +24438,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DictElement = DictEntry => ActionFn(213); - let __sym0 = __pop_Variant60(__symbols); + // CompFor = SingleForComprehension+ => ActionFn(224); + let __sym0 = __pop_Variant85(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action213::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant59(__nt), __end)); - (1, 122) + let __nt = super::__action224::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant53(__nt), __end)); + (1, 113) } pub(crate) fn __reduce342< >( @@ -23449,15 +24454,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DictElement = "**", Expression<"all"> => ActionFn(214); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // CompFor? = CompFor => ActionFn(237); + let __sym0 = __pop_Variant53(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action214::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant59(__nt), __end)); - (2, 122) + let __end = __sym0.2; + let __nt = super::__action237::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant54(__nt), __end)); + (1, 114) } pub(crate) fn __reduce343< >( @@ -23467,16 +24470,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DictEntry = Test<"all">, ":", Test<"all"> => ActionFn(212); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action212::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant60(__nt), __end)); - (3, 123) + // CompFor? = => ActionFn(238); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action238::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant54(__nt), __end)); + (0, 114) } pub(crate) fn __reduce344< >( @@ -23486,15 +24485,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DictLiteralValues = OneOrMore, "," => ActionFn(597); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant61(__symbols); + // CompOp = "==" => ActionFn(184); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action597::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant61(__nt), __end)); - (2, 124) + let __end = __sym0.2; + let __nt = super::__action184::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce345< >( @@ -23504,13 +24501,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DictLiteralValues = OneOrMore => ActionFn(598); - let __sym0 = __pop_Variant61(__symbols); + // CompOp = "!=" => ActionFn(185); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action598::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant61(__nt), __end)); - (1, 124) + let __nt = super::__action185::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce346< >( @@ -23520,13 +24517,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DictLiteralValues? = DictLiteralValues => ActionFn(539); - let __sym0 = __pop_Variant61(__symbols); + // CompOp = "<" => ActionFn(186); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action539::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant62(__nt), __end)); - (1, 125) + let __nt = super::__action186::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce347< >( @@ -23536,12 +24533,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DictLiteralValues? = => ActionFn(540); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action540::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant62(__nt), __end)); - (0, 125) + // CompOp = "<=" => ActionFn(187); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action187::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce348< >( @@ -23551,13 +24549,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DottedName = name => ActionFn(1269); - let __sym0 = __pop_Variant5(__symbols); + // CompOp = ">" => ActionFn(188); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1269::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant22(__nt), __end)); - (1, 126) + let __nt = super::__action188::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce349< >( @@ -23567,15 +24565,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DottedName = name, ("." Identifier)+ => ActionFn(1270); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant20(__symbols); - let __sym0 = __pop_Variant5(__symbols); + // CompOp = ">=" => ActionFn(189); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1270::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant22(__nt), __end)); - (2, 126) + let __end = __sym0.2; + let __nt = super::__action189::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce350< >( @@ -23585,16 +24581,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DoubleStarTypedParameter = Identifier, ":", Test<"all"> => ActionFn(1271); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); + // CompOp = "in" => ActionFn(190); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1271::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant63(__nt), __end)); - (3, 127) + let __end = __sym0.2; + let __nt = super::__action190::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce351< >( @@ -23604,13 +24597,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DoubleStarTypedParameter = Identifier => ActionFn(1272); - let __sym0 = __pop_Variant22(__symbols); + // CompOp = "not", "in" => ActionFn(191); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1272::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant63(__nt), __end)); - (1, 127) + let __end = __sym1.2; + let __nt = super::__action191::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (2, 115) } pub(crate) fn __reduce352< >( @@ -23620,13 +24615,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DoubleStarTypedParameter? = DoubleStarTypedParameter => ActionFn(473); - let __sym0 = __pop_Variant63(__symbols); + // CompOp = "is" => ActionFn(192); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action473::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant64(__nt), __end)); - (1, 128) + let __nt = super::__action192::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (1, 115) } pub(crate) fn __reduce353< >( @@ -23636,12 +24631,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // DoubleStarTypedParameter? = => ActionFn(474); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action474::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant64(__nt), __end)); - (0, 128) + // CompOp = "is", "not" => ActionFn(193); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action193::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant55(__nt), __end)); + (2, 115) } pub(crate) fn __reduce354< >( @@ -23651,17 +24649,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptClause = "except", Test<"all">, ":", Suite => ActionFn(1684); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant24(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // Comparison<"all"> = Expression<"all">, (CompOp Expression<"all">)+ => ActionFn(1391); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant44(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1684::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant65(__nt), __end)); - (4, 129) + let __end = __sym1.2; + let __nt = super::__action1391::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 116) } pub(crate) fn __reduce355< >( @@ -23671,16 +24667,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptClause = "except", ":", Suite => ActionFn(1685); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // Comparison<"all"> = Expression<"all"> => ActionFn(499); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1685::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant65(__nt), __end)); - (3, 129) + let __end = __sym0.2; + let __nt = super::__action499::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 116) } pub(crate) fn __reduce356< >( @@ -23690,19 +24683,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptClause = "except", Test<"all">, "as", Identifier, ":", Suite => ActionFn(1178); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant24(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant22(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // Comparison<"no-withitems"> = Expression<"all">, (CompOp Expression<"all">)+ => ActionFn(1392); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant44(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1178::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant65(__nt), __end)); - (6, 129) + let __end = __sym1.2; + let __nt = super::__action1392::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 117) } pub(crate) fn __reduce357< >( @@ -23712,13 +24701,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptClause+ = ExceptClause => ActionFn(311); - let __sym0 = __pop_Variant65(__symbols); + // Comparison<"no-withitems"> = Expression<"no-withitems"> => ActionFn(514); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action311::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant66(__nt), __end)); - (1, 130) + let __nt = super::__action514::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 117) } pub(crate) fn __reduce358< >( @@ -23728,15 +24717,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptClause+ = ExceptClause+, ExceptClause => ActionFn(312); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant65(__symbols); - let __sym0 = __pop_Variant66(__symbols); + // CompoundStatement = MatchStatement => ActionFn(77); + let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action312::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant66(__nt), __end)); - (2, 130) + let __end = __sym0.2; + let __nt = super::__action77::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) } pub(crate) fn __reduce359< >( @@ -23746,18 +24733,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptStarClause = "except", "*", Test<"all">, ":", Suite => ActionFn(783); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant24(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // CompoundStatement = IfStatement => ActionFn(78); + let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action783::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant65(__nt), __end)); - (5, 131) + let __end = __sym0.2; + let __nt = super::__action78::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) } pub(crate) fn __reduce360< >( @@ -23767,7 +24749,720 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptStarClause = "except", "*", Test<"all">, "as", Identifier, ":", Suite => ActionFn(1179); + // CompoundStatement = WhileStatement => ActionFn(79); + let __sym0 = __pop_Variant36(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action79::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) + } + pub(crate) fn __reduce361< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // CompoundStatement = ForStatement => ActionFn(80); + let __sym0 = __pop_Variant36(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action80::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) + } + pub(crate) fn __reduce362< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // CompoundStatement = TryStatement => ActionFn(81); + let __sym0 = __pop_Variant36(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action81::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) + } + pub(crate) fn __reduce363< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // CompoundStatement = WithStatement => ActionFn(82); + let __sym0 = __pop_Variant36(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action82::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) + } + pub(crate) fn __reduce364< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // CompoundStatement = FuncDef => ActionFn(83); + let __sym0 = __pop_Variant36(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action83::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) + } + pub(crate) fn __reduce365< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // CompoundStatement = ClassDef => ActionFn(84); + let __sym0 = __pop_Variant36(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action84::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 118) + } + pub(crate) fn __reduce366< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ComprehensionIf = "if", ExpressionNoCond => ActionFn(227); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action227::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 119) + } + pub(crate) fn __reduce367< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ComprehensionIf* = => ActionFn(240); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action240::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (0, 120) + } + pub(crate) fn __reduce368< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ComprehensionIf* = ComprehensionIf+ => ActionFn(241); + let __sym0 = __pop_Variant16(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action241::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (1, 120) + } + pub(crate) fn __reduce369< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ComprehensionIf+ = ComprehensionIf => ActionFn(444); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action444::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (1, 121) + } + pub(crate) fn __reduce370< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ComprehensionIf+ = ComprehensionIf+, ComprehensionIf => ActionFn(445); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action445::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant16(__nt), __end)); + (2, 121) + } + pub(crate) fn __reduce371< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Constant = int => ActionFn(233); + let __sym0 = __pop_Variant3(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action233::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant56(__nt), __end)); + (1, 122) + } + pub(crate) fn __reduce372< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Constant = float => ActionFn(234); + let __sym0 = __pop_Variant2(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action234::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant56(__nt), __end)); + (1, 122) + } + pub(crate) fn __reduce373< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Constant = complex => ActionFn(235); + let __sym0 = __pop_Variant1(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action235::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant56(__nt), __end)); + (1, 122) + } + pub(crate) fn __reduce374< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ConstantAtom = Constant => ActionFn(1393); + let __sym0 = __pop_Variant56(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1393::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 123) + } + pub(crate) fn __reduce375< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ConstantExpr = ConstantAtom => ActionFn(112); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action112::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 124) + } + pub(crate) fn __reduce376< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ConstantExpr = "-", ConstantAtom => ActionFn(1394); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1394::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 124) + } + pub(crate) fn __reduce377< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Decorator = "@", NamedExpressionTest, "\n" => ActionFn(1395); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1395::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant57(__nt), __end)); + (3, 125) + } + pub(crate) fn __reduce378< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Decorator* = => ActionFn(288); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action288::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant58(__nt), __end)); + (0, 126) + } + pub(crate) fn __reduce379< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Decorator* = Decorator+ => ActionFn(289); + let __sym0 = __pop_Variant58(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action289::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant58(__nt), __end)); + (1, 126) + } + pub(crate) fn __reduce380< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Decorator+ = Decorator => ActionFn(417); + let __sym0 = __pop_Variant57(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action417::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant58(__nt), __end)); + (1, 127) + } + pub(crate) fn __reduce381< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Decorator+ = Decorator+, Decorator => ActionFn(418); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant57(__symbols); + let __sym0 = __pop_Variant58(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action418::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant58(__nt), __end)); + (2, 127) + } + pub(crate) fn __reduce382< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DelStatement = "del", ExpressionList2 => ActionFn(1396); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant32(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1396::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (2, 128) + } + pub(crate) fn __reduce383< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DictElement = DictEntry => ActionFn(215); + let __sym0 = __pop_Variant60(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action215::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant59(__nt), __end)); + (1, 129) + } + pub(crate) fn __reduce384< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DictElement = "**", Expression<"all"> => ActionFn(216); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action216::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant59(__nt), __end)); + (2, 129) + } + pub(crate) fn __reduce385< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DictEntry = Test<"all">, ":", Test<"all"> => ActionFn(214); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action214::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant60(__nt), __end)); + (3, 130) + } + pub(crate) fn __reduce386< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DictLiteralValues = OneOrMore, "," => ActionFn(647); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant61(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action647::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant61(__nt), __end)); + (2, 131) + } + pub(crate) fn __reduce387< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DictLiteralValues = OneOrMore => ActionFn(648); + let __sym0 = __pop_Variant61(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action648::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant61(__nt), __end)); + (1, 131) + } + pub(crate) fn __reduce388< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DictLiteralValues? = DictLiteralValues => ActionFn(583); + let __sym0 = __pop_Variant61(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action583::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant62(__nt), __end)); + (1, 132) + } + pub(crate) fn __reduce389< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DictLiteralValues? = => ActionFn(584); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action584::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant62(__nt), __end)); + (0, 132) + } + pub(crate) fn __reduce390< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DottedName = name => ActionFn(1397); + let __sym0 = __pop_Variant5(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1397::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant22(__nt), __end)); + (1, 133) + } + pub(crate) fn __reduce391< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DottedName = name, ("." Identifier)+ => ActionFn(1398); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant20(__symbols); + let __sym0 = __pop_Variant5(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1398::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant22(__nt), __end)); + (2, 133) + } + pub(crate) fn __reduce392< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DoubleStarTypedParameter = Identifier, ":", Test<"all"> => ActionFn(1399); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1399::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant63(__nt), __end)); + (3, 134) + } + pub(crate) fn __reduce393< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DoubleStarTypedParameter = Identifier => ActionFn(1400); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1400::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant63(__nt), __end)); + (1, 134) + } + pub(crate) fn __reduce394< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DoubleStarTypedParameter? = DoubleStarTypedParameter => ActionFn(480); + let __sym0 = __pop_Variant63(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action480::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant64(__nt), __end)); + (1, 135) + } + pub(crate) fn __reduce395< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // DoubleStarTypedParameter? = => ActionFn(481); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action481::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant64(__nt), __end)); + (0, 135) + } + pub(crate) fn __reduce396< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExceptClause = "except", Test<"all">, ":", Suite => ActionFn(1823); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant24(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1823::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant65(__nt), __end)); + (4, 136) + } + pub(crate) fn __reduce397< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExceptClause = "except", ":", Suite => ActionFn(1824); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1824::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant65(__nt), __end)); + (3, 136) + } + pub(crate) fn __reduce398< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExceptClause = "except", Test<"all">, "as", Identifier, ":", Suite => ActionFn(1275); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant24(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = super::__action1275::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant65(__nt), __end)); + (6, 136) + } + pub(crate) fn __reduce399< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExceptClause+ = ExceptClause => ActionFn(313); + let __sym0 = __pop_Variant65(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action313::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant66(__nt), __end)); + (1, 137) + } + pub(crate) fn __reduce400< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExceptClause+ = ExceptClause+, ExceptClause => ActionFn(314); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant65(__symbols); + let __sym0 = __pop_Variant66(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action314::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant66(__nt), __end)); + (2, 137) + } + pub(crate) fn __reduce401< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExceptStarClause = "except", "*", Test<"all">, ":", Suite => ActionFn(859); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant24(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action859::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant65(__nt), __end)); + (5, 138) + } + pub(crate) fn __reduce402< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExceptStarClause = "except", "*", Test<"all">, "as", Identifier, ":", Suite => ActionFn(1276); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -23778,11 +25473,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1179::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1276::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant65(__nt), __end)); - (7, 131) + (7, 138) } - pub(crate) fn __reduce361< + pub(crate) fn __reduce403< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23790,15 +25485,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptStarClause+ = ExceptStarClause => ActionFn(306); + // ExceptStarClause+ = ExceptStarClause => ActionFn(308); let __sym0 = __pop_Variant65(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action306::<>(mode, __sym0); + let __nt = super::__action308::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant66(__nt), __end)); - (1, 132) + (1, 139) } - pub(crate) fn __reduce362< + pub(crate) fn __reduce404< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23806,17 +25501,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExceptStarClause+ = ExceptStarClause+, ExceptStarClause => ActionFn(307); + // ExceptStarClause+ = ExceptStarClause+, ExceptStarClause => ActionFn(309); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant65(__symbols); let __sym0 = __pop_Variant66(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action307::<>(mode, __sym0, __sym1); + let __nt = super::__action309::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant66(__nt), __end)); - (2, 132) + (2, 139) } - pub(crate) fn __reduce363< + pub(crate) fn __reduce405< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23824,18 +25519,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Expression<"all"> = Expression<"all">, "|", XorExpression<"all"> => ActionFn(1273); + // Expression<"All"> = Expression<"all">, "|", XorExpression<"all"> => ActionFn(1401); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1273::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1401::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 133) + (3, 140) } - pub(crate) fn __reduce364< + pub(crate) fn __reduce406< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23843,15 +25538,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Expression<"all"> = XorExpression<"all"> => ActionFn(249); + // Expression<"All"> = XorExpression<"All"> => ActionFn(354); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action249::<>(mode, __sym0); + let __nt = super::__action354::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 133) + (1, 140) } - pub(crate) fn __reduce365< + pub(crate) fn __reduce407< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23859,18 +25554,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Expression<"no-withitems"> = Expression<"all">, "|", XorExpression<"all"> => ActionFn(1274); + // Expression<"all"> = Expression<"all">, "|", XorExpression<"all"> => ActionFn(1402); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1274::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1402::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 134) + (3, 141) } - pub(crate) fn __reduce366< + pub(crate) fn __reduce408< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23878,15 +25573,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Expression<"no-withitems"> = XorExpression<"no-withitems"> => ActionFn(501); + // Expression<"all"> = XorExpression<"all"> => ActionFn(251); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action501::<>(mode, __sym0); + let __nt = super::__action251::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 134) + (1, 141) } - pub(crate) fn __reduce367< + pub(crate) fn __reduce409< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23894,15 +25589,116 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExpressionList = GenericList => ActionFn(218); + // Expression<"no-withitems"> = Expression<"all">, "|", XorExpression<"all"> => ActionFn(1403); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1403::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 142) + } + pub(crate) fn __reduce410< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Expression<"no-withitems"> = XorExpression<"no-withitems"> => ActionFn(516); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action516::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 142) + } + pub(crate) fn __reduce411< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExpressionList = GenericList => ActionFn(220); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action220::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 143) + } + pub(crate) fn __reduce412< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExpressionList2 = OneOrMore, "," => ActionFn(649); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action649::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (2, 144) + } + pub(crate) fn __reduce413< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExpressionList2 = OneOrMore => ActionFn(650); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action650::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (1, 144) + } + pub(crate) fn __reduce414< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExpressionNoCond = OrTest<"all"> => ActionFn(226); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action226::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 145) + } + pub(crate) fn __reduce415< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ExpressionOrStarExpression = Expression<"all"> => ActionFn(218); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; let __nt = super::__action218::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 135) + (1, 146) } - pub(crate) fn __reduce368< + pub(crate) fn __reduce416< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23910,49 +25706,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExpressionList2 = OneOrMore, "," => ActionFn(599); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action599::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (2, 136) - } - pub(crate) fn __reduce369< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ExpressionList2 = OneOrMore => ActionFn(600); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action600::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (1, 136) - } - pub(crate) fn __reduce370< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ExpressionNoCond = OrTest<"all"> => ActionFn(224); + // ExpressionOrStarExpression = StarExpr => ActionFn(219); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action224::<>(mode, __sym0); + let __nt = super::__action219::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 137) + (1, 146) } - pub(crate) fn __reduce371< + pub(crate) fn __reduce417< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -23960,47 +25722,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExpressionOrStarExpression = Expression<"all"> => ActionFn(216); + // ExpressionStatement = GenericList => ActionFn(1848); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action216::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 138) - } - pub(crate) fn __reduce372< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ExpressionOrStarExpression = StarExpr => ActionFn(217); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action217::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 138) - } - pub(crate) fn __reduce373< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ExpressionStatement = GenericList => ActionFn(1709); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1709::<>(mode, __sym0); + let __nt = super::__action1848::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 139) + (1, 147) } - pub(crate) fn __reduce374< + pub(crate) fn __reduce418< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24008,17 +25738,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExpressionStatement = GenericList, AssignSuffix+ => ActionFn(1710); + // ExpressionStatement = GenericList, AssignSuffix+ => ActionFn(1849); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant16(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1710::<>(mode, __sym0, __sym1); + let __nt = super::__action1849::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 139) + (2, 147) } - pub(crate) fn __reduce375< + pub(crate) fn __reduce419< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24026,18 +25756,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExpressionStatement = GenericList, AugAssign, TestListOrYieldExpr => ActionFn(1711); + // ExpressionStatement = GenericList, AugAssign, TestListOrYieldExpr => ActionFn(1850); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant48(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1711::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1850::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (3, 139) + (3, 147) } - pub(crate) fn __reduce376< + pub(crate) fn __reduce420< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24045,7 +25775,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExpressionStatement = Test<"all">, ":", Test<"all">, AssignSuffix => ActionFn(1504); + // ExpressionStatement = Test<"all">, ":", Test<"all">, AssignSuffix => ActionFn(1639); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant14(__symbols); let __sym2 = __pop_Variant14(__symbols); @@ -24053,11 +25783,11 @@ mod __parse__Top { let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1504::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1639::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 139) + (4, 147) } - pub(crate) fn __reduce377< + pub(crate) fn __reduce421< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24065,18 +25795,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ExpressionStatement = Test<"all">, ":", Test<"all"> => ActionFn(1505); + // ExpressionStatement = Test<"all">, ":", Test<"all"> => ActionFn(1640); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1505::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1640::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (3, 139) + (3, 147) } - pub(crate) fn __reduce378< + pub(crate) fn __reduce422< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24084,17 +25814,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Factor<"all"> = UnaryOp, Factor<"all"> => ActionFn(1278); + // Factor<"All"> = UnaryOp, Factor<"all"> => ActionFn(1407); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant93(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1278::<>(mode, __sym0, __sym1); + let __nt = super::__action1407::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 140) + (2, 148) } - pub(crate) fn __reduce379< + pub(crate) fn __reduce423< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24102,15 +25832,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Factor<"all"> = Power<"all"> => ActionFn(499); + // Factor<"All"> = Power<"All"> => ActionFn(518); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action499::<>(mode, __sym0); + let __nt = super::__action518::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 140) + (1, 148) } - pub(crate) fn __reduce380< + pub(crate) fn __reduce424< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24118,17 +25848,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Factor<"no-withitems"> = UnaryOp, Factor<"all"> => ActionFn(1279); + // Factor<"all"> = UnaryOp, Factor<"all"> => ActionFn(1408); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant93(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1279::<>(mode, __sym0, __sym1); + let __nt = super::__action1408::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 141) + (2, 149) } - pub(crate) fn __reduce381< + pub(crate) fn __reduce425< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24136,15 +25866,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Factor<"no-withitems"> = Power<"no-withitems"> => ActionFn(552); + // Factor<"all"> = Power<"all"> => ActionFn(520); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action552::<>(mode, __sym0); + let __nt = super::__action520::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 141) + (1, 149) } - pub(crate) fn __reduce382< + pub(crate) fn __reduce426< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24152,15 +25882,49 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FlowStatement = "break" => ActionFn(1280); + // Factor<"no-withitems"> = UnaryOp, Factor<"all"> => ActionFn(1409); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant93(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1409::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 150) + } + pub(crate) fn __reduce427< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Factor<"no-withitems"> = Power<"no-withitems"> => ActionFn(596); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action596::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 150) + } + pub(crate) fn __reduce428< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // FlowStatement = "break" => ActionFn(1410); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1280::<>(mode, __sym0); + let __nt = super::__action1410::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 142) + (1, 151) } - pub(crate) fn __reduce383< + pub(crate) fn __reduce429< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24168,15 +25932,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FlowStatement = "continue" => ActionFn(1281); + // FlowStatement = "continue" => ActionFn(1411); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1281::<>(mode, __sym0); + let __nt = super::__action1411::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 142) + (1, 151) } - pub(crate) fn __reduce384< + pub(crate) fn __reduce430< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24184,17 +25948,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FlowStatement = "return", GenericList => ActionFn(1705); + // FlowStatement = "return", GenericList => ActionFn(1844); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1705::<>(mode, __sym0, __sym1); + let __nt = super::__action1844::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 142) + (2, 151) } - pub(crate) fn __reduce385< + pub(crate) fn __reduce431< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24202,15 +25966,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FlowStatement = "return" => ActionFn(1706); + // FlowStatement = "return" => ActionFn(1845); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1706::<>(mode, __sym0); + let __nt = super::__action1845::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 142) + (1, 151) } - pub(crate) fn __reduce386< + pub(crate) fn __reduce432< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24218,15 +25982,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FlowStatement = YieldExpr => ActionFn(1283); + // FlowStatement = YieldExpr => ActionFn(1413); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1283::<>(mode, __sym0); + let __nt = super::__action1413::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 142) + (1, 151) } - pub(crate) fn __reduce387< + pub(crate) fn __reduce433< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24234,15 +25998,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FlowStatement = RaiseStatement => ActionFn(56); + // FlowStatement = RaiseStatement => ActionFn(57); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action56::<>(mode, __sym0); + let __nt = super::__action57::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 142) + (1, 151) } - pub(crate) fn __reduce388< + pub(crate) fn __reduce434< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24250,7 +26014,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ForStatement = "async", "for", ExpressionList, "in", GenericList, ":", Suite, "else", ":", Suite => ActionFn(1696); + // ForStatement = "async", "for", ExpressionList, "in", GenericList, ":", Suite, "else", ":", Suite => ActionFn(1835); assert!(__symbols.len() >= 10); let __sym9 = __pop_Variant24(__symbols); let __sym8 = __pop_Variant0(__symbols); @@ -24264,11 +26028,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym9.2; - let __nt = super::__action1696::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); + let __nt = super::__action1835::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (10, 143) + (10, 152) } - pub(crate) fn __reduce389< + pub(crate) fn __reduce435< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24276,7 +26040,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ForStatement = "async", "for", ExpressionList, "in", GenericList, ":", Suite => ActionFn(1697); + // ForStatement = "async", "for", ExpressionList, "in", GenericList, ":", Suite => ActionFn(1836); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -24287,11 +26051,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1697::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1836::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 143) + (7, 152) } - pub(crate) fn __reduce390< + pub(crate) fn __reduce436< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24299,7 +26063,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ForStatement = "for", ExpressionList, "in", GenericList, ":", Suite, "else", ":", Suite => ActionFn(1698); + // ForStatement = "for", ExpressionList, "in", GenericList, ":", Suite, "else", ":", Suite => ActionFn(1837); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant24(__symbols); let __sym7 = __pop_Variant0(__symbols); @@ -24312,11 +26076,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = super::__action1698::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); + let __nt = super::__action1837::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (9, 143) + (9, 152) } - pub(crate) fn __reduce391< + pub(crate) fn __reduce437< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24324,7 +26088,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ForStatement = "for", ExpressionList, "in", GenericList, ":", Suite => ActionFn(1699); + // ForStatement = "for", ExpressionList, "in", GenericList, ":", Suite => ActionFn(1838); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant24(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -24334,11 +26098,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = super::__action1699::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action1838::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 143) + (6, 152) } - pub(crate) fn __reduce392< + pub(crate) fn __reduce438< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24346,7 +26110,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "async", "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1720); + // FuncDef = "async", "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1859); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant24(__symbols); let __sym7 = __pop_Variant0(__symbols); @@ -24359,11 +26123,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = super::__action1720::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); + let __nt = super::__action1859::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (9, 144) + (9, 153) } - pub(crate) fn __reduce393< + pub(crate) fn __reduce439< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24371,7 +26135,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "async", "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1721); + // FuncDef = "async", "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1860); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant24(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -24383,11 +26147,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = super::__action1721::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action1860::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 144) + (8, 153) } - pub(crate) fn __reduce394< + pub(crate) fn __reduce440< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24395,7 +26159,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "async", "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1722); + // FuncDef = Decorator+, "async", "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1861); assert!(__symbols.len() >= 10); let __sym9 = __pop_Variant24(__symbols); let __sym8 = __pop_Variant0(__symbols); @@ -24409,11 +26173,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym9.2; - let __nt = super::__action1722::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); + let __nt = super::__action1861::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (10, 144) + (10, 153) } - pub(crate) fn __reduce395< + pub(crate) fn __reduce441< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24421,7 +26185,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "async", "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1723); + // FuncDef = Decorator+, "async", "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1862); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant24(__symbols); let __sym7 = __pop_Variant0(__symbols); @@ -24434,11 +26198,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = super::__action1723::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); + let __nt = super::__action1862::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (9, 144) + (9, 153) } - pub(crate) fn __reduce396< + pub(crate) fn __reduce442< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24446,7 +26210,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "async", "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1724); + // FuncDef = "async", "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1863); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -24457,11 +26221,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1724::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1863::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 144) + (7, 153) } - pub(crate) fn __reduce397< + pub(crate) fn __reduce443< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24469,7 +26233,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "async", "def", Identifier, Parameters, ":", Suite => ActionFn(1725); + // FuncDef = "async", "def", Identifier, Parameters, ":", Suite => ActionFn(1864); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant24(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -24479,11 +26243,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = super::__action1725::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action1864::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 144) + (6, 153) } - pub(crate) fn __reduce398< + pub(crate) fn __reduce444< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24491,7 +26255,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "async", "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1726); + // FuncDef = Decorator+, "async", "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1865); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant24(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -24503,11 +26267,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = super::__action1726::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action1865::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 144) + (8, 153) } - pub(crate) fn __reduce399< + pub(crate) fn __reduce445< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24515,7 +26279,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "async", "def", Identifier, Parameters, ":", Suite => ActionFn(1727); + // FuncDef = Decorator+, "async", "def", Identifier, Parameters, ":", Suite => ActionFn(1866); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -24526,11 +26290,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1727::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1866::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 144) + (7, 153) } - pub(crate) fn __reduce400< + pub(crate) fn __reduce446< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24538,7 +26302,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1728); + // FuncDef = "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1867); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant24(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -24550,11 +26314,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = super::__action1728::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action1867::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 144) + (8, 153) } - pub(crate) fn __reduce401< + pub(crate) fn __reduce447< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24562,7 +26326,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1729); + // FuncDef = "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1868); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -24573,11 +26337,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1729::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1868::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 144) + (7, 153) } - pub(crate) fn __reduce402< + pub(crate) fn __reduce448< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24585,7 +26349,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1730); + // FuncDef = Decorator+, "def", Identifier, TypeParams, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1869); assert!(__symbols.len() >= 9); let __sym8 = __pop_Variant24(__symbols); let __sym7 = __pop_Variant0(__symbols); @@ -24598,11 +26362,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym8.2; - let __nt = super::__action1730::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); + let __nt = super::__action1869::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (9, 144) + (9, 153) } - pub(crate) fn __reduce403< + pub(crate) fn __reduce449< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24610,7 +26374,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1731); + // FuncDef = Decorator+, "def", Identifier, Parameters, "->", Test<"all">, ":", Suite => ActionFn(1870); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant24(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -24622,11 +26386,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = super::__action1731::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action1870::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 144) + (8, 153) } - pub(crate) fn __reduce404< + pub(crate) fn __reduce450< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24634,7 +26398,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1732); + // FuncDef = "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1871); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant24(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -24644,11 +26408,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = super::__action1732::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action1871::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 144) + (6, 153) } - pub(crate) fn __reduce405< + pub(crate) fn __reduce451< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24656,7 +26420,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = "def", Identifier, Parameters, ":", Suite => ActionFn(1733); + // FuncDef = "def", Identifier, Parameters, ":", Suite => ActionFn(1872); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant24(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -24665,11 +26429,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1733::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1872::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 144) + (5, 153) } - pub(crate) fn __reduce406< + pub(crate) fn __reduce452< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24677,7 +26441,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1734); + // FuncDef = Decorator+, "def", Identifier, TypeParams, Parameters, ":", Suite => ActionFn(1873); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -24688,11 +26452,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1734::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1873::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 144) + (7, 153) } - pub(crate) fn __reduce407< + pub(crate) fn __reduce453< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24700,7 +26464,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FuncDef = Decorator+, "def", Identifier, Parameters, ":", Suite => ActionFn(1735); + // FuncDef = Decorator+, "def", Identifier, Parameters, ":", Suite => ActionFn(1874); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant24(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -24710,11 +26474,11 @@ mod __parse__Top { let __sym0 = __pop_Variant58(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = super::__action1735::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action1874::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 144) + (6, 153) } - pub(crate) fn __reduce408< + pub(crate) fn __reduce454< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24722,17 +26486,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FunctionArgument = NamedExpressionTest, CompFor => ActionFn(1522); + // FunctionArgument = NamedExpressionTest, CompFor => ActionFn(1657); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant53(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1522::<>(mode, __sym0, __sym1); + let __nt = super::__action1657::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant30(__nt), __end)); - (2, 145) + (2, 154) } - pub(crate) fn __reduce409< + pub(crate) fn __reduce455< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24740,15 +26504,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FunctionArgument = NamedExpressionTest => ActionFn(1523); + // FunctionArgument = NamedExpressionTest => ActionFn(1658); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1523::<>(mode, __sym0); + let __nt = super::__action1658::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant30(__nt), __end)); - (1, 145) + (1, 154) } - pub(crate) fn __reduce410< + pub(crate) fn __reduce456< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24756,18 +26520,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FunctionArgument = Identifier, "=", Test<"all"> => ActionFn(1285); + // FunctionArgument = Identifier, "=", Test<"all"> => ActionFn(1415); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1285::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1415::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant30(__nt), __end)); - (3, 145) + (3, 154) } - pub(crate) fn __reduce411< + pub(crate) fn __reduce457< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24775,17 +26539,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FunctionArgument = "*", Test<"all"> => ActionFn(1286); + // FunctionArgument = "*", Test<"all"> => ActionFn(1416); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1286::<>(mode, __sym0, __sym1); + let __nt = super::__action1416::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant30(__nt), __end)); - (2, 145) + (2, 154) } - pub(crate) fn __reduce412< + pub(crate) fn __reduce458< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24793,17 +26557,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FunctionArgument = "**", Test<"all"> => ActionFn(1287); + // FunctionArgument = "**", Test<"all"> => ActionFn(1417); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1287::<>(mode, __sym0, __sym1); + let __nt = super::__action1417::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant30(__nt), __end)); - (2, 145) + (2, 154) } - pub(crate) fn __reduce413< + pub(crate) fn __reduce459< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24811,15 +26575,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FunctionArgument? = FunctionArgument => ActionFn(437); + // FunctionArgument? = FunctionArgument => ActionFn(446); let __sym0 = __pop_Variant30(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action437::<>(mode, __sym0); + let __nt = super::__action446::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant67(__nt), __end)); - (1, 146) + (1, 155) } - pub(crate) fn __reduce414< + pub(crate) fn __reduce460< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24827,14 +26591,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // FunctionArgument? = => ActionFn(438); + // FunctionArgument? = => ActionFn(447); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action438::<>(mode, &__start, &__end); + let __nt = super::__action447::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant67(__nt), __end)); - (0, 146) + (0, 155) } - pub(crate) fn __reduce415< + pub(crate) fn __reduce461< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24842,17 +26606,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // GenericList = OneOrMore, "," => ActionFn(1288); + // GenericList = OneOrMore, "," => ActionFn(1418); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1288::<>(mode, __sym0, __sym1); + let __nt = super::__action1418::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 147) + (2, 156) } - pub(crate) fn __reduce416< + pub(crate) fn __reduce462< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24860,15 +26624,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // GenericList = OneOrMore => ActionFn(1289); + // GenericList = OneOrMore => ActionFn(1419); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1289::<>(mode, __sym0); + let __nt = super::__action1419::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 147) + (1, 156) } - pub(crate) fn __reduce417< + pub(crate) fn __reduce463< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24876,17 +26640,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // GenericList = OneOrMore, "," => ActionFn(1290); + // GenericList = OneOrMore, "," => ActionFn(1420); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1290::<>(mode, __sym0, __sym1); + let __nt = super::__action1420::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 148) + (2, 157) } - pub(crate) fn __reduce418< + pub(crate) fn __reduce464< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24894,15 +26658,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // GenericList = OneOrMore => ActionFn(1291); + // GenericList = OneOrMore => ActionFn(1421); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1291::<>(mode, __sym0); + let __nt = super::__action1421::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 148) + (1, 157) } - pub(crate) fn __reduce419< + pub(crate) fn __reduce465< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24910,17 +26674,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // GlobalStatement = "global", OneOrMore => ActionFn(1292); + // GlobalStatement = "global", OneOrMore => ActionFn(1422); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant77(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1292::<>(mode, __sym0, __sym1); + let __nt = super::__action1422::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 149) + (2, 158) } - pub(crate) fn __reduce420< + pub(crate) fn __reduce466< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24928,17 +26692,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Guard = "if", NamedExpressionTest => ActionFn(87); + // Guard = "if", NamedExpressionTest => ActionFn(89); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action87::<>(mode, __sym0, __sym1); + let __nt = super::__action89::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 150) + (2, 159) } - pub(crate) fn __reduce421< + pub(crate) fn __reduce468< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24946,15 +26710,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Identifier = name => ActionFn(1293); + // Identifier = name => ActionFn(1424); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1293::<>(mode, __sym0); + let __nt = super::__action1424::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant22(__nt), __end)); - (1, 151) + (1, 161) } - pub(crate) fn __reduce422< + pub(crate) fn __reduce469< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24962,7 +26726,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // IfStatement = "if", NamedExpressionTest, ":", Suite, "else", ":", Suite => ActionFn(1127); + // IfStatement = "if", NamedExpressionTest, ":", Suite, "else", ":", Suite => ActionFn(1216); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -24973,11 +26737,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1127::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1216::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 152) + (7, 162) } - pub(crate) fn __reduce423< + pub(crate) fn __reduce470< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -24985,7 +26749,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // IfStatement = "if", NamedExpressionTest, ":", Suite => ActionFn(1128); + // IfStatement = "if", NamedExpressionTest, ":", Suite => ActionFn(1217); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant24(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -24993,11 +26757,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1128::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1217::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 152) + (4, 162) } - pub(crate) fn __reduce424< + pub(crate) fn __reduce471< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -25005,7 +26769,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // IfStatement = "if", NamedExpressionTest, ":", Suite, (<@L> "elif" ":" )+, "else", ":", Suite => ActionFn(1129); + // IfStatement = "if", NamedExpressionTest, ":", Suite, (<@L> "elif" ":" )+, "else", ":", Suite => ActionFn(1218); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant24(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -25017,703 +26781,9 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = super::__action1129::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action1218::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 152) - } - pub(crate) fn __reduce425< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // IfStatement = "if", NamedExpressionTest, ":", Suite, (<@L> "elif" ":" )+ => ActionFn(1130); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant27(__symbols); - let __sym3 = __pop_Variant24(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1130::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 152) - } - pub(crate) fn __reduce426< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsAlias = DottedName, "as", Identifier => ActionFn(1294); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1294::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant68(__nt), __end)); - (3, 153) - } - pub(crate) fn __reduce427< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsAlias = DottedName => ActionFn(1295); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1295::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant68(__nt), __end)); - (1, 153) - } - pub(crate) fn __reduce428< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsAlias = Identifier, "as", Identifier => ActionFn(1296); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1296::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant68(__nt), __end)); - (3, 154) - } - pub(crate) fn __reduce429< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsAlias = Identifier => ActionFn(1297); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1297::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant68(__nt), __end)); - (1, 154) - } - pub(crate) fn __reduce430< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsNames = OneOrMore> => ActionFn(1298); - let __sym0 = __pop_Variant69(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1298::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (1, 155) - } - pub(crate) fn __reduce431< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsNames = "(", OneOrMore>, ",", ")" => ActionFn(1299); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant69(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1299::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (4, 155) - } - pub(crate) fn __reduce432< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsNames = "(", OneOrMore>, ")" => ActionFn(1300); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant69(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1300::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (3, 155) - } - pub(crate) fn __reduce433< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsNames = "*" => ActionFn(1301); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1301::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (1, 155) - } - pub(crate) fn __reduce434< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportDots = "..." => ActionFn(63); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action63::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant70(__nt), __end)); - (1, 156) - } - pub(crate) fn __reduce435< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportDots = "." => ActionFn(64); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action64::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant70(__nt), __end)); - (1, 156) - } - pub(crate) fn __reduce436< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportDots* = => ActionFn(363); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action363::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (0, 157) - } - pub(crate) fn __reduce437< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportDots* = ImportDots+ => ActionFn(364); - let __sym0 = __pop_Variant71(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action364::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (1, 157) - } - pub(crate) fn __reduce438< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportDots+ = ImportDots => ActionFn(361); - let __sym0 = __pop_Variant70(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action361::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (1, 158) - } - pub(crate) fn __reduce439< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportDots+ = ImportDots+, ImportDots => ActionFn(362); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant70(__symbols); - let __sym0 = __pop_Variant71(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action362::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (2, 158) - } - pub(crate) fn __reduce440< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportFromLocation = DottedName => ActionFn(1554); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1554::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant72(__nt), __end)); - (1, 159) - } - pub(crate) fn __reduce441< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportFromLocation = ImportDots+, DottedName => ActionFn(1555); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant22(__symbols); - let __sym0 = __pop_Variant71(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1555::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant72(__nt), __end)); - (2, 159) - } - pub(crate) fn __reduce442< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportFromLocation = ImportDots+ => ActionFn(62); - let __sym0 = __pop_Variant71(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action62::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant72(__nt), __end)); - (1, 159) - } - pub(crate) fn __reduce443< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportStatement = "import", OneOrMore> => ActionFn(1302); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant69(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1302::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 160) - } - pub(crate) fn __reduce444< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportStatement = "from", ImportFromLocation, "import", ImportAsNames => ActionFn(1303); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant69(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant72(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1303::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 160) - } - pub(crate) fn __reduce445< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // KwargParameter = "**", DoubleStarTypedParameter => ActionFn(1544); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1544::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (2, 161) - } - pub(crate) fn __reduce446< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // KwargParameter = "**" => ActionFn(1545); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1545::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (1, 161) - } - pub(crate) fn __reduce447< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // KwargParameter = "**", StarUntypedParameter => ActionFn(993); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant63(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action993::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (2, 162) - } - pub(crate) fn __reduce448< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // KwargParameter = "**" => ActionFn(994); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action994::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (1, 162) - } - pub(crate) fn __reduce453< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ListLiteralValues = OneOrMore, "," => ActionFn(607); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action607::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (2, 166) - } - pub(crate) fn __reduce454< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ListLiteralValues = OneOrMore => ActionFn(608); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action608::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (1, 166) - } - pub(crate) fn __reduce455< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ListLiteralValues? = ListLiteralValues => ActionFn(547); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action547::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant33(__nt), __end)); - (1, 167) - } - pub(crate) fn __reduce456< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ListLiteralValues? = => ActionFn(548); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action548::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant33(__nt), __end)); - (0, 167) - } - pub(crate) fn __reduce457< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // LiteralPattern = "None" => ActionFn(1307); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1307::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 168) - } - pub(crate) fn __reduce458< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // LiteralPattern = "True" => ActionFn(1308); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1308::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 168) - } - pub(crate) fn __reduce459< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // LiteralPattern = "False" => ActionFn(1309); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1309::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 168) - } - pub(crate) fn __reduce460< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // LiteralPattern = ConstantExpr => ActionFn(1310); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1310::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 168) - } - pub(crate) fn __reduce461< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // LiteralPattern = AddOpExpr => ActionFn(1311); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1311::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 168) - } - pub(crate) fn __reduce463< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingKey = ConstantExpr => ActionFn(124); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action124::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 169) - } - pub(crate) fn __reduce464< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingKey = AddOpExpr => ActionFn(125); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action125::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 169) - } - pub(crate) fn __reduce465< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingKey = MatchNameOrAttr => ActionFn(126); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action126::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 169) - } - pub(crate) fn __reduce466< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingKey = "None" => ActionFn(1313); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1313::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 169) - } - pub(crate) fn __reduce467< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingKey = "True" => ActionFn(1314); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1314::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 169) - } - pub(crate) fn __reduce468< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingKey = "False" => ActionFn(1315); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1315::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 169) - } - pub(crate) fn __reduce470< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingPattern = "{", "}" => ActionFn(1316); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1316::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (2, 170) - } - pub(crate) fn __reduce471< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MappingPattern = "{", OneOrMore, ",", "}" => ActionFn(1317); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant79(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1317::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 170) + (8, 162) } pub(crate) fn __reduce472< >( @@ -25723,16 +26793,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MappingPattern = "{", OneOrMore, "}" => ActionFn(1318); - assert!(__symbols.len() >= 3); + // IfStatement = "if", NamedExpressionTest, ":", Suite, (<@L> "elif" ":" )+ => ActionFn(1219); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant27(__symbols); + let __sym3 = __pop_Variant24(__symbols); let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant79(__symbols); + let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1318::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (3, 170) + let __end = __sym4.2; + let __nt = super::__action1219::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (5, 162) } pub(crate) fn __reduce473< >( @@ -25742,18 +26814,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MappingPattern = "{", "**", Identifier, ",", "}" => ActionFn(1319); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); + // ImportAsAlias = DottedName, "as", Identifier => ActionFn(1425); + assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1319::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (5, 170) + let __end = __sym2.2; + let __nt = super::__action1425::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant68(__nt), __end)); + (3, 163) } pub(crate) fn __reduce474< >( @@ -25763,17 +26833,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MappingPattern = "{", "**", Identifier, "}" => ActionFn(1320); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ImportAsAlias = DottedName => ActionFn(1426); + let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1320::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 170) + let __end = __sym0.2; + let __nt = super::__action1426::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant68(__nt), __end)); + (1, 163) } pub(crate) fn __reduce475< >( @@ -25783,20 +26849,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MappingPattern = "{", OneOrMore, ",", "**", Identifier, ",", "}" => ActionFn(1321); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant22(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant79(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ImportAsAlias = Identifier, "as", Identifier => ActionFn(1427); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1321::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (7, 170) + let __end = __sym2.2; + let __nt = super::__action1427::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant68(__nt), __end)); + (3, 164) } pub(crate) fn __reduce476< >( @@ -25806,19 +26868,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MappingPattern = "{", OneOrMore, ",", "**", Identifier, "}" => ActionFn(1322); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant22(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant79(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ImportAsAlias = Identifier => ActionFn(1428); + let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1322::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (6, 170) + let __end = __sym0.2; + let __nt = super::__action1428::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant68(__nt), __end)); + (1, 164) } pub(crate) fn __reduce477< >( @@ -25828,18 +26884,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchCase = "case", Patterns, Guard, ":", Suite => ActionFn(1495); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant24(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant34(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ImportAsNames = OneOrMore> => ActionFn(1429); + let __sym0 = __pop_Variant69(__symbols); let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1495::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant73(__nt), __end)); - (5, 171) + let __end = __sym0.2; + let __nt = super::__action1429::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (1, 165) } pub(crate) fn __reduce478< >( @@ -25849,17 +26900,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchCase = "case", Patterns, ":", Suite => ActionFn(1496); + // ImportAsNames = "(", OneOrMore>, ",", ")" => ActionFn(1430); assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant24(__symbols); + let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant69(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1496::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant73(__nt), __end)); - (4, 171) + let __nt = super::__action1430::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (4, 165) } pub(crate) fn __reduce479< >( @@ -25869,13 +26920,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchCase+ = MatchCase => ActionFn(346); - let __sym0 = __pop_Variant73(__symbols); + // ImportAsNames = "(", OneOrMore>, ")" => ActionFn(1431); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant69(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action346::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant74(__nt), __end)); - (1, 172) + let __end = __sym2.2; + let __nt = super::__action1431::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (3, 165) } pub(crate) fn __reduce480< >( @@ -25885,15 +26939,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchCase+ = MatchCase+, MatchCase => ActionFn(347); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant73(__symbols); - let __sym0 = __pop_Variant74(__symbols); + // ImportAsNames = "*" => ActionFn(1432); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action347::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant74(__nt), __end)); - (2, 172) + let __end = __sym0.2; + let __nt = super::__action1432::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (1, 165) } pub(crate) fn __reduce481< >( @@ -25903,16 +26955,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchKeywordEntry = Identifier, "=", Pattern => ActionFn(136); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant34(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); + // ImportDots = "..." => ActionFn(64); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action136::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant75(__nt), __end)); - (3, 173) + let __end = __sym0.2; + let __nt = super::__action64::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant70(__nt), __end)); + (1, 166) } pub(crate) fn __reduce482< >( @@ -25922,16 +26971,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchMappingEntry = MappingKey, ":", Pattern => ActionFn(131); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant34(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // ImportDots = "." => ActionFn(65); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action131::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant76(__nt), __end)); - (3, 174) + let __end = __sym0.2; + let __nt = super::__action65::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant70(__nt), __end)); + (1, 166) } pub(crate) fn __reduce483< >( @@ -25941,13 +26987,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchName = Identifier => ActionFn(1323); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1323::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 175) + // ImportDots* = => ActionFn(370); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action370::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant71(__nt), __end)); + (0, 167) } pub(crate) fn __reduce484< >( @@ -25957,16 +27002,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchNameOrAttr = MatchName, ".", Identifier => ActionFn(1324); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // ImportDots* = ImportDots+ => ActionFn(371); + let __sym0 = __pop_Variant71(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1324::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 176) + let __end = __sym0.2; + let __nt = super::__action371::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant71(__nt), __end)); + (1, 167) } pub(crate) fn __reduce485< >( @@ -25976,16 +27018,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchNameOrAttr = MatchNameOrAttr, ".", Identifier => ActionFn(1325); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); + // ImportDots+ = ImportDots => ActionFn(368); + let __sym0 = __pop_Variant70(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1325::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 176) + let __end = __sym0.2; + let __nt = super::__action368::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant71(__nt), __end)); + (1, 168) } pub(crate) fn __reduce486< >( @@ -25995,20 +27034,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchStatement = "match", TestOrStarNamedExpr, ":", "\n", Indent, MatchCase+, Dedent => ActionFn(843); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant0(__symbols); - let __sym5 = __pop_Variant74(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); + // ImportDots+ = ImportDots+, ImportDots => ActionFn(369); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant70(__symbols); + let __sym0 = __pop_Variant71(__symbols); let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action843::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 177) + let __end = __sym1.2; + let __nt = super::__action369::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant71(__nt), __end)); + (2, 168) } pub(crate) fn __reduce487< >( @@ -26018,7 +27052,737 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchStatement = "match", TestOrStarNamedExpr, ",", ":", "\n", Indent, MatchCase+, Dedent => ActionFn(844); + // ImportFromLocation = DottedName => ActionFn(1691); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1691::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant72(__nt), __end)); + (1, 169) + } + pub(crate) fn __reduce488< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ImportFromLocation = ImportDots+, DottedName => ActionFn(1692); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant22(__symbols); + let __sym0 = __pop_Variant71(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1692::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant72(__nt), __end)); + (2, 169) + } + pub(crate) fn __reduce489< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ImportFromLocation = ImportDots+ => ActionFn(63); + let __sym0 = __pop_Variant71(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action63::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant72(__nt), __end)); + (1, 169) + } + pub(crate) fn __reduce490< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ImportStatement = "import", OneOrMore> => ActionFn(1433); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant69(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1433::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (2, 170) + } + pub(crate) fn __reduce491< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ImportStatement = "from", ImportFromLocation, "import", ImportAsNames => ActionFn(1434); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant69(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant72(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1434::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (4, 170) + } + pub(crate) fn __reduce492< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // KwargParameter = "**", DoubleStarTypedParameter => ActionFn(1681); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1681::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant8(__nt), __end)); + (2, 171) + } + pub(crate) fn __reduce493< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // KwargParameter = "**" => ActionFn(1682); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1682::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant8(__nt), __end)); + (1, 171) + } + pub(crate) fn __reduce494< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // KwargParameter = "**", StarUntypedParameter => ActionFn(1076); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant63(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1076::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant8(__nt), __end)); + (2, 172) + } + pub(crate) fn __reduce495< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // KwargParameter = "**" => ActionFn(1077); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1077::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant8(__nt), __end)); + (1, 172) + } + pub(crate) fn __reduce500< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ListLiteralValues = OneOrMore, "," => ActionFn(657); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action657::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (2, 176) + } + pub(crate) fn __reduce501< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ListLiteralValues = OneOrMore => ActionFn(658); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action658::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (1, 176) + } + pub(crate) fn __reduce502< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ListLiteralValues? = ListLiteralValues => ActionFn(591); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action591::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant33(__nt), __end)); + (1, 177) + } + pub(crate) fn __reduce503< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ListLiteralValues? = => ActionFn(592); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action592::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant33(__nt), __end)); + (0, 177) + } + pub(crate) fn __reduce504< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // LiteralPattern = "None" => ActionFn(1438); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1438::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 178) + } + pub(crate) fn __reduce505< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // LiteralPattern = "True" => ActionFn(1439); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1439::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 178) + } + pub(crate) fn __reduce506< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // LiteralPattern = "False" => ActionFn(1440); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1440::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 178) + } + pub(crate) fn __reduce507< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // LiteralPattern = ConstantExpr => ActionFn(1441); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1441::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 178) + } + pub(crate) fn __reduce508< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // LiteralPattern = AddOpExpr => ActionFn(1442); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1442::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 178) + } + pub(crate) fn __reduce510< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingKey = ConstantExpr => ActionFn(126); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action126::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 179) + } + pub(crate) fn __reduce511< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingKey = AddOpExpr => ActionFn(127); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action127::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 179) + } + pub(crate) fn __reduce512< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingKey = MatchNameOrAttr => ActionFn(128); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action128::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 179) + } + pub(crate) fn __reduce513< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingKey = "None" => ActionFn(1444); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1444::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 179) + } + pub(crate) fn __reduce514< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingKey = "True" => ActionFn(1445); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1445::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 179) + } + pub(crate) fn __reduce515< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingKey = "False" => ActionFn(1446); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1446::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 179) + } + pub(crate) fn __reduce517< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingPattern = "{", "}" => ActionFn(1447); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1447::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (2, 180) + } + pub(crate) fn __reduce518< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingPattern = "{", OneOrMore, ",", "}" => ActionFn(1448); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant79(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1448::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (4, 180) + } + pub(crate) fn __reduce519< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingPattern = "{", OneOrMore, "}" => ActionFn(1449); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant79(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1449::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (3, 180) + } + pub(crate) fn __reduce520< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingPattern = "{", "**", Identifier, ",", "}" => ActionFn(1450); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action1450::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (5, 180) + } + pub(crate) fn __reduce521< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingPattern = "{", "**", Identifier, "}" => ActionFn(1451); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1451::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (4, 180) + } + pub(crate) fn __reduce522< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingPattern = "{", OneOrMore, ",", "**", Identifier, ",", "}" => ActionFn(1452); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant22(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant79(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = super::__action1452::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (7, 180) + } + pub(crate) fn __reduce523< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MappingPattern = "{", OneOrMore, ",", "**", Identifier, "}" => ActionFn(1453); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant22(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant79(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = super::__action1453::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (6, 180) + } + pub(crate) fn __reduce524< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchCase = "case", Patterns, Guard, ":", Suite => ActionFn(1630); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant24(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant34(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action1630::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant73(__nt), __end)); + (5, 181) + } + pub(crate) fn __reduce525< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchCase = "case", Patterns, ":", Suite => ActionFn(1631); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant24(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant34(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1631::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant73(__nt), __end)); + (4, 181) + } + pub(crate) fn __reduce526< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchCase+ = MatchCase => ActionFn(348); + let __sym0 = __pop_Variant73(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action348::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant74(__nt), __end)); + (1, 182) + } + pub(crate) fn __reduce527< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchCase+ = MatchCase+, MatchCase => ActionFn(349); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant73(__symbols); + let __sym0 = __pop_Variant74(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action349::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant74(__nt), __end)); + (2, 182) + } + pub(crate) fn __reduce528< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchKeywordEntry = Identifier, "=", Pattern => ActionFn(138); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action138::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant75(__nt), __end)); + (3, 183) + } + pub(crate) fn __reduce529< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchMappingEntry = MappingKey, ":", Pattern => ActionFn(133); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action133::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant76(__nt), __end)); + (3, 184) + } + pub(crate) fn __reduce530< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchName = Identifier => ActionFn(1454); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1454::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 185) + } + pub(crate) fn __reduce531< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchNameOrAttr = MatchName, ".", Identifier => ActionFn(1455); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1455::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 186) + } + pub(crate) fn __reduce532< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchNameOrAttr = MatchNameOrAttr, ".", Identifier => ActionFn(1456); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1456::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 186) + } + pub(crate) fn __reduce533< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchStatement = "match", TestOrStarNamedExpr, ":", "\n", Indent, MatchCase+, Dedent => ActionFn(922); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant0(__symbols); + let __sym5 = __pop_Variant74(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = super::__action922::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (7, 187) + } + pub(crate) fn __reduce534< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // MatchStatement = "match", TestOrStarNamedExpr, ",", ":", "\n", Indent, MatchCase+, Dedent => ActionFn(923); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant74(__symbols); @@ -26030,11 +27794,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = super::__action844::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action923::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 177) + (8, 187) } - pub(crate) fn __reduce488< + pub(crate) fn __reduce535< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26042,7 +27806,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchStatement = "match", TwoOrMore, ",", ":", "\n", Indent, MatchCase+, Dedent => ActionFn(845); + // MatchStatement = "match", TwoOrMore, ",", ":", "\n", Indent, MatchCase+, Dedent => ActionFn(924); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant74(__symbols); @@ -26054,11 +27818,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym7.2; - let __nt = super::__action845::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action924::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 177) + (8, 187) } - pub(crate) fn __reduce489< + pub(crate) fn __reduce536< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26066,7 +27830,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // MatchStatement = "match", TwoOrMore, ":", "\n", Indent, MatchCase+, Dedent => ActionFn(846); + // MatchStatement = "match", TwoOrMore, ":", "\n", Indent, MatchCase+, Dedent => ActionFn(925); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant74(__symbols); @@ -26077,828 +27841,9 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action846::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action925::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 177) - } - pub(crate) fn __reduce490< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MulOp = "*" => ActionFn(196); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action196::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 178) - } - pub(crate) fn __reduce491< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MulOp = "/" => ActionFn(197); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action197::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 178) - } - pub(crate) fn __reduce492< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MulOp = "//" => ActionFn(198); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action198::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 178) - } - pub(crate) fn __reduce493< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MulOp = "%" => ActionFn(199); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action199::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 178) - } - pub(crate) fn __reduce494< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // MulOp = "@" => ActionFn(200); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action200::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 178) - } - pub(crate) fn __reduce495< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NamedExpression = Identifier, ":=", Test<"all"> => ActionFn(1326); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1326::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 179) - } - pub(crate) fn __reduce496< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NamedExpressionTest = NamedExpression => ActionFn(178); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action178::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 180) - } - pub(crate) fn __reduce497< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NamedExpressionTest = Test<"all"> => ActionFn(179); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action179::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 180) - } - pub(crate) fn __reduce498< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NamedOrStarExpr = NamedExpression => ActionFn(35); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action35::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 181) - } - pub(crate) fn __reduce499< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NamedOrStarExpr = StarExpr => ActionFn(36); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action36::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 181) - } - pub(crate) fn __reduce500< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NonlocalStatement = "nonlocal", OneOrMore => ActionFn(1327); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant77(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1327::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 182) - } - pub(crate) fn __reduce501< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NotTest<"all"> = "not", NotTest<"all"> => ActionFn(1328); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1328::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 183) - } - pub(crate) fn __reduce502< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NotTest<"all"> = Comparison<"all"> => ActionFn(448); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action448::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 183) - } - pub(crate) fn __reduce503< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NotTest<"no-withitems"> = "not", NotTest<"all"> => ActionFn(1329); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1329::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 184) - } - pub(crate) fn __reduce504< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // NotTest<"no-withitems"> = Comparison<"no-withitems"> => ActionFn(493); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action493::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 184) - } - pub(crate) fn __reduce505< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = DictElement => ActionFn(250); - let __sym0 = __pop_Variant59(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action250::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant61(__nt), __end)); - (1, 185) - } - pub(crate) fn __reduce506< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", DictElement => ActionFn(251); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant59(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant61(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action251::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant61(__nt), __end)); - (3, 185) - } - pub(crate) fn __reduce507< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = ExpressionOrStarExpression => ActionFn(245); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action245::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (1, 186) - } - pub(crate) fn __reduce508< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", ExpressionOrStarExpression => ActionFn(246); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action246::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 186) - } - pub(crate) fn __reduce509< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = Identifier => ActionFn(351); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action351::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant77(__nt), __end)); - (1, 187) - } - pub(crate) fn __reduce510< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", Identifier => ActionFn(352); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant77(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action352::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant77(__nt), __end)); - (3, 187) - } - pub(crate) fn __reduce511< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = DottedName, "as", Identifier => ActionFn(1546); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1546::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (3, 188) - } - pub(crate) fn __reduce512< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = DottedName => ActionFn(1547); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1547::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (1, 188) - } - pub(crate) fn __reduce513< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = OneOrMore>, ",", DottedName, "as", Identifier => ActionFn(1548); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant22(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant69(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1548::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (5, 188) - } - pub(crate) fn __reduce514< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = OneOrMore>, ",", DottedName => ActionFn(1549); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant69(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1549::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (3, 188) - } - pub(crate) fn __reduce515< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = Identifier, "as", Identifier => ActionFn(1550); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1550::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (3, 189) - } - pub(crate) fn __reduce516< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = Identifier => ActionFn(1551); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1551::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (1, 189) - } - pub(crate) fn __reduce517< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = OneOrMore>, ",", Identifier, "as", Identifier => ActionFn(1552); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant22(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant69(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1552::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (5, 189) - } - pub(crate) fn __reduce518< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = OneOrMore>, ",", Identifier => ActionFn(1553); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant69(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1553::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (3, 189) - } - pub(crate) fn __reduce519< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = MatchKeywordEntry => ActionFn(324); - let __sym0 = __pop_Variant75(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action324::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant78(__nt), __end)); - (1, 190) - } - pub(crate) fn __reduce520< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", MatchKeywordEntry => ActionFn(325); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant75(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant78(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action325::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant78(__nt), __end)); - (3, 190) - } - pub(crate) fn __reduce521< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = MatchMappingEntry => ActionFn(328); - let __sym0 = __pop_Variant76(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action328::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant79(__nt), __end)); - (1, 191) - } - pub(crate) fn __reduce522< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", MatchMappingEntry => ActionFn(329); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant76(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant79(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action329::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant79(__nt), __end)); - (3, 191) - } - pub(crate) fn __reduce523< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = ParameterDef => ActionFn(462); - let __sym0 = __pop_Variant10(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action462::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant80(__nt), __end)); - (1, 192) - } - pub(crate) fn __reduce524< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = OneOrMore>, ",", ParameterDef => ActionFn(463); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant10(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action463::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant80(__nt), __end)); - (3, 192) - } - pub(crate) fn __reduce525< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = ParameterDef => ActionFn(451); - let __sym0 = __pop_Variant10(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action451::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant80(__nt), __end)); - (1, 193) - } - pub(crate) fn __reduce526< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = OneOrMore>, ",", ParameterDef => ActionFn(452); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant10(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action452::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant80(__nt), __end)); - (3, 193) - } - pub(crate) fn __reduce527< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = Pattern => ActionFn(326); - let __sym0 = __pop_Variant34(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action326::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (1, 194) - } - pub(crate) fn __reduce528< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", Pattern => ActionFn(327); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant34(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant52(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action327::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (3, 194) - } - pub(crate) fn __reduce529< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = Test<"all"> => ActionFn(288); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action288::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (1, 195) - } - pub(crate) fn __reduce530< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore> = OneOrMore>, ",", Test<"all"> => ActionFn(289); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action289::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 195) - } - pub(crate) fn __reduce531< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = TestOrStarExpr => ActionFn(428); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action428::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (1, 196) - } - pub(crate) fn __reduce532< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", TestOrStarExpr => ActionFn(429); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action429::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 196) - } - pub(crate) fn __reduce533< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = TestOrStarNamedExpr => ActionFn(252); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action252::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (1, 197) - } - pub(crate) fn __reduce534< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", TestOrStarNamedExpr => ActionFn(253); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action253::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 197) - } - pub(crate) fn __reduce535< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = TypeParam => ActionFn(264); - let __sym0 = __pop_Variant90(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action264::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant81(__nt), __end)); - (1, 198) - } - pub(crate) fn __reduce536< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // OneOrMore = OneOrMore, ",", TypeParam => ActionFn(265); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant90(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant81(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action265::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant81(__nt), __end)); - (3, 198) + (7, 187) } pub(crate) fn __reduce537< >( @@ -26908,13 +27853,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // OrPattern = ClosedPattern => ActionFn(94); - let __sym0 = __pop_Variant34(__symbols); + // MulOp = "*" => ActionFn(198); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action94::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 199) + let __nt = super::__action198::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 188) } pub(crate) fn __reduce538< >( @@ -26924,13 +27869,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // OrPattern = TwoOrMore => ActionFn(1330); - let __sym0 = __pop_Variant52(__symbols); + // MulOp = "/" => ActionFn(199); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1330::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 199) + let __nt = super::__action199::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 188) } pub(crate) fn __reduce539< >( @@ -26940,15 +27885,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // OrTest<"all"> = (> "or")+, AndTest<"all"> => ActionFn(1331); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); + // MulOp = "//" => ActionFn(200); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1331::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 200) + let __end = __sym0.2; + let __nt = super::__action200::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 188) } pub(crate) fn __reduce540< >( @@ -26958,13 +27901,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // OrTest<"all"> = AndTest<"all"> => ActionFn(241); - let __sym0 = __pop_Variant14(__symbols); + // MulOp = "%" => ActionFn(201); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action241::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 200) + let __nt = super::__action201::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 188) } pub(crate) fn __reduce541< >( @@ -26974,15 +27917,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // OrTest<"no-withitems"> = (> "or")+, AndTest<"all"> => ActionFn(1332); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant16(__symbols); + // MulOp = "@" => ActionFn(202); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1332::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 201) + let __end = __sym0.2; + let __nt = super::__action202::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant48(__nt), __end)); + (1, 188) } pub(crate) fn __reduce542< >( @@ -26992,13 +27933,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // OrTest<"no-withitems"> = AndTest<"no-withitems"> => ActionFn(476); - let __sym0 = __pop_Variant14(__symbols); + // NamedExpression = Identifier, ":=", Test<"all"> => ActionFn(1457); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action476::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action1457::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 201) + (3, 189) } pub(crate) fn __reduce543< >( @@ -27008,13 +27952,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDef = TypedParameter => ActionFn(469); - let __sym0 = __pop_Variant10(__symbols); + // NamedExpressionTest = NamedExpression => ActionFn(180); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action469::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant10(__nt), __end)); - (1, 202) + let __nt = super::__action180::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 190) } pub(crate) fn __reduce544< >( @@ -27024,16 +27968,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDef = TypedParameter, "=", Test<"all"> => ActionFn(1333); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant10(__symbols); + // NamedExpressionTest = Test<"all"> => ActionFn(181); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1333::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant10(__nt), __end)); - (3, 202) + let __end = __sym0.2; + let __nt = super::__action181::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 190) } pub(crate) fn __reduce545< >( @@ -27043,13 +27984,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDef = UntypedParameter => ActionFn(458); - let __sym0 = __pop_Variant10(__symbols); + // NamedOrStarExpr = NamedExpression => ActionFn(36); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action458::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant10(__nt), __end)); - (1, 203) + let __nt = super::__action36::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 191) } pub(crate) fn __reduce546< >( @@ -27059,16 +28000,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDef = UntypedParameter, "=", Test<"all"> => ActionFn(1334); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant10(__symbols); + // NamedOrStarExpr = StarExpr => ActionFn(37); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1334::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant10(__nt), __end)); - (3, 203) + let __end = __sym0.2; + let __nt = super::__action37::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 191) } pub(crate) fn __reduce547< >( @@ -27078,13 +28016,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDefs = OneOrMore> => ActionFn(416); - let __sym0 = __pop_Variant80(__symbols); + // NonlocalStatement = "nonlocal", OneOrMore => ActionFn(1458); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant77(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action416::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant82(__nt), __end)); - (1, 204) + let __end = __sym1.2; + let __nt = super::__action1458::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (2, 192) } pub(crate) fn __reduce548< >( @@ -27094,16 +28034,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDefs = OneOrMore>, ",", "/" => ActionFn(675); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); + // NotTest<"all"> = "not", NotTest<"all"> => ActionFn(1459); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action675::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant82(__nt), __end)); - (3, 204) + let __end = __sym1.2; + let __nt = super::__action1459::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 193) } pub(crate) fn __reduce549< >( @@ -27113,17 +28052,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDefs = OneOrMore>, ",", "/", ("," >)+ => ActionFn(676); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant11(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); + // NotTest<"all"> = Comparison<"all"> => ActionFn(457); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action676::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant82(__nt), __end)); - (4, 204) + let __end = __sym0.2; + let __nt = super::__action457::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 193) } pub(crate) fn __reduce550< >( @@ -27133,13 +28068,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDefs = OneOrMore> => ActionFn(424); - let __sym0 = __pop_Variant80(__symbols); + // NotTest<"no-withitems"> = "not", NotTest<"all"> => ActionFn(1460); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action424::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant82(__nt), __end)); - (1, 205) + let __end = __sym1.2; + let __nt = super::__action1460::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 194) } pub(crate) fn __reduce551< >( @@ -27149,16 +28086,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDefs = OneOrMore>, ",", "/" => ActionFn(683); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant80(__symbols); + // NotTest<"no-withitems"> = Comparison<"no-withitems"> => ActionFn(504); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action683::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant82(__nt), __end)); - (3, 205) + let __end = __sym0.2; + let __nt = super::__action504::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 194) } pub(crate) fn __reduce552< >( @@ -27168,7 +28102,782 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterDefs = OneOrMore>, ",", "/", ("," >)+ => ActionFn(684); + // OneOrMore = DictElement => ActionFn(252); + let __sym0 = __pop_Variant59(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action252::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant61(__nt), __end)); + (1, 195) + } + pub(crate) fn __reduce553< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", DictElement => ActionFn(253); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant59(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant61(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action253::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant61(__nt), __end)); + (3, 195) + } + pub(crate) fn __reduce554< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = ExpressionOrStarExpression => ActionFn(247); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action247::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (1, 196) + } + pub(crate) fn __reduce555< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", ExpressionOrStarExpression => ActionFn(248); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action248::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 196) + } + pub(crate) fn __reduce556< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = Identifier => ActionFn(358); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action358::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant77(__nt), __end)); + (1, 197) + } + pub(crate) fn __reduce557< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", Identifier => ActionFn(359); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant77(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action359::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant77(__nt), __end)); + (3, 197) + } + pub(crate) fn __reduce558< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = DottedName, "as", Identifier => ActionFn(1683); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1683::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (3, 198) + } + pub(crate) fn __reduce559< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = DottedName => ActionFn(1684); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1684::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (1, 198) + } + pub(crate) fn __reduce560< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = OneOrMore>, ",", DottedName, "as", Identifier => ActionFn(1685); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant22(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant69(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action1685::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (5, 198) + } + pub(crate) fn __reduce561< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = OneOrMore>, ",", DottedName => ActionFn(1686); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant69(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1686::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (3, 198) + } + pub(crate) fn __reduce562< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = Identifier, "as", Identifier => ActionFn(1687); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1687::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (3, 199) + } + pub(crate) fn __reduce563< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = Identifier => ActionFn(1688); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1688::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (1, 199) + } + pub(crate) fn __reduce564< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = OneOrMore>, ",", Identifier, "as", Identifier => ActionFn(1689); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant22(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant69(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action1689::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (5, 199) + } + pub(crate) fn __reduce565< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = OneOrMore>, ",", Identifier => ActionFn(1690); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant69(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1690::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); + (3, 199) + } + pub(crate) fn __reduce566< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = MatchKeywordEntry => ActionFn(326); + let __sym0 = __pop_Variant75(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action326::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant78(__nt), __end)); + (1, 200) + } + pub(crate) fn __reduce567< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", MatchKeywordEntry => ActionFn(327); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant75(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant78(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action327::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant78(__nt), __end)); + (3, 200) + } + pub(crate) fn __reduce568< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = MatchMappingEntry => ActionFn(330); + let __sym0 = __pop_Variant76(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action330::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant79(__nt), __end)); + (1, 201) + } + pub(crate) fn __reduce569< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", MatchMappingEntry => ActionFn(331); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant76(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant79(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action331::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant79(__nt), __end)); + (3, 201) + } + pub(crate) fn __reduce570< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = ParameterDef => ActionFn(469); + let __sym0 = __pop_Variant10(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action469::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant80(__nt), __end)); + (1, 202) + } + pub(crate) fn __reduce571< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = OneOrMore>, ",", ParameterDef => ActionFn(470); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant10(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action470::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant80(__nt), __end)); + (3, 202) + } + pub(crate) fn __reduce572< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = ParameterDef => ActionFn(458); + let __sym0 = __pop_Variant10(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action458::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant80(__nt), __end)); + (1, 203) + } + pub(crate) fn __reduce573< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = OneOrMore>, ",", ParameterDef => ActionFn(459); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant10(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action459::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant80(__nt), __end)); + (3, 203) + } + pub(crate) fn __reduce574< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = Pattern => ActionFn(328); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action328::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (1, 204) + } + pub(crate) fn __reduce575< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", Pattern => ActionFn(329); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant52(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action329::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (3, 204) + } + pub(crate) fn __reduce576< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = Test<"all"> => ActionFn(290); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action290::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (1, 205) + } + pub(crate) fn __reduce577< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore> = OneOrMore>, ",", Test<"all"> => ActionFn(291); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action291::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 205) + } + pub(crate) fn __reduce578< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = TestOrStarExpr => ActionFn(437); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action437::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (1, 206) + } + pub(crate) fn __reduce579< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", TestOrStarExpr => ActionFn(438); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action438::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 206) + } + pub(crate) fn __reduce580< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = TestOrStarNamedExpr => ActionFn(254); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action254::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (1, 207) + } + pub(crate) fn __reduce581< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", TestOrStarNamedExpr => ActionFn(255); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action255::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 207) + } + pub(crate) fn __reduce582< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = TypeParam => ActionFn(266); + let __sym0 = __pop_Variant90(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action266::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant81(__nt), __end)); + (1, 208) + } + pub(crate) fn __reduce583< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OneOrMore = OneOrMore, ",", TypeParam => ActionFn(267); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant90(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant81(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action267::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant81(__nt), __end)); + (3, 208) + } + pub(crate) fn __reduce584< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OrPattern = ClosedPattern => ActionFn(96); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action96::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 209) + } + pub(crate) fn __reduce585< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OrPattern = TwoOrMore => ActionFn(1461); + let __sym0 = __pop_Variant52(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1461::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 209) + } + pub(crate) fn __reduce586< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OrTest<"all"> = (> "or")+, AndTest<"all"> => ActionFn(1462); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1462::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 210) + } + pub(crate) fn __reduce587< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OrTest<"all"> = AndTest<"all"> => ActionFn(243); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action243::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 210) + } + pub(crate) fn __reduce588< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OrTest<"no-withitems"> = (> "or")+, AndTest<"all"> => ActionFn(1463); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant16(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1463::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (2, 211) + } + pub(crate) fn __reduce589< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // OrTest<"no-withitems"> = AndTest<"no-withitems"> => ActionFn(483); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action483::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 211) + } + pub(crate) fn __reduce590< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDef = TypedParameter => ActionFn(476); + let __sym0 = __pop_Variant10(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action476::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant10(__nt), __end)); + (1, 212) + } + pub(crate) fn __reduce591< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDef = TypedParameter, "=", Test<"all"> => ActionFn(1464); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant10(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1464::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant10(__nt), __end)); + (3, 212) + } + pub(crate) fn __reduce592< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDef = UntypedParameter => ActionFn(465); + let __sym0 = __pop_Variant10(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action465::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant10(__nt), __end)); + (1, 213) + } + pub(crate) fn __reduce593< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDef = UntypedParameter, "=", Test<"all"> => ActionFn(1465); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant10(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1465::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant10(__nt), __end)); + (3, 213) + } + pub(crate) fn __reduce594< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDefs = OneOrMore> => ActionFn(425); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action425::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant82(__nt), __end)); + (1, 214) + } + pub(crate) fn __reduce595< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDefs = OneOrMore>, ",", "/" => ActionFn(725); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action725::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant82(__nt), __end)); + (3, 214) + } + pub(crate) fn __reduce596< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDefs = OneOrMore>, ",", "/", ("," >)+ => ActionFn(726); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant11(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -27176,11 +28885,11 @@ mod __parse__Top { let __sym0 = __pop_Variant80(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action684::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action726::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant82(__nt), __end)); - (4, 205) + (4, 214) } - pub(crate) fn __reduce629< + pub(crate) fn __reduce597< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27188,17 +28897,72 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterList = KwargParameter, "," => ActionFn(1371); + // ParameterDefs = OneOrMore> => ActionFn(433); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action433::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant82(__nt), __end)); + (1, 215) + } + pub(crate) fn __reduce598< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDefs = OneOrMore>, ",", "/" => ActionFn(733); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action733::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant82(__nt), __end)); + (3, 215) + } + pub(crate) fn __reduce599< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterDefs = OneOrMore>, ",", "/", ("," >)+ => ActionFn(734); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant11(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant80(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action734::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant82(__nt), __end)); + (4, 215) + } + pub(crate) fn __reduce676< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ParameterList = KwargParameter, "," => ActionFn(1502); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant8(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1371::<>(mode, __sym0, __sym1); + let __nt = super::__action1502::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 206) + (2, 216) } - pub(crate) fn __reduce630< + pub(crate) fn __reduce677< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27206,15 +28970,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterList = KwargParameter => ActionFn(1372); + // ParameterList = KwargParameter => ActionFn(1503); let __sym0 = __pop_Variant8(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1372::<>(mode, __sym0); + let __nt = super::__action1503::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (1, 206) + (1, 216) } - pub(crate) fn __reduce707< + pub(crate) fn __reduce754< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27222,17 +28986,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterList = KwargParameter, "," => ActionFn(1409); + // ParameterList = KwargParameter, "," => ActionFn(1540); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant8(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1409::<>(mode, __sym0, __sym1); + let __nt = super::__action1540::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (2, 207) + (2, 217) } - pub(crate) fn __reduce708< + pub(crate) fn __reduce755< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27240,15 +29004,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterList = KwargParameter => ActionFn(1410); + // ParameterList = KwargParameter => ActionFn(1541); let __sym0 = __pop_Variant8(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1410::<>(mode, __sym0); + let __nt = super::__action1541::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant45(__nt), __end)); - (1, 207) + (1, 217) } - pub(crate) fn __reduce709< + pub(crate) fn __reduce756< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27256,15 +29020,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterList? = ParameterList => ActionFn(258); + // ParameterList? = ParameterList => ActionFn(260); let __sym0 = __pop_Variant45(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action258::<>(mode, __sym0); + let __nt = super::__action260::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant46(__nt), __end)); - (1, 208) + (1, 218) } - pub(crate) fn __reduce710< + pub(crate) fn __reduce757< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27272,14 +29036,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ParameterList? = => ActionFn(259); + // ParameterList? = => ActionFn(261); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action259::<>(mode, &__start, &__end); + let __nt = super::__action261::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant46(__nt), __end)); - (0, 208) + (0, 218) } - pub(crate) fn __reduce729< + pub(crate) fn __reduce776< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27287,15 +29051,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // PassStatement = "pass" => ActionFn(1412); + // PassStatement = "pass" => ActionFn(1543); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1412::<>(mode, __sym0); + let __nt = super::__action1543::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 212) + (1, 222) } - pub(crate) fn __reduce730< + pub(crate) fn __reduce777< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27303,15 +29067,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Pattern = AsPattern => ActionFn(91); + // Pattern = AsPattern => ActionFn(93); let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action91::<>(mode, __sym0); + let __nt = super::__action93::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 213) + (1, 223) } - pub(crate) fn __reduce731< + pub(crate) fn __reduce778< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27319,15 +29083,114 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Pattern = OrPattern => ActionFn(92); + // Pattern = OrPattern => ActionFn(94); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action94::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 223) + } + pub(crate) fn __reduce779< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Pattern? = Pattern => ActionFn(408); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action408::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant83(__nt), __end)); + (1, 224) + } + pub(crate) fn __reduce780< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Pattern? = => ActionFn(409); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action409::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant83(__nt), __end)); + (0, 224) + } + pub(crate) fn __reduce781< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Patterns = Pattern, "," => ActionFn(1544); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1544::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (2, 225) + } + pub(crate) fn __reduce782< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Patterns = TwoOrMore, "," => ActionFn(1545); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant52(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1545::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (2, 225) + } + pub(crate) fn __reduce783< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Patterns = TwoOrMore => ActionFn(1546); + let __sym0 = __pop_Variant52(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1546::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 225) + } + pub(crate) fn __reduce784< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Patterns = Pattern => ActionFn(92); let __sym0 = __pop_Variant34(__symbols); let __start = __sym0.0; let __end = __sym0.2; let __nt = super::__action92::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 213) + (1, 225) } - pub(crate) fn __reduce732< + pub(crate) fn __reduce785< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27335,117 +29198,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Pattern? = Pattern => ActionFn(399); - let __sym0 = __pop_Variant34(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action399::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant83(__nt), __end)); - (1, 214) - } - pub(crate) fn __reduce733< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Pattern? = => ActionFn(400); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action400::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant83(__nt), __end)); - (0, 214) - } - pub(crate) fn __reduce734< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Patterns = Pattern, "," => ActionFn(1413); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant34(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1413::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (2, 215) - } - pub(crate) fn __reduce735< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Patterns = TwoOrMore, "," => ActionFn(1414); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant52(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1414::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (2, 215) - } - pub(crate) fn __reduce736< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Patterns = TwoOrMore => ActionFn(1415); - let __sym0 = __pop_Variant52(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1415::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 215) - } - pub(crate) fn __reduce737< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Patterns = Pattern => ActionFn(90); - let __sym0 = __pop_Variant34(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action90::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 215) - } - pub(crate) fn __reduce738< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Power<"all"> = AtomExpr<"all">, "**", Factor<"all"> => ActionFn(1416); + // Power<"All"> = AtomExpr<"all">, "**", Factor<"all"> => ActionFn(1547); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1416::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1547::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 216) + (3, 226) } - pub(crate) fn __reduce739< + pub(crate) fn __reduce786< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27453,15 +29217,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Power<"all"> = AtomExpr<"all"> => ActionFn(505); + // Power<"All"> = AtomExpr<"All"> => ActionFn(524); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action505::<>(mode, __sym0); + let __nt = super::__action524::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 216) + (1, 226) } - pub(crate) fn __reduce740< + pub(crate) fn __reduce787< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27469,18 +29233,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Power<"no-withitems"> = AtomExpr<"all">, "**", Factor<"all"> => ActionFn(1417); + // Power<"all"> = AtomExpr<"all">, "**", Factor<"all"> => ActionFn(1548); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1417::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1548::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 217) + (3, 227) } - pub(crate) fn __reduce741< + pub(crate) fn __reduce788< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27488,15 +29252,50 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Power<"no-withitems"> = AtomExpr<"no-withitems"> => ActionFn(554); + // Power<"all"> = AtomExpr<"all"> => ActionFn(522); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action554::<>(mode, __sym0); + let __nt = super::__action522::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 217) + (1, 227) } - pub(crate) fn __reduce742< + pub(crate) fn __reduce789< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Power<"no-withitems"> = AtomExpr<"all">, "**", Factor<"all"> => ActionFn(1549); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1549::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 228) + } + pub(crate) fn __reduce790< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Power<"no-withitems"> = AtomExpr<"no-withitems"> => ActionFn(600); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action600::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 228) + } + pub(crate) fn __reduce791< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27509,9 +29308,9 @@ mod __parse__Top { let __end = __start.clone(); let __nt = super::__action3::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (0, 218) + (0, 229) } - pub(crate) fn __reduce743< + pub(crate) fn __reduce792< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27527,9 +29326,9 @@ mod __parse__Top { let __end = __sym1.2; let __nt = super::__action4::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (2, 218) + (2, 229) } - pub(crate) fn __reduce744< + pub(crate) fn __reduce793< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27537,7 +29336,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Program = Program, SmallStatement, ";", "\n" => ActionFn(1162); + // Program = Program, SmallStatement, ";", "\n" => ActionFn(1259); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -27545,11 +29344,11 @@ mod __parse__Top { let __sym0 = __pop_Variant24(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1162::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1259::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (4, 218) + (4, 229) } - pub(crate) fn __reduce745< + pub(crate) fn __reduce794< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27557,7 +29356,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Program = Program, ( ";")+, SmallStatement, ";", "\n" => ActionFn(1163); + // Program = Program, ( ";")+, SmallStatement, ";", "\n" => ActionFn(1260); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -27566,11 +29365,11 @@ mod __parse__Top { let __sym0 = __pop_Variant24(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1163::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1260::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (5, 218) + (5, 229) } - pub(crate) fn __reduce746< + pub(crate) fn __reduce795< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27578,18 +29377,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Program = Program, SmallStatement, "\n" => ActionFn(1164); + // Program = Program, SmallStatement, "\n" => ActionFn(1261); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant36(__symbols); let __sym0 = __pop_Variant24(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1164::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1261::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (3, 218) + (3, 229) } - pub(crate) fn __reduce747< + pub(crate) fn __reduce796< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27597,7 +29396,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Program = Program, ( ";")+, SmallStatement, "\n" => ActionFn(1165); + // Program = Program, ( ";")+, SmallStatement, "\n" => ActionFn(1262); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant36(__symbols); @@ -27605,11 +29404,11 @@ mod __parse__Top { let __sym0 = __pop_Variant24(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1165::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1262::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (4, 218) + (4, 229) } - pub(crate) fn __reduce748< + pub(crate) fn __reduce797< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27625,9 +29424,9 @@ mod __parse__Top { let __end = __sym1.2; let __nt = super::__action6::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (2, 218) + (2, 229) } - pub(crate) fn __reduce749< + pub(crate) fn __reduce798< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27635,15 +29434,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // RaiseStatement = "raise" => ActionFn(1418); + // RaiseStatement = "raise" => ActionFn(1550); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1418::<>(mode, __sym0); + let __nt = super::__action1550::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 219) + (1, 230) } - pub(crate) fn __reduce750< + pub(crate) fn __reduce799< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27651,7 +29450,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // RaiseStatement = "raise", Test<"all">, "from", Test<"all"> => ActionFn(1419); + // RaiseStatement = "raise", Test<"all">, "from", Test<"all"> => ActionFn(1551); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant14(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -27659,11 +29458,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1419::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1551::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 219) + (4, 230) } - pub(crate) fn __reduce751< + pub(crate) fn __reduce800< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27671,17 +29470,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // RaiseStatement = "raise", Test<"all"> => ActionFn(1420); + // RaiseStatement = "raise", Test<"all"> => ActionFn(1552); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1420::<>(mode, __sym0, __sym1); + let __nt = super::__action1552::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 219) + (2, 230) } - pub(crate) fn __reduce752< + pub(crate) fn __reduce801< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27689,18 +29488,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "(", Pattern, ")" => ActionFn(1421); + // SequencePattern = "(", Pattern, ")" => ActionFn(1553); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant34(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1421::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1553::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (3, 220) + (3, 231) } - pub(crate) fn __reduce753< + pub(crate) fn __reduce802< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27708,17 +29507,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "(", ")" => ActionFn(1422); + // SequencePattern = "(", ")" => ActionFn(1554); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1422::<>(mode, __sym0, __sym1); + let __nt = super::__action1554::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (2, 220) + (2, 231) } - pub(crate) fn __reduce754< + pub(crate) fn __reduce803< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27726,7 +29525,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "(", Pattern, ",", ")" => ActionFn(1423); + // SequencePattern = "(", Pattern, ",", ")" => ActionFn(1555); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -27734,11 +29533,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1423::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1555::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 220) + (4, 231) } - pub(crate) fn __reduce755< + pub(crate) fn __reduce804< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27746,7 +29545,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "(", ( ",")+, Pattern, ",", ")" => ActionFn(1424); + // SequencePattern = "(", ( ",")+, Pattern, ",", ")" => ActionFn(1556); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -27755,11 +29554,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1424::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1556::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (5, 220) + (5, 231) } - pub(crate) fn __reduce756< + pub(crate) fn __reduce805< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27767,7 +29566,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "(", ( ",")+, Pattern, ")" => ActionFn(1425); + // SequencePattern = "(", ( ",")+, Pattern, ")" => ActionFn(1557); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant34(__symbols); @@ -27775,11 +29574,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1425::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1557::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 220) + (4, 231) } - pub(crate) fn __reduce757< + pub(crate) fn __reduce806< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27787,18 +29586,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "[", Pattern, "]" => ActionFn(1518); + // SequencePattern = "[", Pattern, "]" => ActionFn(1653); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant34(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1518::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1653::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (3, 220) + (3, 231) } - pub(crate) fn __reduce758< + pub(crate) fn __reduce807< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27806,17 +29605,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "[", "]" => ActionFn(1519); + // SequencePattern = "[", "]" => ActionFn(1654); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1519::<>(mode, __sym0, __sym1); + let __nt = super::__action1654::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (2, 220) + (2, 231) } - pub(crate) fn __reduce759< + pub(crate) fn __reduce808< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27824,7 +29623,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "[", ( ",")+, Pattern, "]" => ActionFn(1520); + // SequencePattern = "[", ( ",")+, Pattern, "]" => ActionFn(1655); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant34(__symbols); @@ -27832,11 +29631,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1520::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1655::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (4, 220) + (4, 231) } - pub(crate) fn __reduce760< + pub(crate) fn __reduce809< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27844,18 +29643,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SequencePattern = "[", ( ",")+, "]" => ActionFn(1521); + // SequencePattern = "[", ( ",")+, "]" => ActionFn(1656); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant35(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1521::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1656::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (3, 220) + (3, 231) } - pub(crate) fn __reduce761< + pub(crate) fn __reduce810< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27863,17 +29662,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SetLiteralValues = OneOrMore, "," => ActionFn(637); + // SetLiteralValues = OneOrMore, "," => ActionFn(687); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action637::<>(mode, __sym0, __sym1); + let __nt = super::__action687::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (2, 221) + (2, 232) } - pub(crate) fn __reduce762< + pub(crate) fn __reduce811< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27881,15 +29680,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SetLiteralValues = OneOrMore => ActionFn(638); + // SetLiteralValues = OneOrMore => ActionFn(688); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action638::<>(mode, __sym0); + let __nt = super::__action688::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (1, 221) + (1, 232) } - pub(crate) fn __reduce763< + pub(crate) fn __reduce812< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27897,18 +29696,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ShiftExpression<"all"> = ShiftExpression<"all">, ShiftOp, ArithmeticExpression<"all"> => ActionFn(1427); + // ShiftExpression<"All"> = ShiftExpression<"all">, ShiftOp, ArithmeticExpression<"all"> => ActionFn(1559); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant48(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1427::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1559::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 222) + (3, 233) } - pub(crate) fn __reduce764< + pub(crate) fn __reduce813< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27916,15 +29715,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ShiftExpression<"all"> = ArithmeticExpression<"all"> => ActionFn(484); + // ShiftExpression<"All"> = ArithmeticExpression<"All"> => ActionFn(489); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action484::<>(mode, __sym0); + let __nt = super::__action489::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 222) + (1, 233) } - pub(crate) fn __reduce765< + pub(crate) fn __reduce814< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27932,18 +29731,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ShiftExpression<"no-withitems"> = ShiftExpression<"all">, ShiftOp, ArithmeticExpression<"all"> => ActionFn(1428); + // ShiftExpression<"all"> = ShiftExpression<"all">, ShiftOp, ArithmeticExpression<"all"> => ActionFn(1560); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant48(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1428::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1560::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 223) + (3, 234) } - pub(crate) fn __reduce766< + pub(crate) fn __reduce815< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27951,15 +29750,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ShiftExpression<"no-withitems"> = ArithmeticExpression<"no-withitems"> => ActionFn(511); + // ShiftExpression<"all"> = ArithmeticExpression<"all"> => ActionFn(491); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action511::<>(mode, __sym0); + let __nt = super::__action491::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 223) + (1, 234) } - pub(crate) fn __reduce767< + pub(crate) fn __reduce816< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27967,15 +29766,50 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ShiftOp = "<<" => ActionFn(192); + // ShiftExpression<"no-withitems"> = ShiftExpression<"all">, ShiftOp, ArithmeticExpression<"all"> => ActionFn(1561); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant48(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1561::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 235) + } + pub(crate) fn __reduce817< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ShiftExpression<"no-withitems"> = ArithmeticExpression<"no-withitems"> => ActionFn(542); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action542::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 235) + } + pub(crate) fn __reduce818< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ShiftOp = "<<" => ActionFn(194); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action192::<>(mode, __sym0); + let __nt = super::__action194::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 224) + (1, 236) } - pub(crate) fn __reduce768< + pub(crate) fn __reduce819< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27983,15 +29817,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ShiftOp = ">>" => ActionFn(193); + // ShiftOp = ">>" => ActionFn(195); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action193::<>(mode, __sym0); + let __nt = super::__action195::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant48(__nt), __end)); - (1, 224) + (1, 236) } - pub(crate) fn __reduce769< + pub(crate) fn __reduce820< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27999,7 +29833,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SingleForComprehension = "async", "for", ExpressionList, "in", OrTest<"all"> => ActionFn(1524); + // SingleForComprehension = "async", "for", ExpressionList, "in", OrTest<"all"> => ActionFn(1659); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant14(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -28008,11 +29842,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1524::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1659::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant84(__nt), __end)); - (5, 225) + (5, 237) } - pub(crate) fn __reduce770< + pub(crate) fn __reduce821< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28020,7 +29854,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SingleForComprehension = "async", "for", ExpressionList, "in", OrTest<"all">, ComprehensionIf+ => ActionFn(1525); + // SingleForComprehension = "async", "for", ExpressionList, "in", OrTest<"all">, ComprehensionIf+ => ActionFn(1660); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant16(__symbols); let __sym4 = __pop_Variant14(__symbols); @@ -28030,11 +29864,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = super::__action1525::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action1660::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant84(__nt), __end)); - (6, 225) + (6, 237) } - pub(crate) fn __reduce771< + pub(crate) fn __reduce822< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28042,7 +29876,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SingleForComprehension = "for", ExpressionList, "in", OrTest<"all"> => ActionFn(1526); + // SingleForComprehension = "for", ExpressionList, "in", OrTest<"all"> => ActionFn(1661); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant14(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -28050,11 +29884,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1526::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1661::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant84(__nt), __end)); - (4, 225) + (4, 237) } - pub(crate) fn __reduce772< + pub(crate) fn __reduce823< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28062,7 +29896,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SingleForComprehension = "for", ExpressionList, "in", OrTest<"all">, ComprehensionIf+ => ActionFn(1527); + // SingleForComprehension = "for", ExpressionList, "in", OrTest<"all">, ComprehensionIf+ => ActionFn(1662); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant16(__symbols); let __sym3 = __pop_Variant14(__symbols); @@ -28071,11 +29905,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1527::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1662::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant84(__nt), __end)); - (5, 225) + (5, 237) } - pub(crate) fn __reduce773< + pub(crate) fn __reduce824< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28083,15 +29917,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SingleForComprehension+ = SingleForComprehension => ActionFn(242); + // SingleForComprehension+ = SingleForComprehension => ActionFn(244); let __sym0 = __pop_Variant84(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action242::<>(mode, __sym0); + let __nt = super::__action244::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant85(__nt), __end)); - (1, 226) + (1, 238) } - pub(crate) fn __reduce774< + pub(crate) fn __reduce825< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28099,17 +29933,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SingleForComprehension+ = SingleForComprehension+, SingleForComprehension => ActionFn(243); + // SingleForComprehension+ = SingleForComprehension+, SingleForComprehension => ActionFn(245); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant84(__symbols); let __sym0 = __pop_Variant85(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action243::<>(mode, __sym0, __sym1); + let __nt = super::__action245::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant85(__nt), __end)); - (2, 226) + (2, 238) } - pub(crate) fn __reduce775< + pub(crate) fn __reduce826< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28117,17 +29951,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SliceOp = ":", Test<"all"> => ActionFn(1686); + // SliceOp = ":", Test<"all"> => ActionFn(1825); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1686::<>(mode, __sym0, __sym1); + let __nt = super::__action1825::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant86(__nt), __end)); - (2, 227) + (2, 239) } - pub(crate) fn __reduce776< + pub(crate) fn __reduce827< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28135,15 +29969,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SliceOp = ":" => ActionFn(1687); + // SliceOp = ":" => ActionFn(1826); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1687::<>(mode, __sym0); + let __nt = super::__action1826::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant86(__nt), __end)); - (1, 227) + (1, 239) } - pub(crate) fn __reduce777< + pub(crate) fn __reduce828< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28151,15 +29985,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SliceOp? = SliceOp => ActionFn(254); + // SliceOp? = SliceOp => ActionFn(256); let __sym0 = __pop_Variant86(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action254::<>(mode, __sym0); + let __nt = super::__action256::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant87(__nt), __end)); - (1, 228) + (1, 240) } - pub(crate) fn __reduce778< + pub(crate) fn __reduce829< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28167,14 +30001,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SliceOp? = => ActionFn(255); + // SliceOp? = => ActionFn(257); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action255::<>(mode, &__start, &__end); + let __nt = super::__action257::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant87(__nt), __end)); - (0, 228) + (0, 240) } - pub(crate) fn __reduce779< + pub(crate) fn __reduce830< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28188,9 +30022,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action13::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce780< + pub(crate) fn __reduce831< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28204,9 +30038,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action14::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce781< + pub(crate) fn __reduce832< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28220,9 +30054,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action15::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce782< + pub(crate) fn __reduce833< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28236,9 +30070,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action16::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce783< + pub(crate) fn __reduce834< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28252,9 +30086,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action17::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce784< + pub(crate) fn __reduce835< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28268,9 +30102,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action18::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce785< + pub(crate) fn __reduce836< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28284,9 +30118,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action19::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce786< + pub(crate) fn __reduce837< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28300,9 +30134,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action20::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce787< + pub(crate) fn __reduce838< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28316,9 +30150,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action21::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce788< + pub(crate) fn __reduce839< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28332,9 +30166,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action22::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 229) + (1, 241) } - pub(crate) fn __reduce789< + pub(crate) fn __reduce840< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28342,17 +30176,33 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarExpr = "*", Expression<"all"> => ActionFn(1431); + // SmallStatement = HelpEndLineMagic => ActionFn(23); + let __sym0 = __pop_Variant36(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action23::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 241) + } + pub(crate) fn __reduce841< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // StarExpr = "*", Expression<"all"> => ActionFn(1564); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1431::<>(mode, __sym0, __sym1); + let __nt = super::__action1564::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 230) + (2, 242) } - pub(crate) fn __reduce790< + pub(crate) fn __reduce842< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28360,17 +30210,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarPattern = "*", Identifier => ActionFn(1432); + // StarPattern = "*", Identifier => ActionFn(1565); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant22(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1432::<>(mode, __sym0, __sym1); + let __nt = super::__action1565::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (2, 231) + (2, 243) } - pub(crate) fn __reduce791< + pub(crate) fn __reduce843< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28378,18 +30228,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarTypedParameter = Identifier, ":", TestOrStarExpr => ActionFn(1433); + // StarTypedParameter = Identifier, ":", TestOrStarExpr => ActionFn(1566); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1433::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1566::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant63(__nt), __end)); - (3, 232) + (3, 244) } - pub(crate) fn __reduce792< + pub(crate) fn __reduce844< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28397,15 +30247,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarTypedParameter = Identifier => ActionFn(1434); + // StarTypedParameter = Identifier => ActionFn(1567); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1434::<>(mode, __sym0); + let __nt = super::__action1567::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant63(__nt), __end)); - (1, 232) + (1, 244) } - pub(crate) fn __reduce793< + pub(crate) fn __reduce845< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28413,15 +30263,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarTypedParameter? = StarTypedParameter => ActionFn(471); + // StarTypedParameter? = StarTypedParameter => ActionFn(478); let __sym0 = __pop_Variant63(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action471::<>(mode, __sym0); + let __nt = super::__action478::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant64(__nt), __end)); - (1, 233) + (1, 245) } - pub(crate) fn __reduce794< + pub(crate) fn __reduce846< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28429,14 +30279,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarTypedParameter? = => ActionFn(472); + // StarTypedParameter? = => ActionFn(479); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action472::<>(mode, &__start, &__end); + let __nt = super::__action479::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant64(__nt), __end)); - (0, 233) + (0, 245) } - pub(crate) fn __reduce795< + pub(crate) fn __reduce847< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28444,15 +30294,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarUntypedParameter = Identifier => ActionFn(1435); + // StarUntypedParameter = Identifier => ActionFn(1568); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1435::<>(mode, __sym0); + let __nt = super::__action1568::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant63(__nt), __end)); - (1, 234) + (1, 246) } - pub(crate) fn __reduce796< + pub(crate) fn __reduce848< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28460,15 +30310,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarUntypedParameter? = StarUntypedParameter => ActionFn(460); + // StarUntypedParameter? = StarUntypedParameter => ActionFn(467); let __sym0 = __pop_Variant63(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action460::<>(mode, __sym0); + let __nt = super::__action467::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant64(__nt), __end)); - (1, 235) + (1, 247) } - pub(crate) fn __reduce797< + pub(crate) fn __reduce849< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28476,14 +30326,14 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // StarUntypedParameter? = => ActionFn(461); + // StarUntypedParameter? = => ActionFn(468); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action461::<>(mode, &__start, &__end); + let __nt = super::__action468::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant64(__nt), __end)); - (0, 235) + (0, 247) } - pub(crate) fn __reduce798< + pub(crate) fn __reduce850< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28491,18 +30341,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = SmallStatement, ";", "\n" => ActionFn(1166); + // Statements = SmallStatement, ";", "\n" => ActionFn(1263); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1166::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1263::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (3, 236) + (3, 248) } - pub(crate) fn __reduce799< + pub(crate) fn __reduce851< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28510,7 +30360,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = ( ";")+, SmallStatement, ";", "\n" => ActionFn(1167); + // Statements = ( ";")+, SmallStatement, ";", "\n" => ActionFn(1264); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -28518,11 +30368,11 @@ mod __parse__Top { let __sym0 = __pop_Variant37(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1167::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1264::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (4, 236) + (4, 248) } - pub(crate) fn __reduce800< + pub(crate) fn __reduce852< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28530,17 +30380,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = SmallStatement, "\n" => ActionFn(1168); + // Statements = SmallStatement, "\n" => ActionFn(1265); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1168::<>(mode, __sym0, __sym1); + let __nt = super::__action1265::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (2, 236) + (2, 248) } - pub(crate) fn __reduce801< + pub(crate) fn __reduce853< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28548,18 +30398,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = ( ";")+, SmallStatement, "\n" => ActionFn(1169); + // Statements = ( ";")+, SmallStatement, "\n" => ActionFn(1266); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant36(__symbols); let __sym0 = __pop_Variant37(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1169::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1266::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (3, 236) + (3, 248) } - pub(crate) fn __reduce802< + pub(crate) fn __reduce854< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28573,9 +30423,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action10::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (1, 236) + (1, 248) } - pub(crate) fn __reduce803< + pub(crate) fn __reduce855< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28591,9 +30441,9 @@ mod __parse__Top { let __end = __sym1.2; let __nt = super::__action11::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (2, 236) + (2, 248) } - pub(crate) fn __reduce804< + pub(crate) fn __reduce856< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28601,7 +30451,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = Statements, SmallStatement, ";", "\n" => ActionFn(1170); + // Statements = Statements, SmallStatement, ";", "\n" => ActionFn(1267); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -28609,11 +30459,11 @@ mod __parse__Top { let __sym0 = __pop_Variant88(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1170::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1267::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (4, 236) + (4, 248) } - pub(crate) fn __reduce805< + pub(crate) fn __reduce857< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28621,7 +30471,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = Statements, ( ";")+, SmallStatement, ";", "\n" => ActionFn(1171); + // Statements = Statements, ( ";")+, SmallStatement, ";", "\n" => ActionFn(1268); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -28630,11 +30480,11 @@ mod __parse__Top { let __sym0 = __pop_Variant88(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1171::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1268::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (5, 236) + (5, 248) } - pub(crate) fn __reduce806< + pub(crate) fn __reduce858< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28642,18 +30492,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = Statements, SmallStatement, "\n" => ActionFn(1172); + // Statements = Statements, SmallStatement, "\n" => ActionFn(1269); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant36(__symbols); let __sym0 = __pop_Variant88(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1172::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1269::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (3, 236) + (3, 248) } - pub(crate) fn __reduce807< + pub(crate) fn __reduce859< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28661,7 +30511,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Statements = Statements, ( ";")+, SmallStatement, "\n" => ActionFn(1173); + // Statements = Statements, ( ";")+, SmallStatement, "\n" => ActionFn(1270); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant36(__symbols); @@ -28669,11 +30519,11 @@ mod __parse__Top { let __sym0 = __pop_Variant88(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1173::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1270::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant88(__nt), __end)); - (4, 236) + (4, 248) } - pub(crate) fn __reduce808< + pub(crate) fn __reduce860< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28681,15 +30531,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = TestOrStarNamedExpr => ActionFn(207); + // Subscript = TestOrStarNamedExpr => ActionFn(209); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action207::<>(mode, __sym0); + let __nt = super::__action209::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 237) + (1, 249) } - pub(crate) fn __reduce809< + pub(crate) fn __reduce861< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28697,7 +30547,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = Test<"all">, ":", Test<"all">, SliceOp => ActionFn(1688); + // Subscript = Test<"all">, ":", Test<"all">, SliceOp => ActionFn(1827); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant86(__symbols); let __sym2 = __pop_Variant14(__symbols); @@ -28705,11 +30555,11 @@ mod __parse__Top { let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1688::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1827::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 237) + (4, 249) } - pub(crate) fn __reduce810< + pub(crate) fn __reduce862< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28717,18 +30567,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = Test<"all">, ":", SliceOp => ActionFn(1689); + // Subscript = Test<"all">, ":", SliceOp => ActionFn(1828); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant86(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1689::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1828::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 237) + (3, 249) } - pub(crate) fn __reduce811< + pub(crate) fn __reduce863< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28736,18 +30586,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = ":", Test<"all">, SliceOp => ActionFn(1690); + // Subscript = ":", Test<"all">, SliceOp => ActionFn(1829); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant86(__symbols); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1690::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1829::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 237) + (3, 249) } - pub(crate) fn __reduce812< + pub(crate) fn __reduce864< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28755,17 +30605,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = ":", SliceOp => ActionFn(1691); + // Subscript = ":", SliceOp => ActionFn(1830); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant86(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1691::<>(mode, __sym0, __sym1); + let __nt = super::__action1830::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 237) + (2, 249) } - pub(crate) fn __reduce813< + pub(crate) fn __reduce865< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28773,18 +30623,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = Test<"all">, ":", Test<"all"> => ActionFn(1692); + // Subscript = Test<"all">, ":", Test<"all"> => ActionFn(1831); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1692::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1831::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 237) + (3, 249) } - pub(crate) fn __reduce814< + pub(crate) fn __reduce866< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28792,17 +30642,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = Test<"all">, ":" => ActionFn(1693); + // Subscript = Test<"all">, ":" => ActionFn(1832); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1693::<>(mode, __sym0, __sym1); + let __nt = super::__action1832::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 237) + (2, 249) } - pub(crate) fn __reduce815< + pub(crate) fn __reduce867< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28810,17 +30660,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = ":", Test<"all"> => ActionFn(1694); + // Subscript = ":", Test<"all"> => ActionFn(1833); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1694::<>(mode, __sym0, __sym1); + let __nt = super::__action1833::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 237) + (2, 249) } - pub(crate) fn __reduce816< + pub(crate) fn __reduce868< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28828,15 +30678,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Subscript = ":" => ActionFn(1695); + // Subscript = ":" => ActionFn(1834); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1695::<>(mode, __sym0); + let __nt = super::__action1834::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 237) + (1, 249) } - pub(crate) fn __reduce817< + pub(crate) fn __reduce869< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28844,15 +30694,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SubscriptList = Subscript => ActionFn(1437); + // SubscriptList = Subscript => ActionFn(1570); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1437::<>(mode, __sym0); + let __nt = super::__action1570::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 238) + (1, 250) } - pub(crate) fn __reduce818< + pub(crate) fn __reduce870< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28860,17 +30710,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SubscriptList = Subscript, "," => ActionFn(1438); + // SubscriptList = Subscript, "," => ActionFn(1571); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1438::<>(mode, __sym0, __sym1); + let __nt = super::__action1571::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 238) + (2, 250) } - pub(crate) fn __reduce819< + pub(crate) fn __reduce871< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28878,17 +30728,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SubscriptList = TwoOrMore, "," => ActionFn(1439); + // SubscriptList = TwoOrMore, "," => ActionFn(1572); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1439::<>(mode, __sym0, __sym1); + let __nt = super::__action1572::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 238) + (2, 250) } - pub(crate) fn __reduce820< + pub(crate) fn __reduce872< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28896,15 +30746,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SubscriptList = TwoOrMore => ActionFn(1440); + // SubscriptList = TwoOrMore => ActionFn(1573); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1440::<>(mode, __sym0); + let __nt = super::__action1573::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 238) + (1, 250) } - pub(crate) fn __reduce821< + pub(crate) fn __reduce873< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28912,18 +30762,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Suite = SmallStatement, ";", "\n" => ActionFn(1174); + // Suite = SmallStatement, ";", "\n" => ActionFn(1271); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1174::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1271::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (3, 239) + (3, 251) } - pub(crate) fn __reduce822< + pub(crate) fn __reduce874< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28931,7 +30781,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Suite = ( ";")+, SmallStatement, ";", "\n" => ActionFn(1175); + // Suite = ( ";")+, SmallStatement, ";", "\n" => ActionFn(1272); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -28939,11 +30789,11 @@ mod __parse__Top { let __sym0 = __pop_Variant37(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1175::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1272::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (4, 239) + (4, 251) } - pub(crate) fn __reduce823< + pub(crate) fn __reduce875< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28951,17 +30801,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Suite = SmallStatement, "\n" => ActionFn(1176); + // Suite = SmallStatement, "\n" => ActionFn(1273); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1176::<>(mode, __sym0, __sym1); + let __nt = super::__action1273::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (2, 239) + (2, 251) } - pub(crate) fn __reduce824< + pub(crate) fn __reduce876< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28969,18 +30819,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Suite = ( ";")+, SmallStatement, "\n" => ActionFn(1177); + // Suite = ( ";")+, SmallStatement, "\n" => ActionFn(1274); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant36(__symbols); let __sym0 = __pop_Variant37(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1177::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1274::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (3, 239) + (3, 251) } - pub(crate) fn __reduce825< + pub(crate) fn __reduce877< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -28998,969 +30848,7 @@ mod __parse__Top { let __end = __sym3.2; let __nt = super::__action8::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant24(__nt), __end)); - (4, 239) - } - pub(crate) fn __reduce826< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Term<"all"> = Term<"all">, MulOp, Factor<"all"> => ActionFn(1441); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant48(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1441::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 240) - } - pub(crate) fn __reduce827< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Term<"all"> = Factor<"all"> => ActionFn(497); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action497::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 240) - } - pub(crate) fn __reduce828< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Term<"no-withitems"> = Term<"all">, MulOp, Factor<"all"> => ActionFn(1442); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant48(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1442::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 241) - } - pub(crate) fn __reduce829< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Term<"no-withitems"> = Factor<"no-withitems"> => ActionFn(538); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action538::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 241) - } - pub(crate) fn __reduce830< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"all"> = OrTest<"all">, "if", OrTest<"all">, "else", Test<"all"> => ActionFn(1443); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant14(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1443::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (5, 242) - } - pub(crate) fn __reduce831< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"all"> = OrTest<"all"> => ActionFn(376); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action376::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 242) - } - pub(crate) fn __reduce832< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"all"> = LambdaDef => ActionFn(377); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action377::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 242) - } - pub(crate) fn __reduce833< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"all">? = Test<"all"> => ActionFn(303); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action303::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (1, 243) - } - pub(crate) fn __reduce834< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"all">? = => ActionFn(304); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action304::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (0, 243) - } - pub(crate) fn __reduce835< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"no-withitems"> = OrTest<"all">, "if", OrTest<"all">, "else", Test<"all"> => ActionFn(1444); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant14(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1444::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (5, 244) - } - pub(crate) fn __reduce836< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"no-withitems"> = OrTest<"no-withitems"> => ActionFn(406); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action406::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 244) - } - pub(crate) fn __reduce837< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Test<"no-withitems"> = LambdaDef => ActionFn(407); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action407::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 244) - } - pub(crate) fn __reduce838< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestList = GenericList => ActionFn(220); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action220::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 245) - } - pub(crate) fn __reduce839< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestList? = GenericList => ActionFn(1700); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1700::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (1, 246) - } - pub(crate) fn __reduce840< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestList? = => ActionFn(372); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action372::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant15(__nt), __end)); - (0, 246) - } - pub(crate) fn __reduce841< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestListOrYieldExpr = GenericList => ActionFn(1701); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1701::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 247) - } - pub(crate) fn __reduce842< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestListOrYieldExpr = YieldExpr => ActionFn(31); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action31::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 247) - } - pub(crate) fn __reduce843< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestOrStarExpr = Test<"all"> => ActionFn(33); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action33::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 248) - } - pub(crate) fn __reduce844< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestOrStarExpr = StarExpr => ActionFn(34); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action34::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 248) - } - pub(crate) fn __reduce845< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestOrStarExprList = GenericList => ActionFn(1702); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1702::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 249) - } - pub(crate) fn __reduce846< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestOrStarNamedExpr = NamedExpressionTest => ActionFn(37); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action37::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 250) - } - pub(crate) fn __reduce847< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TestOrStarNamedExpr = StarExpr => ActionFn(38); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action38::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 250) - } - pub(crate) fn __reduce848< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Top = StartModule, Program => ActionFn(1445); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant24(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1445::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant89(__nt), __end)); - (2, 251) - } - pub(crate) fn __reduce849< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Top = StartExpression, GenericList => ActionFn(1703); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1703::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant89(__nt), __end)); - (2, 251) - } - pub(crate) fn __reduce850< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // Top = StartExpression, GenericList, ("\n")+ => ActionFn(1704); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant21(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1704::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant89(__nt), __end)); - (3, 251) - } - pub(crate) fn __reduce851< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite, "finally", ":", Suite => ActionFn(1448); - assert!(__symbols.len() >= 10); - let __sym9 = __pop_Variant24(__symbols); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant24(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym9.2; - let __nt = super::__action1448::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (10, 252) - } - pub(crate) fn __reduce852< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite => ActionFn(1449); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant24(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1449::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 252) - } - pub(crate) fn __reduce853< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptClause+, "finally", ":", Suite => ActionFn(1450); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant24(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1450::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 252) - } - pub(crate) fn __reduce854< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptClause+ => ActionFn(1451); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1451::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 252) - } - pub(crate) fn __reduce855< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptStarClause+, "else", ":", Suite, "finally", ":", Suite => ActionFn(1452); - assert!(__symbols.len() >= 10); - let __sym9 = __pop_Variant24(__symbols); - let __sym8 = __pop_Variant0(__symbols); - let __sym7 = __pop_Variant0(__symbols); - let __sym6 = __pop_Variant24(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym9.2; - let __nt = super::__action1452::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (10, 252) - } - pub(crate) fn __reduce856< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptStarClause+, "else", ":", Suite => ActionFn(1453); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant24(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1453::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 252) - } - pub(crate) fn __reduce857< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptStarClause+, "finally", ":", Suite => ActionFn(1454); - assert!(__symbols.len() >= 7); - let __sym6 = __pop_Variant24(__symbols); - let __sym5 = __pop_Variant0(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym6.2; - let __nt = super::__action1454::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 252) - } - pub(crate) fn __reduce858< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, ExceptStarClause+ => ActionFn(1455); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant66(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1455::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 252) - } - pub(crate) fn __reduce859< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TryStatement = "try", ":", Suite, "finally", ":", Suite => ActionFn(1110); - assert!(__symbols.len() >= 6); - let __sym5 = __pop_Variant24(__symbols); - let __sym4 = __pop_Variant0(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant24(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym5.2; - let __nt = super::__action1110::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (6, 252) - } - pub(crate) fn __reduce860< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = ClosedPattern, "|", ClosedPattern => ActionFn(337); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant34(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant34(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action337::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (3, 253) - } - pub(crate) fn __reduce861< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = TwoOrMore, "|", ClosedPattern => ActionFn(338); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant34(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant52(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action338::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (3, 253) - } - pub(crate) fn __reduce862< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = Pattern, ",", Pattern => ActionFn(339); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant34(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant34(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action339::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (3, 254) - } - pub(crate) fn __reduce863< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = TwoOrMore, ",", Pattern => ActionFn(340); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant34(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant52(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action340::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant52(__nt), __end)); - (3, 254) - } - pub(crate) fn __reduce864< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = Subscript, ",", Subscript => ActionFn(256); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action256::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 255) - } - pub(crate) fn __reduce865< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = TwoOrMore, ",", Subscript => ActionFn(257); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action257::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 255) - } - pub(crate) fn __reduce866< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = TestOrStarNamedExpr, ",", TestOrStarNamedExpr => ActionFn(344); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action344::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 256) - } - pub(crate) fn __reduce867< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TwoOrMore = TwoOrMore, ",", TestOrStarNamedExpr => ActionFn(345); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant32(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action345::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant32(__nt), __end)); - (3, 256) - } - pub(crate) fn __reduce868< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeAliasName = Identifier => ActionFn(1456); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1456::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 257) - } - pub(crate) fn __reduce869< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeAliasStatement = "type", TypeAliasName, TypeParams, "=", Test<"all"> => ActionFn(1736); - assert!(__symbols.len() >= 5); - let __sym4 = __pop_Variant14(__symbols); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant91(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym4.2; - let __nt = super::__action1736::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 258) - } - pub(crate) fn __reduce870< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeAliasStatement = "type", TypeAliasName, "=", Test<"all"> => ActionFn(1737); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant14(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant14(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1737::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 258) - } - pub(crate) fn __reduce871< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeParam = Identifier, ":", Test<"all"> => ActionFn(1458); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1458::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant90(__nt), __end)); - (3, 259) - } - pub(crate) fn __reduce872< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeParam = Identifier => ActionFn(1459); - let __sym0 = __pop_Variant22(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1459::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant90(__nt), __end)); - (1, 259) - } - pub(crate) fn __reduce873< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeParam = "*", Identifier => ActionFn(1460); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant22(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1460::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant90(__nt), __end)); - (2, 259) - } - pub(crate) fn __reduce874< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeParam = "**", Identifier => ActionFn(1461); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant22(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1461::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant90(__nt), __end)); - (2, 259) - } - pub(crate) fn __reduce875< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeParams = "[", OneOrMore, ",", "]" => ActionFn(1462); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant81(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1462::<>(mode, __sym0, __sym1, __sym2, __sym3); - __symbols.push((__start, __Symbol::Variant91(__nt), __end)); - (4, 260) - } - pub(crate) fn __reduce876< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeParams = "[", OneOrMore, "]" => ActionFn(1463); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant81(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1463::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant91(__nt), __end)); - (3, 260) - } - pub(crate) fn __reduce877< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // TypeParams? = TypeParams => ActionFn(284); - let __sym0 = __pop_Variant91(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action284::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant92(__nt), __end)); - (1, 261) + (4, 251) } pub(crate) fn __reduce878< >( @@ -29970,12 +30858,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // TypeParams? = => ActionFn(285); - let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); - let __end = __start.clone(); - let __nt = super::__action285::<>(mode, &__start, &__end); - __symbols.push((__start, __Symbol::Variant92(__nt), __end)); - (0, 261) + // Term<"All"> = Term<"all">, MulOp, Factor<"all"> => ActionFn(1574); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant48(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1574::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 252) } pub(crate) fn __reduce879< >( @@ -29985,16 +30877,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // TypedParameter = Identifier, ":", Test<"all"> => ActionFn(1464); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant14(__symbols); - let __sym1 = __pop_Variant0(__symbols); - let __sym0 = __pop_Variant22(__symbols); + // Term<"All"> = Factor<"All"> => ActionFn(510); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1464::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant10(__nt), __end)); - (3, 262) + let __end = __sym0.2; + let __nt = super::__action510::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 252) } pub(crate) fn __reduce880< >( @@ -30004,13 +30893,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // TypedParameter = Identifier => ActionFn(1465); - let __sym0 = __pop_Variant22(__symbols); + // Term<"all"> = Term<"all">, MulOp, Factor<"all"> => ActionFn(1575); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant48(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1465::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant10(__nt), __end)); - (1, 262) + let __end = __sym2.2; + let __nt = super::__action1575::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 253) } pub(crate) fn __reduce881< >( @@ -30020,13 +30912,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // UnaryOp = "+" => ActionFn(201); - let __sym0 = __pop_Variant0(__symbols); + // Term<"all"> = Factor<"all"> => ActionFn(512); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action201::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant93(__nt), __end)); - (1, 263) + let __nt = super::__action512::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 253) } pub(crate) fn __reduce882< >( @@ -30036,13 +30928,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // UnaryOp = "-" => ActionFn(202); - let __sym0 = __pop_Variant0(__symbols); + // Term<"no-withitems"> = Term<"all">, MulOp, Factor<"all"> => ActionFn(1576); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant48(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action202::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant93(__nt), __end)); - (1, 263) + let __end = __sym2.2; + let __nt = super::__action1576::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 254) } pub(crate) fn __reduce883< >( @@ -30052,13 +30947,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // UnaryOp = "~" => ActionFn(203); - let __sym0 = __pop_Variant0(__symbols); + // Term<"no-withitems"> = Factor<"no-withitems"> => ActionFn(594); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action203::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant93(__nt), __end)); - (1, 263) + let __nt = super::__action594::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 254) } pub(crate) fn __reduce884< >( @@ -30068,13 +30963,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // UntypedParameter = Identifier => ActionFn(1466); - let __sym0 = __pop_Variant22(__symbols); + // Test<"all"> = OrTest<"all">, "if", OrTest<"all">, "else", Test<"all"> => ActionFn(1577); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant14(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1466::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant10(__nt), __end)); - (1, 264) + let __end = __sym4.2; + let __nt = super::__action1577::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (5, 255) } pub(crate) fn __reduce885< >( @@ -30084,13 +30984,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ValuePattern = MatchNameOrAttr => ActionFn(1467); + // Test<"all"> = OrTest<"all"> => ActionFn(383); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1467::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant34(__nt), __end)); - (1, 265) + let __nt = super::__action383::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 255) } pub(crate) fn __reduce886< >( @@ -30100,7 +31000,992 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WhileStatement = "while", NamedExpressionTest, ":", Suite, "else", ":", Suite => ActionFn(1107); + // Test<"all"> = LambdaDef => ActionFn(384); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action384::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 255) + } + pub(crate) fn __reduce887< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Test<"all">? = Test<"all"> => ActionFn(305); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action305::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (1, 256) + } + pub(crate) fn __reduce888< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Test<"all">? = => ActionFn(306); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action306::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (0, 256) + } + pub(crate) fn __reduce889< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Test<"no-withitems"> = OrTest<"all">, "if", OrTest<"all">, "else", Test<"all"> => ActionFn(1578); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant14(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action1578::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (5, 257) + } + pub(crate) fn __reduce890< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Test<"no-withitems"> = OrTest<"no-withitems"> => ActionFn(415); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action415::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 257) + } + pub(crate) fn __reduce891< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Test<"no-withitems"> = LambdaDef => ActionFn(416); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action416::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 257) + } + pub(crate) fn __reduce892< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestList = GenericList => ActionFn(222); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action222::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 258) + } + pub(crate) fn __reduce893< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestList? = GenericList => ActionFn(1839); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1839::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (1, 259) + } + pub(crate) fn __reduce894< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestList? = => ActionFn(379); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action379::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant15(__nt), __end)); + (0, 259) + } + pub(crate) fn __reduce895< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestListOrYieldExpr = GenericList => ActionFn(1840); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1840::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 260) + } + pub(crate) fn __reduce896< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestListOrYieldExpr = YieldExpr => ActionFn(32); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action32::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 260) + } + pub(crate) fn __reduce897< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestOrStarExpr = Test<"all"> => ActionFn(34); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action34::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 261) + } + pub(crate) fn __reduce898< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestOrStarExpr = StarExpr => ActionFn(35); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action35::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 261) + } + pub(crate) fn __reduce899< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestOrStarExprList = GenericList => ActionFn(1841); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1841::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 262) + } + pub(crate) fn __reduce900< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestOrStarNamedExpr = NamedExpressionTest => ActionFn(38); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action38::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 263) + } + pub(crate) fn __reduce901< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TestOrStarNamedExpr = StarExpr => ActionFn(39); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action39::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 263) + } + pub(crate) fn __reduce902< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Top = StartModule, Program => ActionFn(1579); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant24(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1579::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant89(__nt), __end)); + (2, 264) + } + pub(crate) fn __reduce903< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Top = StartExpression, GenericList => ActionFn(1842); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1842::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant89(__nt), __end)); + (2, 264) + } + pub(crate) fn __reduce904< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // Top = StartExpression, GenericList, ("\n")+ => ActionFn(1843); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant21(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1843::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant89(__nt), __end)); + (3, 264) + } + pub(crate) fn __reduce905< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite, "finally", ":", Suite => ActionFn(1582); + assert!(__symbols.len() >= 10); + let __sym9 = __pop_Variant24(__symbols); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant24(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym9.2; + let __nt = super::__action1582::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (10, 265) + } + pub(crate) fn __reduce906< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptClause+, "else", ":", Suite => ActionFn(1583); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant24(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = super::__action1583::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (7, 265) + } + pub(crate) fn __reduce907< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptClause+, "finally", ":", Suite => ActionFn(1584); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant24(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = super::__action1584::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (7, 265) + } + pub(crate) fn __reduce908< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptClause+ => ActionFn(1585); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1585::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (4, 265) + } + pub(crate) fn __reduce909< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptStarClause+, "else", ":", Suite, "finally", ":", Suite => ActionFn(1586); + assert!(__symbols.len() >= 10); + let __sym9 = __pop_Variant24(__symbols); + let __sym8 = __pop_Variant0(__symbols); + let __sym7 = __pop_Variant0(__symbols); + let __sym6 = __pop_Variant24(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym9.2; + let __nt = super::__action1586::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (10, 265) + } + pub(crate) fn __reduce910< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptStarClause+, "else", ":", Suite => ActionFn(1587); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant24(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = super::__action1587::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (7, 265) + } + pub(crate) fn __reduce911< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptStarClause+, "finally", ":", Suite => ActionFn(1588); + assert!(__symbols.len() >= 7); + let __sym6 = __pop_Variant24(__symbols); + let __sym5 = __pop_Variant0(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym6.2; + let __nt = super::__action1588::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (7, 265) + } + pub(crate) fn __reduce912< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, ExceptStarClause+ => ActionFn(1589); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant66(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1589::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (4, 265) + } + pub(crate) fn __reduce913< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TryStatement = "try", ":", Suite, "finally", ":", Suite => ActionFn(1199); + assert!(__symbols.len() >= 6); + let __sym5 = __pop_Variant24(__symbols); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant24(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym5.2; + let __nt = super::__action1199::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (6, 265) + } + pub(crate) fn __reduce914< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = ClosedPattern, "|", ClosedPattern => ActionFn(339); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action339::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (3, 266) + } + pub(crate) fn __reduce915< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = TwoOrMore, "|", ClosedPattern => ActionFn(340); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant52(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action340::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (3, 266) + } + pub(crate) fn __reduce916< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = Pattern, ",", Pattern => ActionFn(341); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant34(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action341::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (3, 267) + } + pub(crate) fn __reduce917< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = TwoOrMore, ",", Pattern => ActionFn(342); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant34(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant52(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action342::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant52(__nt), __end)); + (3, 267) + } + pub(crate) fn __reduce918< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = Subscript, ",", Subscript => ActionFn(258); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action258::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 268) + } + pub(crate) fn __reduce919< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = TwoOrMore, ",", Subscript => ActionFn(259); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action259::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 268) + } + pub(crate) fn __reduce920< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = TestOrStarNamedExpr, ",", TestOrStarNamedExpr => ActionFn(346); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action346::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 269) + } + pub(crate) fn __reduce921< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TwoOrMore = TwoOrMore, ",", TestOrStarNamedExpr => ActionFn(347); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant32(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action347::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant32(__nt), __end)); + (3, 269) + } + pub(crate) fn __reduce922< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeAliasName = Identifier => ActionFn(1590); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1590::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 270) + } + pub(crate) fn __reduce923< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeAliasStatement = "type", TypeAliasName, TypeParams, "=", Test<"all"> => ActionFn(1875); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant14(__symbols); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant91(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym4.2; + let __nt = super::__action1875::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (5, 271) + } + pub(crate) fn __reduce924< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeAliasStatement = "type", TypeAliasName, "=", Test<"all"> => ActionFn(1876); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant14(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant14(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1876::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (4, 271) + } + pub(crate) fn __reduce925< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParam = Identifier, ":", Test<"all"> => ActionFn(1592); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1592::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant90(__nt), __end)); + (3, 272) + } + pub(crate) fn __reduce926< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParam = Identifier => ActionFn(1593); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1593::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant90(__nt), __end)); + (1, 272) + } + pub(crate) fn __reduce927< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParam = "*", Identifier => ActionFn(1594); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant22(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1594::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant90(__nt), __end)); + (2, 272) + } + pub(crate) fn __reduce928< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParam = "**", Identifier => ActionFn(1595); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant22(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1595::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant90(__nt), __end)); + (2, 272) + } + pub(crate) fn __reduce929< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParams = "[", OneOrMore, ",", "]" => ActionFn(1596); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant81(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym3.2; + let __nt = super::__action1596::<>(mode, __sym0, __sym1, __sym2, __sym3); + __symbols.push((__start, __Symbol::Variant91(__nt), __end)); + (4, 273) + } + pub(crate) fn __reduce930< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParams = "[", OneOrMore, "]" => ActionFn(1597); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant81(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1597::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant91(__nt), __end)); + (3, 273) + } + pub(crate) fn __reduce931< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParams? = TypeParams => ActionFn(286); + let __sym0 = __pop_Variant91(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action286::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant92(__nt), __end)); + (1, 274) + } + pub(crate) fn __reduce932< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypeParams? = => ActionFn(287); + let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); + let __end = __start.clone(); + let __nt = super::__action287::<>(mode, &__start, &__end); + __symbols.push((__start, __Symbol::Variant92(__nt), __end)); + (0, 274) + } + pub(crate) fn __reduce933< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypedParameter = Identifier, ":", Test<"all"> => ActionFn(1598); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1598::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant10(__nt), __end)); + (3, 275) + } + pub(crate) fn __reduce934< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // TypedParameter = Identifier => ActionFn(1599); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1599::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant10(__nt), __end)); + (1, 275) + } + pub(crate) fn __reduce935< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // UnaryOp = "+" => ActionFn(203); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action203::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant93(__nt), __end)); + (1, 276) + } + pub(crate) fn __reduce936< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // UnaryOp = "-" => ActionFn(204); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action204::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant93(__nt), __end)); + (1, 276) + } + pub(crate) fn __reduce937< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // UnaryOp = "~" => ActionFn(205); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action205::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant93(__nt), __end)); + (1, 276) + } + pub(crate) fn __reduce938< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // UntypedParameter = Identifier => ActionFn(1600); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1600::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant10(__nt), __end)); + (1, 277) + } + pub(crate) fn __reduce939< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ValuePattern = MatchNameOrAttr => ActionFn(1601); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action1601::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant34(__nt), __end)); + (1, 278) + } + pub(crate) fn __reduce940< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // WhileStatement = "while", NamedExpressionTest, ":", Suite, "else", ":", Suite => ActionFn(1196); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant24(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -30111,11 +31996,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1107::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1196::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 266) + (7, 279) } - pub(crate) fn __reduce887< + pub(crate) fn __reduce941< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30123,7 +32008,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WhileStatement = "while", NamedExpressionTest, ":", Suite => ActionFn(1108); + // WhileStatement = "while", NamedExpressionTest, ":", Suite => ActionFn(1197); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant24(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -30131,11 +32016,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1108::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1197::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 266) + (4, 279) } - pub(crate) fn __reduce888< + pub(crate) fn __reduce942< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30143,15 +32028,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItem<"all"> = Test<"all"> => ActionFn(1468); + // WithItem<"all"> = Test<"all"> => ActionFn(1602); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1468::<>(mode, __sym0); + let __nt = super::__action1602::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant17(__nt), __end)); - (1, 267) + (1, 280) } - pub(crate) fn __reduce889< + pub(crate) fn __reduce943< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30159,18 +32044,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItem<"all"> = Test<"all">, "as", Expression<"all"> => ActionFn(1469); + // WithItem<"all"> = Test<"all">, "as", Expression<"all"> => ActionFn(1603); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1469::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1603::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant17(__nt), __end)); - (3, 267) + (3, 280) } - pub(crate) fn __reduce890< + pub(crate) fn __reduce944< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30178,18 +32063,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItem<"as"> = Test<"all">, "as", Expression<"all"> => ActionFn(1470); + // WithItem<"as"> = Test<"all">, "as", Expression<"all"> => ActionFn(1604); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1470::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1604::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant17(__nt), __end)); - (3, 268) + (3, 281) } - pub(crate) fn __reduce891< + pub(crate) fn __reduce945< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30197,15 +32082,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItem<"no-withitems"> = Test<"no-withitems"> => ActionFn(1471); + // WithItem<"no-withitems"> = Test<"no-withitems"> => ActionFn(1605); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1471::<>(mode, __sym0); + let __nt = super::__action1605::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant17(__nt), __end)); - (1, 269) + (1, 282) } - pub(crate) fn __reduce892< + pub(crate) fn __reduce946< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30213,18 +32098,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItem<"no-withitems"> = Test<"all">, "as", Expression<"all"> => ActionFn(1472); + // WithItem<"no-withitems"> = Test<"all">, "as", Expression<"all"> => ActionFn(1606); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1472::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1606::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant17(__nt), __end)); - (3, 269) + (3, 282) } - pub(crate) fn __reduce893< + pub(crate) fn __reduce947< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30232,7 +32117,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", OneOrMore>, ",", ")" => ActionFn(1479); + // WithItems = "(", OneOrMore>, ",", ")" => ActionFn(1614); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -30240,11 +32125,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1479::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1614::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (4, 270) + (4, 283) } - pub(crate) fn __reduce894< + pub(crate) fn __reduce948< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30252,18 +32137,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", OneOrMore>, ")" => ActionFn(1480); + // WithItems = "(", OneOrMore>, ")" => ActionFn(1615); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant32(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1480::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1615::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (3, 270) + (3, 283) } - pub(crate) fn __reduce895< + pub(crate) fn __reduce949< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30271,7 +32156,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ",", ")" => ActionFn(1482); + // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ",", ")" => ActionFn(1617); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant0(__symbols); @@ -30281,11 +32166,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = super::__action1482::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action1617::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (6, 270) + (6, 283) } - pub(crate) fn __reduce896< + pub(crate) fn __reduce950< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30293,7 +32178,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", WithItem<"as">, ",", ")" => ActionFn(1483); + // WithItems = "(", WithItem<"as">, ",", ")" => ActionFn(1618); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -30301,11 +32186,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1483::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1618::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (4, 270) + (4, 283) } - pub(crate) fn __reduce897< + pub(crate) fn __reduce951< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30313,7 +32198,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ("," >)+, ",", ")" => ActionFn(1484); + // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ("," >)+, ",", ")" => ActionFn(1619); assert!(__symbols.len() >= 7); let __sym6 = __pop_Variant0(__symbols); let __sym5 = __pop_Variant0(__symbols); @@ -30324,11 +32209,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym6.2; - let __nt = super::__action1484::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); + let __nt = super::__action1619::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (7, 270) + (7, 283) } - pub(crate) fn __reduce898< + pub(crate) fn __reduce952< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30336,7 +32221,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", WithItem<"as">, ("," >)+, ",", ")" => ActionFn(1485); + // WithItems = "(", WithItem<"as">, ("," >)+, ",", ")" => ActionFn(1620); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -30345,11 +32230,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1485::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1620::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (5, 270) + (5, 283) } - pub(crate) fn __reduce899< + pub(crate) fn __reduce953< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30357,7 +32242,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ")" => ActionFn(1486); + // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ")" => ActionFn(1621); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant17(__symbols); @@ -30366,11 +32251,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action1486::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1621::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (5, 270) + (5, 283) } - pub(crate) fn __reduce900< + pub(crate) fn __reduce954< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30378,18 +32263,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", WithItem<"as">, ")" => ActionFn(1487); + // WithItems = "(", WithItem<"as">, ")" => ActionFn(1622); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant17(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1487::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1622::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (3, 270) + (3, 283) } - pub(crate) fn __reduce901< + pub(crate) fn __reduce955< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30397,7 +32282,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ("," >)+, ")" => ActionFn(1488); + // WithItems = "(", OneOrMore>, ",", WithItem<"as">, ("," >)+, ")" => ActionFn(1623); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant18(__symbols); @@ -30407,11 +32292,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym5.2; - let __nt = super::__action1488::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action1623::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (6, 270) + (6, 283) } - pub(crate) fn __reduce902< + pub(crate) fn __reduce956< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30419,7 +32304,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = "(", WithItem<"as">, ("," >)+, ")" => ActionFn(1489); + // WithItems = "(", WithItem<"as">, ("," >)+, ")" => ActionFn(1624); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant18(__symbols); @@ -30427,11 +32312,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1489::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1624::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (4, 270) + (4, 283) } - pub(crate) fn __reduce903< + pub(crate) fn __reduce957< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30439,15 +32324,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = WithItem<"no-withitems"> => ActionFn(158); + // WithItems = WithItem<"no-withitems"> => ActionFn(160); let __sym0 = __pop_Variant17(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action158::<>(mode, __sym0); + let __nt = super::__action160::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (1, 270) + (1, 283) } - pub(crate) fn __reduce904< + pub(crate) fn __reduce958< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30455,17 +32340,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItems = WithItem<"all">, ("," >)+ => ActionFn(159); + // WithItems = WithItem<"all">, ("," >)+ => ActionFn(161); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant18(__symbols); let __sym0 = __pop_Variant17(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action159::<>(mode, __sym0, __sym1); + let __nt = super::__action161::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (2, 270) + (2, 283) } - pub(crate) fn __reduce905< + pub(crate) fn __reduce959< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30473,15 +32358,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithItemsNoAs = OneOrMore> => ActionFn(1473); + // WithItemsNoAs = OneOrMore> => ActionFn(1607); let __sym0 = __pop_Variant32(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1473::<>(mode, __sym0); + let __nt = super::__action1607::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant39(__nt), __end)); - (1, 271) + (1, 284) } - pub(crate) fn __reduce906< + pub(crate) fn __reduce960< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30489,7 +32374,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithStatement = "async", "with", WithItems, ":", Suite => ActionFn(937); + // WithStatement = "async", "with", WithItems, ":", Suite => ActionFn(1019); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant24(__symbols); let __sym3 = __pop_Variant0(__symbols); @@ -30498,11 +32383,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym4.2; - let __nt = super::__action937::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action1019::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 272) + (5, 285) } - pub(crate) fn __reduce907< + pub(crate) fn __reduce961< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30510,7 +32395,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // WithStatement = "with", WithItems, ":", Suite => ActionFn(938); + // WithStatement = "with", WithItems, ":", Suite => ActionFn(1020); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant24(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -30518,11 +32403,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action938::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1020::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 272) + (4, 285) } - pub(crate) fn __reduce908< + pub(crate) fn __reduce962< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30530,18 +32415,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // XorExpression<"all"> = XorExpression<"all">, "^", AndExpression<"all"> => ActionFn(1474); + // XorExpression<"All"> = XorExpression<"all">, "^", AndExpression<"all"> => ActionFn(1608); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1474::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1608::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 273) + (3, 286) } - pub(crate) fn __reduce909< + pub(crate) fn __reduce963< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30549,15 +32434,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // XorExpression<"all"> = AndExpression<"all"> => ActionFn(427); + // XorExpression<"All"> = AndExpression<"All"> => ActionFn(407); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action427::<>(mode, __sym0); + let __nt = super::__action407::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 273) + (1, 286) } - pub(crate) fn __reduce910< + pub(crate) fn __reduce964< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30565,18 +32450,18 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // XorExpression<"no-withitems"> = XorExpression<"all">, "^", AndExpression<"all"> => ActionFn(1475); + // XorExpression<"all"> = XorExpression<"all">, "^", AndExpression<"all"> => ActionFn(1609); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1475::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1609::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 274) + (3, 287) } - pub(crate) fn __reduce911< + pub(crate) fn __reduce965< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30584,15 +32469,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // XorExpression<"no-withitems"> = AndExpression<"no-withitems"> => ActionFn(503); + // XorExpression<"all"> = AndExpression<"all"> => ActionFn(436); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action503::<>(mode, __sym0); + let __nt = super::__action436::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 274) + (1, 287) } - pub(crate) fn __reduce912< + pub(crate) fn __reduce966< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30600,17 +32485,52 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // YieldExpr = "yield", GenericList => ActionFn(1707); + // XorExpression<"no-withitems"> = XorExpression<"all">, "^", AndExpression<"all"> => ActionFn(1610); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant14(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1610::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (3, 288) + } + pub(crate) fn __reduce967< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // XorExpression<"no-withitems"> = AndExpression<"no-withitems"> => ActionFn(526); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = super::__action526::<>(mode, __sym0); + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 288) + } + pub(crate) fn __reduce968< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // YieldExpr = "yield", GenericList => ActionFn(1846); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym1.2; - let __nt = super::__action1707::<>(mode, __sym0, __sym1); + let __nt = super::__action1846::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (2, 275) + (2, 289) } - pub(crate) fn __reduce913< + pub(crate) fn __reduce969< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30618,15 +32538,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // YieldExpr = "yield" => ActionFn(1708); + // YieldExpr = "yield" => ActionFn(1847); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1708::<>(mode, __sym0); + let __nt = super::__action1847::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 275) + (1, 289) } - pub(crate) fn __reduce914< + pub(crate) fn __reduce970< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -30634,16 +32554,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // YieldExpr = "yield", "from", Test<"all"> => ActionFn(1477); + // YieldExpr = "yield", "from", Test<"all"> => ActionFn(1612); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym2.2; - let __nt = super::__action1477::<>(mode, __sym0, __sym1, __sym2); + let __nt = super::__action1612::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 275) + (3, 289) } } pub(crate) use self::__parse__Top::TopParser; @@ -30952,6 +32872,17 @@ fn __action22< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action23< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Stmt, TextSize), +) -> ast::Stmt +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action24< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -30966,7 +32897,7 @@ fn __action23< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action24< +fn __action25< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -30984,7 +32915,7 @@ fn __action24< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action25< +fn __action26< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31018,7 +32949,7 @@ fn __action25< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action26< +fn __action27< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31042,7 +32973,7 @@ fn __action26< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action27< +fn __action28< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31067,18 +32998,6 @@ fn __action27< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action28< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - e -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action29< @@ -31096,10 +33015,11 @@ fn __action29< fn __action30< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - __0 + e } #[allow(unused_variables)] @@ -31195,10 +33115,10 @@ fn __action38< fn __action39< >( mode: Mode, - (_, __0, _): (TextSize, token::Tok, TextSize), -) -> ast::Operator + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - ast::Operator::Add + __0 } #[allow(unused_variables)] @@ -31209,7 +33129,7 @@ fn __action40< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Sub + ast::Operator::Add } #[allow(unused_variables)] @@ -31220,7 +33140,7 @@ fn __action41< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Mult + ast::Operator::Sub } #[allow(unused_variables)] @@ -31231,7 +33151,7 @@ fn __action42< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::MatMult + ast::Operator::Mult } #[allow(unused_variables)] @@ -31242,7 +33162,7 @@ fn __action43< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Div + ast::Operator::MatMult } #[allow(unused_variables)] @@ -31253,7 +33173,7 @@ fn __action44< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Mod + ast::Operator::Div } #[allow(unused_variables)] @@ -31264,7 +33184,7 @@ fn __action45< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::BitAnd + ast::Operator::Mod } #[allow(unused_variables)] @@ -31275,7 +33195,7 @@ fn __action46< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::BitOr + ast::Operator::BitAnd } #[allow(unused_variables)] @@ -31286,7 +33206,7 @@ fn __action47< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::BitXor + ast::Operator::BitOr } #[allow(unused_variables)] @@ -31297,7 +33217,7 @@ fn __action48< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::LShift + ast::Operator::BitXor } #[allow(unused_variables)] @@ -31308,7 +33228,7 @@ fn __action49< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::RShift + ast::Operator::LShift } #[allow(unused_variables)] @@ -31319,7 +33239,7 @@ fn __action50< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Pow + ast::Operator::RShift } #[allow(unused_variables)] @@ -31330,12 +33250,23 @@ fn __action51< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::FloorDiv + ast::Operator::Pow } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action52< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> ast::Operator +{ + ast::Operator::FloorDiv +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action53< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31351,7 +33282,7 @@ fn __action52< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action53< +fn __action54< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31366,7 +33297,7 @@ fn __action53< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action54< +fn __action55< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31384,7 +33315,7 @@ fn __action54< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action55< +fn __action56< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31401,7 +33332,7 @@ fn __action55< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action56< +fn __action57< >( mode: Mode, (_, __0, _): (TextSize, ast::Stmt, TextSize), @@ -31412,7 +33343,7 @@ fn __action56< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action57< +fn __action58< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31429,7 +33360,7 @@ fn __action57< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action58< +fn __action59< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31448,7 +33379,7 @@ fn __action58< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action59< +fn __action60< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31466,7 +33397,7 @@ fn __action59< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action60< +fn __action61< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31492,7 +33423,7 @@ fn __action60< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action61< +fn __action62< >( mode: Mode, (_, dots, _): (TextSize, alloc::vec::Vec, TextSize), @@ -31506,7 +33437,7 @@ fn __action61< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action62< +fn __action63< >( mode: Mode, (_, dots, _): (TextSize, alloc::vec::Vec, TextSize), @@ -31519,7 +33450,7 @@ fn __action62< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action63< +fn __action64< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -31530,7 +33461,7 @@ fn __action63< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action64< +fn __action65< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -31541,7 +33472,7 @@ fn __action64< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action65< +fn __action66< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31554,7 +33485,7 @@ fn __action65< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action66< +fn __action67< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31570,7 +33501,7 @@ fn __action66< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action67< +fn __action68< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31586,7 +33517,7 @@ fn __action67< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action68< +fn __action69< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31599,7 +33530,7 @@ fn __action68< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action69< +fn __action70< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31620,7 +33551,7 @@ fn __action69< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action70< +fn __action71< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31638,7 +33569,7 @@ fn __action70< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action71< +fn __action72< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31656,7 +33587,7 @@ fn __action71< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action72< +fn __action73< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31679,7 +33610,7 @@ fn __action72< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action73< +fn __action74< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31707,7 +33638,7 @@ fn __action73< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action74< +fn __action75< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31740,26 +33671,83 @@ fn __action74< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action75< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Stmt, TextSize), -) -> ast::Stmt -{ - __0 -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action76< >( mode: Mode, - (_, __0, _): (TextSize, ast::Stmt, TextSize), -) -> ast::Stmt + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, suffix, _): (TextSize, alloc::vec::Vec, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> Result> { - __0 + { + fn unparse_expr(expr: &ast::Expr, buffer: &mut String) -> Result<(), LexicalError> { + match expr { + ast::Expr::Name(ast::ExprName { id, .. }) => { + buffer.push_str(id.as_str()); + }, + ast::Expr::Subscript(ast::ExprSubscript { value, slice, range, .. }) => { + let ast::Expr::Constant(ast::ExprConstant { value: ast::Constant::Int(integer), .. }) = slice.as_ref() else { + return Err(LexicalError { + error: LexicalErrorType::OtherError("only integer constants are allowed in Subscript expressions in help end escape command".to_string()), + location: range.start(), + }); + }; + unparse_expr(value, buffer)?; + buffer.push('['); + buffer.push_str(&format!("{}", integer)); + buffer.push(']'); + }, + ast::Expr::Attribute(ast::ExprAttribute { value, attr, .. }) => { + unparse_expr(value, buffer)?; + buffer.push('.'); + buffer.push_str(attr.as_str()); + }, + _ => { + return Err(LexicalError { + error: LexicalErrorType::OtherError("only Name, Subscript and Attribute expressions are allowed in help end escape command".to_string()), + location: expr.range().start(), + }); + } + } + Ok(()) + } + + if mode != Mode::Jupyter { + return Err(ParseError::User { + error: LexicalError { + error: LexicalErrorType::OtherError("IPython escape commands are only allowed in Jupyter mode".to_string()), + location, + }, + }); + } + + let kind = match suffix.len() { + 1 => MagicKind::Help, + 2 => MagicKind::Help2, + _ => { + return Err(ParseError::User { + error: LexicalError { + error: LexicalErrorType::OtherError("maximum of 2 `?` tokens are allowed in help end escape command".to_string()), + location, + }, + }); + } + }; + + let mut value = String::new(); + unparse_expr(&e, &mut value)?; + + Ok(ast::Stmt::LineMagic( + ast::StmtLineMagic { + kind, + value, + range: (location..end_location).into() + } + )) + } } #[allow(unused_variables)] @@ -31831,6 +33819,28 @@ fn __action82< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action83< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Stmt, TextSize), +) -> ast::Stmt +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action84< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Stmt, TextSize), +) -> ast::Stmt +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action85< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31863,7 +33873,7 @@ fn __action83< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action84< +fn __action86< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31897,7 +33907,7 @@ fn __action84< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action85< +fn __action87< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31937,7 +33947,7 @@ fn __action85< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action86< +fn __action88< >( mode: Mode, (_, start, _): (TextSize, TextSize, TextSize), @@ -31962,7 +33972,7 @@ fn __action86< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action87< +fn __action89< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -31976,7 +33986,7 @@ fn __action87< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action88< +fn __action90< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -31995,7 +34005,7 @@ fn __action88< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action89< +fn __action91< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32014,28 +34024,6 @@ fn __action89< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action90< ->( - mode: Mode, - (_, pattern, _): (TextSize, ast::Pattern, TextSize), -) -> ast::Pattern -{ - pattern -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action91< ->( - mode: Mode, - (_, pattern, _): (TextSize, ast::Pattern, TextSize), -) -> ast::Pattern -{ - pattern -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action92< @@ -32050,6 +34038,28 @@ fn __action92< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action93< +>( + mode: Mode, + (_, pattern, _): (TextSize, ast::Pattern, TextSize), +) -> ast::Pattern +{ + pattern +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action94< +>( + mode: Mode, + (_, pattern, _): (TextSize, ast::Pattern, TextSize), +) -> ast::Pattern +{ + pattern +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action95< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32079,7 +34089,7 @@ fn __action93< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action94< +fn __action96< >( mode: Mode, (_, pattern, _): (TextSize, ast::Pattern, TextSize), @@ -32090,7 +34100,7 @@ fn __action94< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action95< +fn __action97< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32105,28 +34115,6 @@ fn __action95< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action96< ->( - mode: Mode, - (_, node, _): (TextSize, ast::Pattern, TextSize), -) -> ast::Pattern -{ - node -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action97< ->( - mode: Mode, - (_, node, _): (TextSize, ast::Pattern, TextSize), -) -> ast::Pattern -{ - node -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action98< @@ -32185,6 +34173,28 @@ fn __action102< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action103< +>( + mode: Mode, + (_, node, _): (TextSize, ast::Pattern, TextSize), +) -> ast::Pattern +{ + node +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action104< +>( + mode: Mode, + (_, node, _): (TextSize, ast::Pattern, TextSize), +) -> ast::Pattern +{ + node +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action105< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32199,7 +34209,7 @@ fn __action103< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action104< +fn __action106< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32216,7 +34226,7 @@ fn __action104< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action105< +fn __action107< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32237,7 +34247,7 @@ fn __action105< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action106< +fn __action108< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32261,7 +34271,7 @@ fn __action106< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action107< +fn __action109< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32279,7 +34289,7 @@ fn __action107< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action108< +fn __action110< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32296,7 +34306,7 @@ fn __action108< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action109< +fn __action111< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32311,7 +34321,7 @@ fn __action109< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action110< +fn __action112< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -32322,7 +34332,7 @@ fn __action110< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action111< +fn __action113< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32342,7 +34352,7 @@ fn __action111< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action112< +fn __action114< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32364,7 +34374,7 @@ fn __action112< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action113< +fn __action115< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32380,7 +34390,7 @@ fn __action113< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action114< +fn __action116< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32396,7 +34406,7 @@ fn __action114< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action115< +fn __action117< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32410,41 +34420,41 @@ fn __action115< }.into() } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action116< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, value, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - ast::PatternMatchValue { - value: Box::new(value), - range: (location..end_location).into() - }.into() -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action117< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, value, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - ast::PatternMatchValue { - value: Box::new(value), - range: (location..end_location).into() - }.into() -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action118< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, value, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + ast::PatternMatchValue { + value: Box::new(value), + range: (location..end_location).into() + }.into() +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action119< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, value, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + ast::PatternMatchValue { + value: Box::new(value), + range: (location..end_location).into() + }.into() +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action120< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32460,7 +34470,7 @@ fn __action118< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action119< +fn __action121< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32477,7 +34487,7 @@ fn __action119< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action120< +fn __action122< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32492,7 +34502,7 @@ fn __action120< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action121< +fn __action123< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32514,7 +34524,7 @@ fn __action121< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action122< +fn __action124< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32536,7 +34546,7 @@ fn __action122< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action123< +fn __action125< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32550,28 +34560,6 @@ fn __action123< }.into() } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action124< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action125< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action126< @@ -32586,6 +34574,28 @@ fn __action126< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action127< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action128< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action129< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32604,7 +34614,7 @@ fn __action127< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action128< +fn __action130< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32623,7 +34633,7 @@ fn __action128< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action129< +fn __action131< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32642,7 +34652,7 @@ fn __action129< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action130< +fn __action132< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32654,7 +34664,7 @@ fn __action130< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action131< +fn __action133< >( mode: Mode, (_, k, _): (TextSize, ast::Expr, TextSize), @@ -32665,53 +34675,6 @@ fn __action131< (k, v) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action132< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - { - ast::PatternMatchMapping { - keys: vec![], - patterns: vec![], - rest: None, - range: (location..end_location).into() - }.into() - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action133< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e, _): (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - (_, _, _): (TextSize, core::option::Option, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - { - let (keys, patterns) = e - .into_iter() - .unzip(); - ast::PatternMatchMapping { - keys, - patterns, - rest: None, - range: (location..end_location).into() - }.into() - } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action134< @@ -32720,9 +34683,6 @@ fn __action134< (_, location, _): (TextSize, TextSize, TextSize), (_, _, _): (TextSize, token::Tok, TextSize), (_, _, _): (TextSize, token::Tok, TextSize), - (_, rest, _): (TextSize, ast::Identifier, TextSize), - (_, _, _): (TextSize, core::option::Option, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Pattern { @@ -32730,7 +34690,7 @@ fn __action134< ast::PatternMatchMapping { keys: vec![], patterns: vec![], - rest: Some(rest), + rest: None, range: (location..end_location).into() }.into() } @@ -32739,6 +34699,56 @@ fn __action134< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action135< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + (_, _, _): (TextSize, core::option::Option, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + { + let (keys, patterns) = e + .into_iter() + .unzip(); + ast::PatternMatchMapping { + keys, + patterns, + rest: None, + range: (location..end_location).into() + }.into() + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action136< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, rest, _): (TextSize, ast::Identifier, TextSize), + (_, _, _): (TextSize, core::option::Option, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + { + ast::PatternMatchMapping { + keys: vec![], + patterns: vec![], + rest: Some(rest), + range: (location..end_location).into() + }.into() + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action137< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32767,7 +34777,7 @@ fn __action135< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action136< +fn __action138< >( mode: Mode, (_, k, _): (TextSize, ast::Identifier, TextSize), @@ -32780,7 +34790,7 @@ fn __action136< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action137< +fn __action139< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32808,62 +34818,62 @@ fn __action137< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action138< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, patterns, _): (TextSize, Vec, TextSize), - (_, _, _): (TextSize, core::option::Option, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - { - ast::PatternMatchClass { - cls: Box::new(e), - patterns, - kwd_attrs: vec![], - kwd_patterns: vec![], - range: (location..end_location).into() - }.into() - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action139< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, kwds, _): (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - (_, _, _): (TextSize, core::option::Option, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - { - let (kwd_attrs, kwd_patterns) = kwds - .into_iter() - .unzip(); - ast::PatternMatchClass { - cls: Box::new(e), - patterns: vec![], - kwd_attrs, - kwd_patterns, - range: (location..end_location).into() - }.into() - } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action140< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, patterns, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, core::option::Option, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + { + ast::PatternMatchClass { + cls: Box::new(e), + patterns, + kwd_attrs: vec![], + kwd_patterns: vec![], + range: (location..end_location).into() + }.into() + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action141< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, kwds, _): (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + (_, _, _): (TextSize, core::option::Option, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + { + let (kwd_attrs, kwd_patterns) = kwds + .into_iter() + .unzip(); + ast::PatternMatchClass { + cls: Box::new(e), + patterns: vec![], + kwd_attrs, + kwd_patterns, + range: (location..end_location).into() + }.into() + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action142< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32886,7 +34896,7 @@ fn __action140< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action141< +fn __action143< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32916,7 +34926,7 @@ fn __action141< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action142< +fn __action144< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32941,7 +34951,7 @@ fn __action142< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action143< +fn __action145< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32969,7 +34979,7 @@ fn __action143< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action144< +fn __action146< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -32992,7 +35002,7 @@ fn __action144< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action145< +fn __action147< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33027,7 +35037,7 @@ fn __action145< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action146< +fn __action148< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33058,7 +35068,7 @@ fn __action146< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action147< +fn __action149< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33087,7 +35097,7 @@ fn __action147< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action148< +fn __action150< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33123,7 +35133,7 @@ fn __action148< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action149< +fn __action151< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33159,7 +35169,7 @@ fn __action149< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action150< +fn __action152< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33187,7 +35197,7 @@ fn __action150< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action151< +fn __action153< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33211,57 +35221,6 @@ fn __action151< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action152< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, x, _): (TextSize, (ast::Expr, ast::Identifier), TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, body, _): (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - { - let end_location = body.last().unwrap().end(); - ast::ExceptHandler::ExceptHandler( - ast::ExceptHandlerExceptHandler { - type_: Some(Box::new(x.0)), - name: Some(x.1), - body, - range: (location..end_location).into() - }, - ) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action153< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, typ, _): (TextSize, core::option::Option, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, body, _): (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - { - let end_location = body.last().unwrap().end(); - ast::ExceptHandler::ExceptHandler( - ast::ExceptHandlerExceptHandler { - type_: typ.map(Box::new), - name: None, - body, - range: (location..end_location).into() - }, - ) - } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action154< @@ -33269,6 +35228,7 @@ fn __action154< mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), (_, _, _): (TextSize, token::Tok, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), (_, x, _): (TextSize, (ast::Expr, ast::Identifier), TextSize), (_, _, _): (TextSize, token::Tok, TextSize), (_, body, _): (TextSize, ast::Suite, TextSize), @@ -33290,6 +35250,56 @@ fn __action154< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action155< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, typ, _): (TextSize, core::option::Option, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, body, _): (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + { + let end_location = body.last().unwrap().end(); + ast::ExceptHandler::ExceptHandler( + ast::ExceptHandlerExceptHandler { + type_: typ.map(Box::new), + name: None, + body, + range: (location..end_location).into() + }, + ) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action156< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, x, _): (TextSize, (ast::Expr, ast::Identifier), TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, body, _): (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + { + let end_location = body.last().unwrap().end(); + ast::ExceptHandler::ExceptHandler( + ast::ExceptHandlerExceptHandler { + type_: Some(Box::new(x.0)), + name: Some(x.1), + body, + range: (location..end_location).into() + }, + ) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action157< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33308,7 +35318,7 @@ fn __action155< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action156< +fn __action158< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -33322,7 +35332,7 @@ fn __action156< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action157< +fn __action159< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -33340,7 +35350,7 @@ fn __action157< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action158< +fn __action160< >( mode: Mode, (_, __0, _): (TextSize, ast::WithItem, TextSize), @@ -33351,7 +35361,7 @@ fn __action158< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action159< +fn __action161< >( mode: Mode, (_, item, _): (TextSize, ast::WithItem, TextSize), @@ -33365,7 +35375,7 @@ fn __action159< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action160< +fn __action162< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33380,7 +35390,7 @@ fn __action160< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action161< +fn __action163< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33405,7 +35415,7 @@ fn __action161< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action162< +fn __action164< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33420,7 +35430,7 @@ fn __action162< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action163< +fn __action165< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33446,7 +35456,7 @@ fn __action163< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action164< +fn __action166< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33472,7 +35482,7 @@ fn __action164< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action165< +fn __action167< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33488,7 +35498,7 @@ fn __action165< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action166< +fn __action168< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33501,7 +35511,7 @@ fn __action166< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action167< +fn __action169< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33517,43 +35527,43 @@ fn __action167< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action168< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, arg, _): (TextSize, ast::Identifier, TextSize), - (_, a, _): (TextSize, core::option::Option, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Parameter -{ - { - let annotation = a.map(Box::new); - ast::Parameter { name:arg, annotation, range: (location..end_location).into() } - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action169< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, arg, _): (TextSize, ast::Identifier, TextSize), - (_, a, _): (TextSize, core::option::Option, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Parameter -{ - { - let annotation = a.map(Box::new); - ast::Parameter { name:arg, annotation, range: (location..end_location).into() } - } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action170< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, arg, _): (TextSize, ast::Identifier, TextSize), + (_, a, _): (TextSize, core::option::Option, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Parameter +{ + { + let annotation = a.map(Box::new); + ast::Parameter { name:arg, annotation, range: (location..end_location).into() } + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action171< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, arg, _): (TextSize, ast::Identifier, TextSize), + (_, a, _): (TextSize, core::option::Option, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Parameter +{ + { + let annotation = a.map(Box::new); + ast::Parameter { name:arg, annotation, range: (location..end_location).into() } + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action172< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33583,7 +35593,7 @@ fn __action170< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action171< +fn __action173< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33604,7 +35614,7 @@ fn __action171< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action172< +fn __action174< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33622,7 +35632,7 @@ fn __action172< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action173< +fn __action175< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33640,7 +35650,7 @@ fn __action173< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action174< +fn __action176< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33658,7 +35668,7 @@ fn __action174< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action175< +fn __action177< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33675,7 +35685,7 @@ fn __action175< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action176< +fn __action178< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33691,7 +35701,7 @@ fn __action176< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action177< +fn __action179< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33706,31 +35716,31 @@ fn __action177< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action178< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action179< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action180< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action181< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action182< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33755,7 +35765,7 @@ fn __action180< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action181< +fn __action183< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -33785,7 +35795,7 @@ fn __action181< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action182< +fn __action184< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -33796,7 +35806,7 @@ fn __action182< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action183< +fn __action185< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -33807,7 +35817,7 @@ fn __action183< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action184< +fn __action186< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -33818,7 +35828,7 @@ fn __action184< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action185< +fn __action187< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -33829,7 +35839,7 @@ fn __action185< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action186< +fn __action188< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -33840,7 +35850,7 @@ fn __action186< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action187< +fn __action189< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -33849,29 +35859,6 @@ fn __action187< ast::CmpOp::GtE } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action188< ->( - mode: Mode, - (_, __0, _): (TextSize, token::Tok, TextSize), -) -> ast::CmpOp -{ - ast::CmpOp::In -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action189< ->( - mode: Mode, - (_, __0, _): (TextSize, token::Tok, TextSize), - (_, __1, _): (TextSize, token::Tok, TextSize), -) -> ast::CmpOp -{ - ast::CmpOp::NotIn -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action190< @@ -33880,7 +35867,7 @@ fn __action190< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::CmpOp { - ast::CmpOp::Is + ast::CmpOp::In } #[allow(unused_variables)] @@ -33892,7 +35879,7 @@ fn __action191< (_, __1, _): (TextSize, token::Tok, TextSize), ) -> ast::CmpOp { - ast::CmpOp::IsNot + ast::CmpOp::NotIn } #[allow(unused_variables)] @@ -33901,9 +35888,9 @@ fn __action192< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), -) -> ast::Operator +) -> ast::CmpOp { - ast::Operator::LShift + ast::CmpOp::Is } #[allow(unused_variables)] @@ -33912,9 +35899,10 @@ fn __action193< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), -) -> ast::Operator + (_, __1, _): (TextSize, token::Tok, TextSize), +) -> ast::CmpOp { - ast::Operator::RShift + ast::CmpOp::IsNot } #[allow(unused_variables)] @@ -33925,7 +35913,7 @@ fn __action194< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Add + ast::Operator::LShift } #[allow(unused_variables)] @@ -33936,7 +35924,7 @@ fn __action195< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Sub + ast::Operator::RShift } #[allow(unused_variables)] @@ -33947,7 +35935,7 @@ fn __action196< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Mult + ast::Operator::Add } #[allow(unused_variables)] @@ -33958,7 +35946,7 @@ fn __action197< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Div + ast::Operator::Sub } #[allow(unused_variables)] @@ -33969,7 +35957,7 @@ fn __action198< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::FloorDiv + ast::Operator::Mult } #[allow(unused_variables)] @@ -33980,7 +35968,7 @@ fn __action199< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::Mod + ast::Operator::Div } #[allow(unused_variables)] @@ -33991,7 +35979,7 @@ fn __action200< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::Operator { - ast::Operator::MatMult + ast::Operator::FloorDiv } #[allow(unused_variables)] @@ -34000,9 +35988,9 @@ fn __action201< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), -) -> ast::UnaryOp +) -> ast::Operator { - ast::UnaryOp::UAdd + ast::Operator::Mod } #[allow(unused_variables)] @@ -34011,9 +35999,9 @@ fn __action202< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), -) -> ast::UnaryOp +) -> ast::Operator { - ast::UnaryOp::USub + ast::Operator::MatMult } #[allow(unused_variables)] @@ -34024,12 +36012,34 @@ fn __action203< (_, __0, _): (TextSize, token::Tok, TextSize), ) -> ast::UnaryOp { - ast::UnaryOp::Invert + ast::UnaryOp::UAdd } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action204< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> ast::UnaryOp +{ + ast::UnaryOp::USub +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action205< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> ast::UnaryOp +{ + ast::UnaryOp::Invert +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action206< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34044,7 +36054,7 @@ fn __action204< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action205< +fn __action207< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34062,7 +36072,7 @@ fn __action205< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action206< +fn __action208< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34080,7 +36090,7 @@ fn __action206< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action207< +fn __action209< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -34091,7 +36101,7 @@ fn __action207< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action208< +fn __action210< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34114,7 +36124,7 @@ fn __action208< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action209< +fn __action211< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34127,7 +36137,7 @@ fn __action209< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action210< +fn __action212< >( mode: Mode, (_, e, _): (TextSize, Vec, TextSize), @@ -34139,7 +36149,7 @@ fn __action210< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action211< +fn __action213< >( mode: Mode, (_, elements, _): (TextSize, Vec<(Option>, ast::Expr)>, TextSize), @@ -34151,7 +36161,7 @@ fn __action211< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action212< +fn __action214< >( mode: Mode, (_, e1, _): (TextSize, ast::Expr, TextSize), @@ -34164,7 +36174,7 @@ fn __action212< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action213< +fn __action215< >( mode: Mode, (_, e, _): (TextSize, (ast::Expr, ast::Expr), TextSize), @@ -34175,7 +36185,7 @@ fn __action213< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action214< +fn __action216< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -34187,7 +36197,7 @@ fn __action214< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action215< +fn __action217< >( mode: Mode, (_, e1, _): (TextSize, Vec, TextSize), @@ -34197,28 +36207,6 @@ fn __action215< e1 } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action216< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action217< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action218< @@ -34235,11 +36223,10 @@ fn __action218< fn __action219< >( mode: Mode, - (_, elements, _): (TextSize, Vec, TextSize), - (_, _, _): (TextSize, core::option::Option, TextSize), -) -> Vec + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - elements + __0 } #[allow(unused_variables)] @@ -34256,6 +36243,29 @@ fn __action220< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action221< +>( + mode: Mode, + (_, elements, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, core::option::Option, TextSize), +) -> Vec +{ + elements +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action222< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action223< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34271,7 +36281,7 @@ fn __action221< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action222< +fn __action224< >( mode: Mode, (_, c, _): (TextSize, alloc::vec::Vec, TextSize), @@ -34282,7 +36292,7 @@ fn __action222< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action223< +fn __action225< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34309,7 +36319,7 @@ fn __action223< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action224< +fn __action226< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -34320,7 +36330,7 @@ fn __action224< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action225< +fn __action227< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -34332,7 +36342,7 @@ fn __action225< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action226< +fn __action228< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34354,7 +36364,7 @@ fn __action226< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action227< +fn __action229< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34380,7 +36390,7 @@ fn __action227< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action228< +fn __action230< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34395,7 +36405,7 @@ fn __action228< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action229< +fn __action231< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34414,7 +36424,7 @@ fn __action229< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action230< +fn __action232< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34428,7 +36438,7 @@ fn __action230< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action231< +fn __action233< >( mode: Mode, (_, value, _): (TextSize, BigInt, TextSize), @@ -34439,7 +36449,7 @@ fn __action231< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action232< +fn __action234< >( mode: Mode, (_, value, _): (TextSize, f64, TextSize), @@ -34450,7 +36460,7 @@ fn __action232< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action233< +fn __action235< >( mode: Mode, (_, s, _): (TextSize, (f64, f64), TextSize), @@ -34461,7 +36471,7 @@ fn __action233< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action234< +fn __action236< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34474,7 +36484,7 @@ fn __action234< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action235< +fn __action237< >( mode: Mode, (_, __0, _): (TextSize, Vec, TextSize), @@ -34485,7 +36495,7 @@ fn __action235< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action236< +fn __action238< >( mode: Mode, __lookbehind: &TextSize, @@ -34497,7 +36507,7 @@ fn __action236< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action237< +fn __action239< >( mode: Mode, (_, mut v, _): (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), @@ -34514,7 +36524,7 @@ fn __action237< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action238< +fn __action240< >( mode: Mode, __lookbehind: &TextSize, @@ -34526,7 +36536,7 @@ fn __action238< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action239< +fn __action241< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -34537,7 +36547,7 @@ fn __action239< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action240< +fn __action242< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34556,7 +36566,7 @@ fn __action240< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action241< +fn __action243< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -34567,7 +36577,7 @@ fn __action241< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action242< +fn __action244< >( mode: Mode, (_, __0, _): (TextSize, ast::Comprehension, TextSize), @@ -34578,7 +36588,7 @@ fn __action242< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action243< +fn __action245< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -34590,7 +36600,7 @@ fn __action243< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action244< +fn __action246< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34612,7 +36622,7 @@ fn __action244< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action245< +fn __action247< >( mode: Mode, (_, e, _): (TextSize, ast::Expr, TextSize), @@ -34623,7 +36633,7 @@ fn __action245< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action246< +fn __action248< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -34639,7 +36649,7 @@ fn __action246< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action247< +fn __action249< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34661,7 +36671,7 @@ fn __action247< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action248< +fn __action250< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34678,7 +36688,7 @@ fn __action248< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action249< +fn __action251< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -34689,7 +36699,7 @@ fn __action249< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action250< +fn __action252< >( mode: Mode, (_, e, _): (TextSize, (Option>, ast::Expr), TextSize), @@ -34700,7 +36710,7 @@ fn __action250< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action251< +fn __action253< >( mode: Mode, (_, mut v, _): (TextSize, Vec<(Option>, ast::Expr)>, TextSize), @@ -34716,7 +36726,7 @@ fn __action251< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action252< +fn __action254< >( mode: Mode, (_, e, _): (TextSize, ast::Expr, TextSize), @@ -34727,7 +36737,7 @@ fn __action252< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action253< +fn __action255< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -34743,7 +36753,7 @@ fn __action253< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action254< +fn __action256< >( mode: Mode, (_, __0, _): (TextSize, Option, TextSize), @@ -34754,7 +36764,7 @@ fn __action254< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action255< +fn __action257< >( mode: Mode, __lookbehind: &TextSize, @@ -34766,7 +36776,7 @@ fn __action255< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action256< +fn __action258< >( mode: Mode, (_, e1, _): (TextSize, ast::Expr, TextSize), @@ -34779,7 +36789,7 @@ fn __action256< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action257< +fn __action259< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -34795,7 +36805,7 @@ fn __action257< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action258< +fn __action260< >( mode: Mode, (_, __0, _): (TextSize, ast::Parameters, TextSize), @@ -34806,7 +36816,7 @@ fn __action258< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action259< +fn __action261< >( mode: Mode, __lookbehind: &TextSize, @@ -34818,7 +36828,7 @@ fn __action259< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action260< +fn __action262< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34848,7 +36858,7 @@ fn __action260< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action261< +fn __action263< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34880,7 +36890,7 @@ fn __action261< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action262< +fn __action264< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34904,7 +36914,7 @@ fn __action262< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action263< +fn __action265< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -34927,7 +36937,7 @@ fn __action263< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action264< +fn __action266< >( mode: Mode, (_, e, _): (TextSize, ast::TypeParam, TextSize), @@ -34938,7 +36948,7 @@ fn __action264< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action265< +fn __action267< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -34954,7 +36964,7 @@ fn __action265< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action266< +fn __action268< >( mode: Mode, (_, __0, _): (TextSize, ast::Arguments, TextSize), @@ -34963,29 +36973,6 @@ fn __action266< Some(__0) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action267< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action268< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> core::option::Option -{ - Some(__0) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action269< @@ -34993,7 +36980,7 @@ fn __action269< mode: Mode, __lookbehind: &TextSize, __lookahead: &TextSize, -) -> core::option::Option +) -> core::option::Option { None } @@ -35001,18 +36988,6 @@ fn __action269< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action270< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action271< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -35023,7 +36998,7 @@ fn __action271< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action272< +fn __action271< >( mode: Mode, __lookbehind: &TextSize, @@ -35035,7 +37010,7 @@ fn __action272< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action273< +fn __action272< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -35045,9 +37020,44 @@ fn __action273< __0 } +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action273< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> core::option::Option +{ + Some(__0) +} + #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action274< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action275< +>( + mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action276< >( mode: Mode, (_, __0, _): (TextSize, ast::Parameters, TextSize), @@ -35058,7 +37068,7 @@ fn __action274< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action275< +fn __action277< >( mode: Mode, __lookbehind: &TextSize, @@ -35070,7 +37080,7 @@ fn __action275< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action276< +fn __action278< >( mode: Mode, (_, __0, _): (TextSize, ast::Parameters, TextSize), @@ -35081,7 +37091,7 @@ fn __action276< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action277< +fn __action279< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -35111,7 +37121,7 @@ fn __action277< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action278< +fn __action280< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -35143,7 +37153,7 @@ fn __action278< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action279< +fn __action281< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -35167,7 +37177,7 @@ fn __action279< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action280< +fn __action282< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -35190,7 +37200,7 @@ fn __action280< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action281< +fn __action283< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -35201,7 +37211,7 @@ fn __action281< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action282< +fn __action284< >( mode: Mode, __lookbehind: &TextSize, @@ -35213,7 +37223,7 @@ fn __action282< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action283< +fn __action285< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -35225,7 +37235,7 @@ fn __action283< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action284< +fn __action286< >( mode: Mode, (_, __0, _): (TextSize, ast::TypeParams, TextSize), @@ -35236,7 +37246,7 @@ fn __action284< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action285< +fn __action287< >( mode: Mode, __lookbehind: &TextSize, @@ -35248,7 +37258,7 @@ fn __action285< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action286< +fn __action288< >( mode: Mode, __lookbehind: &TextSize, @@ -35260,7 +37270,7 @@ fn __action286< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action287< +fn __action289< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -35271,7 +37281,7 @@ fn __action287< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action288< +fn __action290< >( mode: Mode, (_, e, _): (TextSize, ast::Expr, TextSize), @@ -35282,7 +37292,7 @@ fn __action288< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action289< +fn __action291< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -35298,7 +37308,7 @@ fn __action289< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action290< +fn __action292< >( mode: Mode, (_, __0, _): (TextSize, ast::WithItem, TextSize), @@ -35309,7 +37319,7 @@ fn __action290< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action291< +fn __action293< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -35321,7 +37331,7 @@ fn __action291< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action292< +fn __action294< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -35334,7 +37344,7 @@ fn __action292< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action293< +fn __action295< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -35352,7 +37362,7 @@ fn __action293< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action294< +fn __action296< >( mode: Mode, __lookbehind: &TextSize, @@ -35364,7 +37374,7 @@ fn __action294< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action295< +fn __action297< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -35375,7 +37385,7 @@ fn __action295< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action296< +fn __action298< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -35387,7 +37397,7 @@ fn __action296< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action297< +fn __action299< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -35398,45 +37408,45 @@ fn __action297< ast::WithItem { context_expr, optional_vars: None, range: (location..end_location).into() } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action298< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, context_expr, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, vars, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::WithItem -{ - { - let optional_vars = Some(Box::new(set_context(vars, ast::ExprContext::Store))); - ast::WithItem { context_expr, optional_vars, range: (location..end_location).into() } - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action299< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, context_expr, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, vars, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::WithItem -{ - { - let optional_vars = Some(Box::new(set_context(vars, ast::ExprContext::Store))); - ast::WithItem { context_expr, optional_vars, range: (location..end_location).into() } - } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action300< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, context_expr, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, vars, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::WithItem +{ + { + let optional_vars = Some(Box::new(set_context(vars, ast::ExprContext::Store))); + ast::WithItem { context_expr, optional_vars, range: (location..end_location).into() } + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action301< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, context_expr, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, vars, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::WithItem +{ + { + let optional_vars = Some(Box::new(set_context(vars, ast::ExprContext::Store))); + ast::WithItem { context_expr, optional_vars, range: (location..end_location).into() } + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action302< >( mode: Mode, (_, __0, _): (TextSize, Vec, TextSize), @@ -35447,7 +37457,7 @@ fn __action300< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action301< +fn __action303< >( mode: Mode, __lookbehind: &TextSize, @@ -35459,7 +37469,7 @@ fn __action301< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action302< +fn __action304< >( mode: Mode, (_, __0, _): (TextSize, Vec, TextSize), @@ -35471,7 +37481,7 @@ fn __action302< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action303< +fn __action305< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -35482,7 +37492,7 @@ fn __action303< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action304< +fn __action306< >( mode: Mode, __lookbehind: &TextSize, @@ -35494,7 +37504,7 @@ fn __action304< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action305< +fn __action307< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -35507,7 +37517,7 @@ fn __action305< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action306< +fn __action308< >( mode: Mode, (_, __0, _): (TextSize, ast::ExceptHandler, TextSize), @@ -35518,7 +37528,7 @@ fn __action306< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action307< +fn __action309< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -35530,7 +37540,7 @@ fn __action307< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action308< +fn __action310< >( mode: Mode, (_, __0, _): (TextSize, ast::Suite, TextSize), @@ -35541,7 +37551,7 @@ fn __action308< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action309< +fn __action311< >( mode: Mode, __lookbehind: &TextSize, @@ -35553,7 +37563,7 @@ fn __action309< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action310< +fn __action312< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -35566,7 +37576,7 @@ fn __action310< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action311< +fn __action313< >( mode: Mode, (_, __0, _): (TextSize, ast::ExceptHandler, TextSize), @@ -35577,7 +37587,7 @@ fn __action311< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action312< +fn __action314< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -35589,7 +37599,7 @@ fn __action312< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action313< +fn __action315< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -35598,29 +37608,6 @@ fn __action313< Some(__0) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action314< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action315< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Suite, TextSize), -) -> core::option::Option -{ - Some(__0) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action316< @@ -35628,7 +37615,7 @@ fn __action316< mode: Mode, __lookbehind: &TextSize, __lookahead: &TextSize, -) -> core::option::Option +) -> core::option::Option { None } @@ -35636,6 +37623,29 @@ fn __action316< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action317< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Suite, TextSize), +) -> core::option::Option +{ + Some(__0) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action318< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action319< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -35648,7 +37658,7 @@ fn __action317< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action318< +fn __action320< >( mode: Mode, (_, __0, _): (TextSize, (TextSize, ast::Suite), TextSize), @@ -35659,7 +37669,7 @@ fn __action318< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action319< +fn __action321< >( mode: Mode, __lookbehind: &TextSize, @@ -35671,7 +37681,7 @@ fn __action319< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action320< +fn __action322< >( mode: Mode, (_, __0, _): (TextSize, TextSize, TextSize), @@ -35685,7 +37695,7 @@ fn __action320< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action321< +fn __action323< >( mode: Mode, __lookbehind: &TextSize, @@ -35697,7 +37707,7 @@ fn __action321< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action322< +fn __action324< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), @@ -35708,7 +37718,7 @@ fn __action322< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action323< +fn __action325< >( mode: Mode, (_, __0, _): (TextSize, TextSize, TextSize), @@ -35723,7 +37733,7 @@ fn __action323< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action324< +fn __action326< >( mode: Mode, (_, e, _): (TextSize, (ast::Identifier, ast::Pattern), TextSize), @@ -35734,7 +37744,7 @@ fn __action324< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action325< +fn __action327< >( mode: Mode, (_, mut v, _): (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), @@ -35750,7 +37760,7 @@ fn __action325< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action326< +fn __action328< >( mode: Mode, (_, e, _): (TextSize, ast::Pattern, TextSize), @@ -35761,7 +37771,7 @@ fn __action326< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action327< +fn __action329< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -35777,7 +37787,7 @@ fn __action327< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action328< +fn __action330< >( mode: Mode, (_, e, _): (TextSize, (ast::Expr, ast::Pattern), TextSize), @@ -35788,7 +37798,7 @@ fn __action328< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action329< +fn __action331< >( mode: Mode, (_, mut v, _): (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), @@ -35804,7 +37814,7 @@ fn __action329< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action330< +fn __action332< >( mode: Mode, (_, __0, _): (TextSize, (TextSize, (String, StringKind, bool), TextSize), TextSize), @@ -35815,7 +37825,7 @@ fn __action330< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action331< +fn __action333< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), @@ -35827,7 +37837,7 @@ fn __action331< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action332< +fn __action334< >( mode: Mode, (_, __0, _): (TextSize, TextSize, TextSize), @@ -35840,7 +37850,7 @@ fn __action332< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action333< +fn __action335< >( mode: Mode, (_, mut v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -35857,7 +37867,7 @@ fn __action333< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action334< +fn __action336< >( mode: Mode, (_, __0, _): (TextSize, ast::Pattern, TextSize), @@ -35868,7 +37878,7 @@ fn __action334< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action335< +fn __action337< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -35880,7 +37890,7 @@ fn __action335< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action336< +fn __action338< >( mode: Mode, (_, __0, _): (TextSize, ast::Pattern, TextSize), @@ -35890,35 +37900,6 @@ fn __action336< __0 } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action337< ->( - mode: Mode, - (_, e1, _): (TextSize, ast::Pattern, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e2, _): (TextSize, ast::Pattern, TextSize), -) -> Vec -{ - vec![e1, e2] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action338< ->( - mode: Mode, - (_, mut v, _): (TextSize, Vec, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e, _): (TextSize, ast::Pattern, TextSize), -) -> Vec -{ - { - v.push(e); - v - } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action339< @@ -35951,6 +37932,35 @@ fn __action340< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action341< +>( + mode: Mode, + (_, e1, _): (TextSize, ast::Pattern, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Pattern, TextSize), +) -> Vec +{ + vec![e1, e2] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action342< +>( + mode: Mode, + (_, mut v, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::Pattern, TextSize), +) -> Vec +{ + { + v.push(e); + v + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action343< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -35961,7 +37971,7 @@ fn __action341< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action342< +fn __action344< >( mode: Mode, __lookbehind: &TextSize, @@ -35973,7 +37983,7 @@ fn __action342< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action343< +fn __action345< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -35984,7 +37994,7 @@ fn __action343< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action344< +fn __action346< >( mode: Mode, (_, e1, _): (TextSize, ast::Expr, TextSize), @@ -35997,7 +38007,7 @@ fn __action344< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action345< +fn __action347< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -36013,7 +38023,7 @@ fn __action345< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action346< +fn __action348< >( mode: Mode, (_, __0, _): (TextSize, ast::MatchCase, TextSize), @@ -36024,7 +38034,7 @@ fn __action346< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action347< +fn __action349< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -36036,7 +38046,69 @@ fn __action347< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action348< +fn __action350< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action351< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action352< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> token::Tok +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action353< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitOr, right: Box::new(e2), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action354< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action355< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -36047,7 +38119,7 @@ fn __action348< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action349< +fn __action356< >( mode: Mode, __lookbehind: &TextSize, @@ -36059,7 +38131,7 @@ fn __action349< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action350< +fn __action357< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -36071,7 +38143,7 @@ fn __action350< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action351< +fn __action358< >( mode: Mode, (_, e, _): (TextSize, ast::Identifier, TextSize), @@ -36082,7 +38154,7 @@ fn __action351< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action352< +fn __action359< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -36098,7 +38170,7 @@ fn __action352< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action353< +fn __action360< >( mode: Mode, (_, __0, _): (TextSize, (token::Tok, ast::Identifier), TextSize), @@ -36109,7 +38181,7 @@ fn __action353< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action354< +fn __action361< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec<(token::Tok, ast::Identifier)>, TextSize), @@ -36121,7 +38193,7 @@ fn __action354< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action355< +fn __action362< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -36133,7 +38205,7 @@ fn __action355< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action356< +fn __action363< >( mode: Mode, (_, __0, _): (TextSize, token::Tok, TextSize), @@ -36144,7 +38216,7 @@ fn __action356< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action357< +fn __action364< >( mode: Mode, __lookbehind: &TextSize, @@ -36154,93 +38226,6 @@ fn __action357< None } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action358< ->( - mode: Mode, - (_, e, _): (TextSize, ast::Alias, TextSize), -) -> Vec -{ - vec![e] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action359< ->( - mode: Mode, - (_, mut v, _): (TextSize, Vec, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e, _): (TextSize, ast::Alias, TextSize), -) -> Vec -{ - { - v.push(e); - v - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action360< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, name, _): (TextSize, ast::Identifier, TextSize), - (_, a, _): (TextSize, core::option::Option, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Alias -{ - ast::Alias { name, asname: a, range: (location..end_location).into() } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action361< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Int, TextSize), -) -> alloc::vec::Vec -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action362< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, ast::Int, TextSize), -) -> alloc::vec::Vec -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action363< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec -{ - alloc::vec![] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action364< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), -) -> alloc::vec::Vec -{ - v -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action365< @@ -36287,10 +38272,10 @@ fn __action367< fn __action368< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> core::option::Option + (_, __0, _): (TextSize, ast::Int, TextSize), +) -> alloc::vec::Vec { - Some(__0) + alloc::vec![__0] } #[allow(unused_variables)] @@ -36298,11 +38283,11 @@ fn __action368< fn __action369< >( mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, ast::Int, TextSize), +) -> alloc::vec::Vec { - None + { let mut v = v; v.push(e); v } } #[allow(unused_variables)] @@ -36310,11 +38295,11 @@ fn __action369< fn __action370< >( mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec { - __0 + alloc::vec![] } #[allow(unused_variables)] @@ -36322,10 +38307,10 @@ fn __action370< fn __action371< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> core::option::Option + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), +) -> alloc::vec::Vec { - Some(__0) + v } #[allow(unused_variables)] @@ -36333,16 +38318,45 @@ fn __action371< fn __action372< >( mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option + (_, e, _): (TextSize, ast::Alias, TextSize), +) -> Vec { - None + vec![e] } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action373< +>( + mode: Mode, + (_, mut v, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::Alias, TextSize), +) -> Vec +{ + { + v.push(e); + v + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action374< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, name, _): (TextSize, ast::Identifier, TextSize), + (_, a, _): (TextSize, core::option::Option, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Alias +{ + ast::Alias { name, asname: a, range: (location..end_location).into() } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action375< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -36353,7 +38367,7 @@ fn __action373< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action374< +fn __action376< >( mode: Mode, __lookbehind: &TextSize, @@ -36363,46 +38377,12 @@ fn __action374< None } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action375< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, body, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, test, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, orelse, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::IfExp( - ast::ExprIfExp { - test: Box::new(test), - body: Box::new(body), - orelse: Box::new(orelse), - range: (location..end_location).into() - } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action376< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action377< >( mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), (_, __0, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { @@ -36414,11 +38394,10 @@ fn __action377< fn __action378< >( mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> core::option::Option { - alloc::vec![] + Some(__0) } #[allow(unused_variables)] @@ -36426,10 +38405,11 @@ fn __action378< fn __action379< >( mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), -) -> alloc::vec::Vec + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option { - v + None } #[allow(unused_variables)] @@ -36437,8 +38417,8 @@ fn __action379< fn __action380< >( mode: Mode, - (_, __0, _): (TextSize, token::Tok, TextSize), -) -> core::option::Option + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> core::option::Option { Some(__0) } @@ -36450,7 +38430,7 @@ fn __action381< mode: Mode, __lookbehind: &TextSize, __lookahead: &TextSize, -) -> core::option::Option +) -> core::option::Option { None } @@ -36458,270 +38438,6 @@ fn __action381< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action382< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec -{ - alloc::vec![] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action383< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), -) -> alloc::vec::Vec -{ - v -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action384< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Stmt, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), -) -> ast::Stmt -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action385< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec -{ - alloc::vec![] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action386< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), -) -> alloc::vec::Vec -{ - v -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action387< ->( - mode: Mode, - (_, __0, _): (TextSize, token::Tok, TextSize), -) -> token::Tok -{ - __0 -} - -#[allow(unused_variables)] -fn __action388< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> TextSize -{ - *__lookbehind -} - -#[allow(unused_variables)] -fn __action389< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> TextSize -{ - *__lookahead -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action390< ->( - mode: Mode, - (_, __0, _): (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action391< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action392< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Stmt, TextSize), -) -> alloc::vec::Vec -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action393< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, ast::Stmt, TextSize), -) -> alloc::vec::Vec -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action394< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action395< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action396< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Identifier, TextSize), -) -> core::option::Option -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action397< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action398< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, ast::Identifier, TextSize), -) -> ast::Identifier -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action399< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Pattern, TextSize), -) -> core::option::Option -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action400< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action401< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec -{ - alloc::vec![] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action402< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), -) -> alloc::vec::Vec -{ - v -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action403< ->( - mode: Mode, - (_, __0, _): (TextSize, (TextSize, ast::Expr, ast::Suite), TextSize), -) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action404< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), - (_, e, _): (TextSize, (TextSize, ast::Expr, ast::Suite), TextSize), -) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action405< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -36745,7 +38461,7 @@ fn __action405< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action406< +fn __action383< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -36754,6 +38470,275 @@ fn __action406< __0 } +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action384< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action385< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec +{ + alloc::vec![] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action386< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), +) -> alloc::vec::Vec +{ + v +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action387< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> core::option::Option +{ + Some(__0) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action388< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action389< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec +{ + alloc::vec![] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action390< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), +) -> alloc::vec::Vec +{ + v +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action391< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Stmt, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action392< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec +{ + alloc::vec![] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action393< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), +) -> alloc::vec::Vec +{ + v +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action394< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> token::Tok +{ + __0 +} + +#[allow(unused_variables)] +fn __action395< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> TextSize +{ + *__lookbehind +} + +#[allow(unused_variables)] +fn __action396< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> TextSize +{ + *__lookahead +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action397< +>( + mode: Mode, + (_, __0, _): (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action398< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action399< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Stmt, TextSize), +) -> alloc::vec::Vec +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action400< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, ast::Stmt, TextSize), +) -> alloc::vec::Vec +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action401< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action402< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action403< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Identifier, TextSize), +) -> core::option::Option +{ + Some(__0) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action404< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action405< +>( + mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), + (_, __0, _): (TextSize, ast::Identifier, TextSize), +) -> ast::Identifier +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action406< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitXor, right: Box::new(e2), range: (location..end_location).into() } + ) +} + #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action407< @@ -36768,6 +38753,121 @@ fn __action407< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action408< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Pattern, TextSize), +) -> core::option::Option +{ + Some(__0) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action409< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action410< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec +{ + alloc::vec![] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action411< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), +) -> alloc::vec::Vec +{ + v +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action412< +>( + mode: Mode, + (_, __0, _): (TextSize, (TextSize, ast::Expr, ast::Suite), TextSize), +) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action413< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), + (_, e, _): (TextSize, (TextSize, ast::Expr, ast::Suite), TextSize), +) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action414< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, body, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, test, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, orelse, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::IfExp( + ast::ExprIfExp { + test: Box::new(test), + body: Box::new(body), + orelse: Box::new(orelse), + range: (location..end_location).into() + } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action415< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action416< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action417< >( mode: Mode, (_, __0, _): (TextSize, ast::Decorator, TextSize), @@ -36778,7 +38878,7 @@ fn __action408< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action409< +fn __action418< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -36788,152 +38888,35 @@ fn __action409< { let mut v = v; v.push(e); v } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action410< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, Option>, TextSize), -) -> Option> -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action411< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, kwarg, _): (TextSize, core::option::Option, TextSize), -) -> Option> -{ - { - kwarg.map(Box::new) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action412< ->( - mode: Mode, - (_, __0, _): (TextSize, (Option>, Vec, Option>), TextSize), -) -> core::option::Option<(Option>, Vec, Option>)> -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action413< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option<(Option>, Vec, Option>)> -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action414< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, (Option>, Vec, Option>), TextSize), -) -> (Option>, Vec, Option>) -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action415< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, va, _): (TextSize, core::option::Option, TextSize), - (_, kwonlyargs, _): (TextSize, alloc::vec::Vec, TextSize), - (_, kwarg, _): (TextSize, core::option::Option>>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - { - if va.is_none() && kwonlyargs.is_empty() && kwarg.is_none() { - return Err(LexicalError { - error: LexicalErrorType::OtherError("named arguments must follow bare *".to_string()), - location, - })?; - } - - let kwarg = kwarg.flatten(); - let va = va.map(Box::new); - - Ok((va, kwonlyargs, kwarg)) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action416< ->( - mode: Mode, - (_, args, _): (TextSize, Vec, TextSize), -) -> (Vec, Vec) -{ - { - (vec![], args) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action417< ->( - mode: Mode, - (_, posonlyargs, _): (TextSize, Vec, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, args, _): (TextSize, alloc::vec::Vec, TextSize), -) -> (Vec, Vec) -{ - { - (posonlyargs, args) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action418< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, Option>, TextSize), -) -> Option> -{ - __0 -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action419< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), - (_, kwarg, _): (TextSize, core::option::Option, TextSize), + (_, __0, _): (TextSize, Option>, TextSize), ) -> Option> { - { - kwarg.map(Box::new) - } + __0 } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action420< +>( + mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), + (_, kwarg, _): (TextSize, core::option::Option, TextSize), +) -> Option> +{ + { + kwarg.map(Box::new) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action421< >( mode: Mode, (_, __0, _): (TextSize, (Option>, Vec, Option>), TextSize), @@ -36944,7 +38927,7 @@ fn __action420< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action421< +fn __action422< >( mode: Mode, __lookbehind: &TextSize, @@ -36956,7 +38939,7 @@ fn __action421< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action422< +fn __action423< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -36968,7 +38951,7 @@ fn __action422< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action423< +fn __action424< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -36993,22 +38976,22 @@ fn __action423< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action424< ->( - mode: Mode, - (_, args, _): (TextSize, Vec, TextSize), -) -> (Vec, Vec) -{ - { - (vec![], args) - } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action425< +>( + mode: Mode, + (_, args, _): (TextSize, Vec, TextSize), +) -> (Vec, Vec) +{ + { + (vec![], args) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action426< >( mode: Mode, (_, posonlyargs, _): (TextSize, Vec, TextSize), @@ -37024,7 +39007,124 @@ fn __action425< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action426< +fn __action427< +>( + mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), + (_, __0, _): (TextSize, Option>, TextSize), +) -> Option> +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action428< +>( + mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), + (_, kwarg, _): (TextSize, core::option::Option, TextSize), +) -> Option> +{ + { + kwarg.map(Box::new) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action429< +>( + mode: Mode, + (_, __0, _): (TextSize, (Option>, Vec, Option>), TextSize), +) -> core::option::Option<(Option>, Vec, Option>)> +{ + Some(__0) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action430< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option<(Option>, Vec, Option>)> +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action431< +>( + mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), + (_, __0, _): (TextSize, (Option>, Vec, Option>), TextSize), +) -> (Option>, Vec, Option>) +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action432< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, va, _): (TextSize, core::option::Option, TextSize), + (_, kwonlyargs, _): (TextSize, alloc::vec::Vec, TextSize), + (_, kwarg, _): (TextSize, core::option::Option>>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + { + if va.is_none() && kwonlyargs.is_empty() && kwarg.is_none() { + return Err(LexicalError { + error: LexicalErrorType::OtherError("named arguments must follow bare *".to_string()), + location, + })?; + } + + let kwarg = kwarg.flatten(); + let va = va.map(Box::new); + + Ok((va, kwonlyargs, kwarg)) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action433< +>( + mode: Mode, + (_, args, _): (TextSize, Vec, TextSize), +) -> (Vec, Vec) +{ + { + (vec![], args) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action434< +>( + mode: Mode, + (_, posonlyargs, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, args, _): (TextSize, alloc::vec::Vec, TextSize), +) -> (Vec, Vec) +{ + { + (posonlyargs, args) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action435< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -37041,7 +39141,7 @@ fn __action426< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action427< +fn __action436< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37052,7 +39152,7 @@ fn __action427< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action428< +fn __action437< >( mode: Mode, (_, e, _): (TextSize, ast::Expr, TextSize), @@ -37063,7 +39163,7 @@ fn __action428< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action429< +fn __action438< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -37079,7 +39179,7 @@ fn __action429< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action430< +fn __action439< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37090,7 +39190,7 @@ fn __action430< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action431< +fn __action440< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -37102,7 +39202,7 @@ fn __action431< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action432< +fn __action441< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37114,7 +39214,7 @@ fn __action432< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action433< +fn __action442< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -37133,7 +39233,7 @@ fn __action433< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action434< +fn __action443< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37142,110 +39242,6 @@ fn __action434< __0 } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action435< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action436< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action437< ->( - mode: Mode, - (_, __0, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), -) -> core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action438< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action439< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - alloc::vec![] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action440< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), -) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - v -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action441< ->( - mode: Mode, - (_, __0, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action442< ->( - mode: Mode, - (_, __0, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), -) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action443< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - (_, e, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), -) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - { let mut v = v; v.push(e); v } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action444< @@ -37272,6 +39268,110 @@ fn __action445< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action446< +>( + mode: Mode, + (_, __0, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), +) -> core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)> +{ + Some(__0) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action447< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)> +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action448< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> +{ + alloc::vec![] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action449< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), +) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> +{ + v +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action450< +>( + mode: Mode, + (_, __0, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action451< +>( + mode: Mode, + (_, __0, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), +) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action452< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), + (_, e, _): (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), +) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action453< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action454< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action455< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37283,7 +39383,7 @@ fn __action446< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action447< +fn __action456< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -37299,7 +39399,7 @@ fn __action447< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action448< +fn __action457< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37310,35 +39410,7 @@ fn __action448< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action449< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e1, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e2, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitAnd, right: Box::new(e2), range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action450< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action451< +fn __action458< >( mode: Mode, (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), @@ -37349,7 +39421,7 @@ fn __action451< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action452< +fn __action459< >( mode: Mode, (_, mut v, _): (TextSize, Vec, TextSize), @@ -37365,7 +39437,7 @@ fn __action452< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action453< +fn __action460< >( mode: Mode, (_, __0, _): (TextSize, Option>, TextSize), @@ -37374,93 +39446,6 @@ fn __action453< Some(__0) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action454< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option>> -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action455< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec -{ - alloc::vec![] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action456< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), -) -> alloc::vec::Vec -{ - v -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action457< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> ast::ParameterWithDefault -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action458< ->( - mode: Mode, - (_, i, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> ast::ParameterWithDefault -{ - i -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action459< ->( - mode: Mode, - (_, mut i, _): (TextSize, ast::ParameterWithDefault, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::ParameterWithDefault -{ - { - i.default = Some(Box::new(e)); - i.range = (i.range.start()..end_location).into(); - i - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action460< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Parameter, TextSize), -) -> core::option::Option -{ - Some(__0) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action461< @@ -37468,7 +39453,7 @@ fn __action461< mode: Mode, __lookbehind: &TextSize, __lookahead: &TextSize, -) -> core::option::Option +) -> core::option::Option>> { None } @@ -37476,56 +39461,6 @@ fn __action461< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action462< ->( - mode: Mode, - (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> Vec -{ - vec![e] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action463< ->( - mode: Mode, - (_, mut v, _): (TextSize, Vec, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> Vec -{ - { - v.push(e); - v - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action464< ->( - mode: Mode, - (_, __0, _): (TextSize, Option>, TextSize), -) -> core::option::Option>> -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action465< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option>> -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action466< >( mode: Mode, __lookbehind: &TextSize, @@ -37537,7 +39472,7 @@ fn __action466< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action467< +fn __action463< >( mode: Mode, (_, v, _): (TextSize, alloc::vec::Vec, TextSize), @@ -37548,7 +39483,7 @@ fn __action467< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action468< +fn __action464< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -37560,7 +39495,7 @@ fn __action468< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action469< +fn __action465< >( mode: Mode, (_, i, _): (TextSize, ast::ParameterWithDefault, TextSize), @@ -37571,7 +39506,7 @@ fn __action469< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action470< +fn __action466< >( mode: Mode, (_, mut i, _): (TextSize, ast::ParameterWithDefault, TextSize), @@ -37589,7 +39524,7 @@ fn __action470< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action471< +fn __action467< >( mode: Mode, (_, __0, _): (TextSize, ast::Parameter, TextSize), @@ -37598,6 +39533,56 @@ fn __action471< Some(__0) } +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action468< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action469< +>( + mode: Mode, + (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> Vec +{ + vec![e] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action470< +>( + mode: Mode, + (_, mut v, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> Vec +{ + { + v.push(e); + v + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action471< +>( + mode: Mode, + (_, __0, _): (TextSize, Option>, TextSize), +) -> core::option::Option>> +{ + Some(__0) +} + #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action472< @@ -37605,7 +39590,7 @@ fn __action472< mode: Mode, __lookbehind: &TextSize, __lookahead: &TextSize, -) -> core::option::Option +) -> core::option::Option>> { None } @@ -37613,6 +39598,70 @@ fn __action472< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action473< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec +{ + alloc::vec![] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action474< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), +) -> alloc::vec::Vec +{ + v +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action475< +>( + mode: Mode, + (_, _, _): (TextSize, token::Tok, TextSize), + (_, __0, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> ast::ParameterWithDefault +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action476< +>( + mode: Mode, + (_, i, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> ast::ParameterWithDefault +{ + i +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action477< +>( + mode: Mode, + (_, mut i, _): (TextSize, ast::ParameterWithDefault, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::ParameterWithDefault +{ + { + i.default = Some(Box::new(e)); + i.range = (i.range.start()..end_location).into(); + i + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action478< >( mode: Mode, (_, __0, _): (TextSize, ast::Parameter, TextSize), @@ -37623,7 +39672,7 @@ fn __action473< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action474< +fn __action479< >( mode: Mode, __lookbehind: &TextSize, @@ -37635,7 +39684,30 @@ fn __action474< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action475< +fn __action480< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Parameter, TextSize), +) -> core::option::Option +{ + Some(__0) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action481< +>( + mode: Mode, + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option +{ + None +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action482< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -37654,7 +39726,7 @@ fn __action475< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action476< +fn __action483< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37665,26 +39737,24 @@ fn __action476< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action477< +fn __action484< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), - (_, mut values, _): (TextSize, alloc::vec::Vec, TextSize), - (_, last, _): (TextSize, ast::Expr, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - { - values.push(last); - ast::Expr::BoolOp( - ast::ExprBoolOp { op: ast::BoolOp::And, values, range: (location..end_location).into() } - ) - } + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitAnd, right: Box::new(e2), range: (location..end_location).into() } + ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action478< +fn __action485< >( mode: Mode, (_, __0, _): (TextSize, ast::Expr, TextSize), @@ -37695,53 +39765,35 @@ fn __action478< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action479< +fn __action486< >( mode: Mode, - (_, __0, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> alloc::vec::Vec + (_, location, _): (TextSize, TextSize, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - alloc::vec![__0] + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitAnd, right: Box::new(e2), range: (location..end_location).into() } + ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action480< +fn __action487< >( mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> alloc::vec::Vec + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - { let mut v = v; v.push(e); v } + __0 } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action481< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> alloc::vec::Vec -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action482< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), -) -> alloc::vec::Vec -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action483< +fn __action488< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -37756,80 +39808,15 @@ fn __action483< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action484< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action485< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, left, _): (TextSize, ast::Expr, TextSize), - (_, comparisons, _): (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - { - let (ops, comparators) = comparisons.into_iter().unzip(); - ast::Expr::Compare( - ast::ExprCompare { left: Box::new(left), ops, comparators, range: (location..end_location).into() } - ) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action486< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action487< ->( - mode: Mode, - (_, __0, _): (TextSize, (ast::CmpOp, ast::Expr), TextSize), -) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action488< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), - (_, e, _): (TextSize, (ast::CmpOp, ast::Expr), TextSize), -) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> -{ - { let mut v = v; v.push(e); v } -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action489< >( mode: Mode, - (_, __0, _): (TextSize, ast::CmpOp, TextSize), - (_, __1, _): (TextSize, ast::Expr, TextSize), -) -> (ast::CmpOp, ast::Expr) + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - (__0, __1) + __0 } #[allow(unused_variables)] @@ -37838,14 +39825,14 @@ fn __action490< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), - (_, a, _): (TextSize, ast::Expr, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), (_, op, _): (TextSize, ast::Operator, TextSize), - (_, b, _): (TextSize, ast::Expr, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } + ast::ExprBinOp { left: Box::new(e1), op, right: Box::new(e2), range: (location..end_location).into() } ) } @@ -37866,14 +39853,17 @@ fn __action492< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), + (_, mut values, _): (TextSize, alloc::vec::Vec, TextSize), + (_, last, _): (TextSize, ast::Expr, TextSize), (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - ast::Expr::UnaryOp( - ast::ExprUnaryOp { operand: Box::new(e), op: ast::UnaryOp::Not, range: (location..end_location).into() } - ) + { + values.push(last); + ast::Expr::BoolOp( + ast::ExprBoolOp { op: ast::BoolOp::And, values, range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -37890,6 +39880,52 @@ fn __action493< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action494< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> alloc::vec::Vec +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action495< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> alloc::vec::Vec +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action496< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> alloc::vec::Vec +{ + alloc::vec![__0] +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action497< +>( + mode: Mode, + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, ast::ParameterWithDefault, TextSize), +) -> alloc::vec::Vec +{ + { let mut v = v; v.push(e); v } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action498< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -37906,61 +39942,6 @@ fn __action494< } } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action495< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action496< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, a, _): (TextSize, ast::Expr, TextSize), - (_, op, _): (TextSize, ast::Operator, TextSize), - (_, b, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action497< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action498< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, op, _): (TextSize, ast::UnaryOp, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::UnaryOp( - ast::ExprUnaryOp { operand: Box::new(e), op, range: (location..end_location).into() } - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action499< @@ -37977,16 +39958,10 @@ fn __action499< fn __action500< >( mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e1, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e2, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr + (_, __0, _): (TextSize, (ast::CmpOp, ast::Expr), TextSize), +) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> { - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitOr, right: Box::new(e2), range: (location..end_location).into() } - ) + alloc::vec![__0] } #[allow(unused_variables)] @@ -37994,10 +39969,11 @@ fn __action500< fn __action501< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr + (_, v, _): (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), + (_, e, _): (TextSize, (ast::CmpOp, ast::Expr), TextSize), +) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> { - __0 + { let mut v = v; v.push(e); v } } #[allow(unused_variables)] @@ -38005,16 +39981,11 @@ fn __action501< fn __action502< >( mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e1, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e2, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr + (_, __0, _): (TextSize, ast::CmpOp, TextSize), + (_, __1, _): (TextSize, ast::Expr, TextSize), +) -> (ast::CmpOp, ast::Expr) { - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitXor, right: Box::new(e2), range: (location..end_location).into() } - ) + (__0, __1) } #[allow(unused_variables)] @@ -38022,10 +39993,15 @@ fn __action502< fn __action503< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - __0 + ast::Expr::UnaryOp( + ast::ExprUnaryOp { operand: Box::new(e), op: ast::UnaryOp::Not, range: (location..end_location).into() } + ) } #[allow(unused_variables)] @@ -38033,16 +40009,10 @@ fn __action503< fn __action504< >( mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, b, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(e), op: ast::Operator::Pow, right: Box::new(b), range: (location..end_location).into() } - ) + __0 } #[allow(unused_variables)] @@ -38050,10 +40020,16 @@ fn __action504< fn __action505< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, a, _): (TextSize, ast::Expr, TextSize), + (_, op, _): (TextSize, ast::Operator, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - __0 + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } + ) } #[allow(unused_variables)] @@ -38061,17 +40037,10 @@ fn __action505< fn __action506< >( mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, atom, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - { - ast::Expr::Await( - ast::ExprAwait { value: Box::new(atom), range: (location..end_location).into() } - ) - } + __0 } #[allow(unused_variables)] @@ -38079,10 +40048,16 @@ fn __action506< fn __action507< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, a, _): (TextSize, ast::Expr, TextSize), + (_, op, _): (TextSize, ast::Operator, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - __0 + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } + ) } #[allow(unused_variables)] @@ -38090,16 +40065,10 @@ fn __action507< fn __action508< >( mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e1, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, e2, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitAnd, right: Box::new(e2), range: (location..end_location).into() } - ) + __0 } #[allow(unused_variables)] @@ -38107,10 +40076,16 @@ fn __action508< fn __action509< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, a, _): (TextSize, ast::Expr, TextSize), + (_, op, _): (TextSize, ast::Operator, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - __0 + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } + ) } #[allow(unused_variables)] @@ -38118,16 +40093,10 @@ fn __action509< fn __action510< >( mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e1, _): (TextSize, ast::Expr, TextSize), - (_, op, _): (TextSize, ast::Operator, TextSize), - (_, e2, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(e1), op, right: Box::new(e2), range: (location..end_location).into() } - ) + __0 } #[allow(unused_variables)] @@ -38135,10 +40104,16 @@ fn __action510< fn __action511< >( mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, a, _): (TextSize, ast::Expr, TextSize), + (_, op, _): (TextSize, ast::Operator, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - __0 + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } + ) } #[allow(unused_variables)] @@ -38155,6 +40130,299 @@ fn __action512< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action513< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, left, _): (TextSize, ast::Expr, TextSize), + (_, comparisons, _): (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + { + let (ops, comparators) = comparisons.into_iter().unzip(); + ast::Expr::Compare( + ast::ExprCompare { left: Box::new(left), ops, comparators, range: (location..end_location).into() } + ) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action514< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action515< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitOr, right: Box::new(e2), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action516< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action517< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, op, _): (TextSize, ast::UnaryOp, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::UnaryOp( + ast::ExprUnaryOp { operand: Box::new(e), op, range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action518< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action519< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, op, _): (TextSize, ast::UnaryOp, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::UnaryOp( + ast::ExprUnaryOp { operand: Box::new(e), op, range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action520< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action521< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e), op: ast::Operator::Pow, right: Box::new(b), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action522< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action523< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e), op: ast::Operator::Pow, right: Box::new(b), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action524< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action525< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitXor, right: Box::new(e2), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action526< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action527< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op: ast::Operator::BitAnd, right: Box::new(e2), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action528< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action529< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, atom, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + { + ast::Expr::Await( + ast::ExprAwait { value: Box::new(atom), range: (location..end_location).into() } + ) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action530< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action531< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, atom, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + { + ast::Expr::Await( + ast::ExprAwait { value: Box::new(atom), range: (location..end_location).into() } + ) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action532< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action533< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action534< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38172,7 +40440,7 @@ fn __action513< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action514< +fn __action535< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38190,7 +40458,7 @@ fn __action514< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action515< +fn __action536< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38207,7 +40475,127 @@ fn __action515< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action516< +fn __action537< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action538< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, f, _): (TextSize, ast::Expr, TextSize), + (_, arguments, _): (TextSize, ast::Arguments, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + { + ast::Expr::Call( + ast::ExprCall { func: Box::new(f), arguments, range: (location..end_location).into() } + ) + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action539< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, s, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::Subscript( + ast::ExprSubscript { value: Box::new(e), slice: Box::new(s), ctx: ast::ExprContext::Load, range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action540< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, attr, _): (TextSize, ast::Identifier, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::Attribute( + ast::ExprAttribute { value: Box::new(e), attr, ctx: ast::ExprContext::Load, range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action541< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, e1, _): (TextSize, ast::Expr, TextSize), + (_, op, _): (TextSize, ast::Operator, TextSize), + (_, e2, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e1), op, right: Box::new(e2), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action542< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action543< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, a, _): (TextSize, ast::Expr, TextSize), + (_, op, _): (TextSize, ast::Operator, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action544< +>( + mode: Mode, + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + __0 +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action545< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38219,7 +40607,7 @@ fn __action516< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action517< +fn __action546< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38234,7 +40622,7 @@ fn __action517< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action518< +fn __action547< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38249,7 +40637,7 @@ fn __action518< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action519< +fn __action548< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38269,7 +40657,7 @@ fn __action519< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action520< +fn __action549< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38289,7 +40677,7 @@ fn __action520< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action521< +fn __action550< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38313,7 +40701,7 @@ fn __action521< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action522< +fn __action551< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38346,7 +40734,7 @@ fn __action522< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action523< +fn __action552< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38362,7 +40750,7 @@ fn __action523< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action524< +fn __action553< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -38375,7 +40763,7 @@ fn __action524< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action525< +fn __action554< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38395,7 +40783,7 @@ fn __action525< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action526< +fn __action555< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -38416,7 +40804,7 @@ fn __action526< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action527< +fn __action556< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38440,7 +40828,7 @@ fn __action527< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action528< +fn __action557< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38465,7 +40853,7 @@ fn __action528< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action529< +fn __action558< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38482,7 +40870,7 @@ fn __action529< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action530< +fn __action559< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38502,7 +40890,7 @@ fn __action530< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action531< +fn __action560< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38515,7 +40903,7 @@ fn __action531< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action532< +fn __action561< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38528,7 +40916,7 @@ fn __action532< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action533< +fn __action562< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38541,7 +40929,7 @@ fn __action533< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action534< +fn __action563< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38554,350 +40942,7 @@ fn __action534< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action535< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, a, _): (TextSize, ast::Expr, TextSize), - (_, op, _): (TextSize, ast::Operator, TextSize), - (_, b, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action536< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action537< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, a, _): (TextSize, ast::Expr, TextSize), - (_, op, _): (TextSize, ast::Operator, TextSize), - (_, b, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action538< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action539< ->( - mode: Mode, - (_, __0, _): (TextSize, Vec<(Option>, ast::Expr)>, TextSize), -) -> core::option::Option>, ast::Expr)>> -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action540< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option>, ast::Expr)>> -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action541< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> alloc::vec::Vec -{ - alloc::vec![] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action542< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), -) -> alloc::vec::Vec -{ - v -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action543< ->( - mode: Mode, - (_, _, _): (TextSize, token::Tok, TextSize), - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action544< ->( - mode: Mode, - (_, __0, _): (TextSize, Vec, TextSize), -) -> core::option::Option> -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action545< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option> -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action546< ->( - mode: Mode, - (_, __0, _): (TextSize, Vec, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), -) -> Vec -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action547< ->( - mode: Mode, - (_, __0, _): (TextSize, Vec, TextSize), -) -> core::option::Option> -{ - Some(__0) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action548< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> core::option::Option> -{ - None -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action549< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec -{ - alloc::vec![__0] -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action550< ->( - mode: Mode, - (_, v, _): (TextSize, alloc::vec::Vec, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec -{ - { let mut v = v; v.push(e); v } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action551< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, op, _): (TextSize, ast::UnaryOp, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::UnaryOp( - ast::ExprUnaryOp { operand: Box::new(e), op, range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action552< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action553< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, b, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::BinOp( - ast::ExprBinOp { left: Box::new(e), op: ast::Operator::Pow, right: Box::new(b), range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action554< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action555< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, atom, _): (TextSize, ast::Expr, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - { - ast::Expr::Await( - ast::ExprAwait { value: Box::new(atom), range: (location..end_location).into() } - ) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action556< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action557< ->( - mode: Mode, - (_, __0, _): (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - __0 -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action558< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, f, _): (TextSize, ast::Expr, TextSize), - (_, arguments, _): (TextSize, ast::Arguments, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - { - ast::Expr::Call( - ast::ExprCall { func: Box::new(f), arguments, range: (location..end_location).into() } - ) - } -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action559< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, s, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::Subscript( - ast::ExprSubscript { value: Box::new(e), slice: Box::new(s), ctx: ast::ExprContext::Load, range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action560< ->( - mode: Mode, - (_, location, _): (TextSize, TextSize, TextSize), - (_, e, _): (TextSize, ast::Expr, TextSize), - (_, _, _): (TextSize, token::Tok, TextSize), - (_, attr, _): (TextSize, ast::Identifier, TextSize), - (_, end_location, _): (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - ast::Expr::Attribute( - ast::ExprAttribute { value: Box::new(e), attr, ctx: ast::ExprContext::Load, range: (location..end_location).into() } - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action561< +fn __action564< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38909,7 +40954,7 @@ fn __action561< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action562< +fn __action565< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38924,7 +40969,7 @@ fn __action562< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action563< +fn __action566< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38939,7 +40984,7 @@ fn __action563< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action564< +fn __action567< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38959,7 +41004,7 @@ fn __action564< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action565< +fn __action568< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -38979,7 +41024,31 @@ fn __action565< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action566< +fn __action569< +>( + mode: Mode, + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, elts, _): (TextSize, Vec, TextSize), + (_, trailing_comma, _): (TextSize, core::option::Option, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + { + if elts.len() == 1 && trailing_comma.is_none() { + elts.into_iter().next().unwrap() + } else { + ast::Expr::Tuple( + ast::ExprTuple { elts, ctx: ast::ExprContext::Load, range: (location..end_location).into() } + ) + } + } +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action570< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39012,7 +41081,7 @@ fn __action566< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action567< +fn __action571< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39028,7 +41097,7 @@ fn __action567< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action568< +fn __action572< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -39041,7 +41110,7 @@ fn __action568< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action569< +fn __action573< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39061,7 +41130,7 @@ fn __action569< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action570< +fn __action574< >( mode: Mode, (_, _, _): (TextSize, token::Tok, TextSize), @@ -39082,7 +41151,7 @@ fn __action570< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action571< +fn __action575< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39106,7 +41175,7 @@ fn __action571< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action572< +fn __action576< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39131,7 +41200,7 @@ fn __action572< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action573< +fn __action577< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39148,7 +41217,7 @@ fn __action573< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action574< +fn __action578< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39168,7 +41237,7 @@ fn __action574< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action575< +fn __action579< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39181,7 +41250,7 @@ fn __action575< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action576< +fn __action580< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39194,7 +41263,7 @@ fn __action576< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action577< +fn __action581< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39207,7 +41276,7 @@ fn __action577< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action578< +fn __action582< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), @@ -39218,171 +41287,15 @@ fn __action578< ast::Expr::Constant(ast::ExprConstant { value: ast::Constant::Ellipsis, kind: None, range: (location..end_location).into() }) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action579< ->( - mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action521( - mode, - __0, - __1, - __2, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action580< ->( - mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action521( - mode, - __0, - __1, - __2, - __temp0, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action581< ->( - mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, core::option::Option>, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __5.0; - let __end0 = __5.2; - let __temp0 = __action356( - mode, - __5, - ); - let __temp0 = (__start0, __temp0, __end0); - __action522( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action582< ->( - mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, core::option::Option>, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __4.2; - let __end0 = __5.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action522( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - __5, - __6, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action583< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, core::option::Option>, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> Result> + (_, __0, _): (TextSize, Vec<(Option>, ast::Expr)>, TextSize), +) -> core::option::Option>, ast::Expr)>> { - let __start0 = __5.0; - let __end0 = __5.2; - let __temp0 = __action356( - mode, - __5, - ); - let __temp0 = (__start0, __temp0, __end0); - __action566( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - __6, - __7, - ) + Some(__0) } #[allow(unused_variables)] @@ -39390,34 +41303,11 @@ fn __action583< fn __action584< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, core::option::Option>, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option>, ast::Expr)>> { - let __start0 = __4.2; - let __end0 = __5.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action566( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - __5, - __6, - ) + None } #[allow(unused_variables)] @@ -39425,36 +41315,11 @@ fn __action584< fn __action585< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> alloc::vec::Vec { - let __start0 = __6.0; - let __end0 = __6.2; - let __temp0 = __action356( - mode, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action137( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - __7, - __8, - ) + alloc::vec![] } #[allow(unused_variables)] @@ -39462,36 +41327,10 @@ fn __action585< fn __action586< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), +) -> alloc::vec::Vec { - let __start0 = __5.2; - let __end0 = __6.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action137( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - __6, - __7, - ) + v } #[allow(unused_variables)] @@ -39499,32 +41338,11 @@ fn __action586< fn __action587< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, _, _): (TextSize, token::Tok, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action356( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action138( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - __6, - ) + __0 } #[allow(unused_variables)] @@ -39532,32 +41350,10 @@ fn __action587< fn __action588< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, __0, _): (TextSize, Vec, TextSize), +) -> core::option::Option> { - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action138( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) + Some(__0) } #[allow(unused_variables)] @@ -39565,32 +41361,11 @@ fn __action588< fn __action589< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option> { - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action356( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action139( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - __6, - ) + None } #[allow(unused_variables)] @@ -39598,32 +41373,11 @@ fn __action589< fn __action590< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, __0, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), +) -> Vec { - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action139( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) + __0 } #[allow(unused_variables)] @@ -39631,36 +41385,10 @@ fn __action590< fn __action591< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, __0, _): (TextSize, Vec, TextSize), +) -> core::option::Option> { - let __start0 = __6.0; - let __end0 = __6.2; - let __temp0 = __action356( - mode, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action141( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - __7, - __8, - ) + Some(__0) } #[allow(unused_variables)] @@ -39668,36 +41396,11 @@ fn __action591< fn __action592< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> core::option::Option> { - let __start0 = __5.2; - let __end0 = __6.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action141( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - __6, - __7, - ) + None } #[allow(unused_variables)] @@ -39705,31 +41408,15 @@ fn __action592< fn __action593< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, location, _): (TextSize, TextSize, TextSize), + (_, a, _): (TextSize, ast::Expr, TextSize), + (_, op, _): (TextSize, ast::Operator, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action356( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action142( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - __6, + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(a), op, right: Box::new(b), range: (location..end_location).into() } ) } @@ -39738,32 +41425,10 @@ fn __action593< fn __action594< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action142( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) + __0 } #[allow(unused_variables)] @@ -39771,31 +41436,14 @@ fn __action594< fn __action595< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, location, _): (TextSize, TextSize, TextSize), + (_, op, _): (TextSize, ast::UnaryOp, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action356( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action143( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - __6, + ast::Expr::UnaryOp( + ast::ExprUnaryOp { operand: Box::new(e), op, range: (location..end_location).into() } ) } @@ -39804,32 +41452,10 @@ fn __action595< fn __action596< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action143( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) + __0 } #[allow(unused_variables)] @@ -39837,22 +41463,10 @@ fn __action596< fn __action597< >( mode: Mode, - __0: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Vec<(Option>, ast::Expr)> + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action356( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action211( - mode, - __0, - __temp0, - ) + alloc::vec![__0] } #[allow(unused_variables)] @@ -39860,22 +41474,11 @@ fn __action597< fn __action598< >( mode: Mode, - __0: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), -) -> Vec<(Option>, ast::Expr)> + (_, v, _): (TextSize, alloc::vec::Vec, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action211( - mode, - __0, - __temp0, - ) + { let mut v = v; v.push(e); v } } #[allow(unused_variables)] @@ -39883,21 +41486,15 @@ fn __action598< fn __action599< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Vec + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, b, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action356( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action219( - mode, - __0, - __temp0, + ast::Expr::BinOp( + ast::ExprBinOp { left: Box::new(e), op: ast::Operator::Pow, right: Box::new(b), range: (location..end_location).into() } ) } @@ -39906,22 +41503,10 @@ fn __action599< fn __action600< >( mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> Vec + (_, __0, _): (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action219( - mode, - __0, - __temp0, - ) + __0 } #[allow(unused_variables)] @@ -39929,26 +41514,17 @@ fn __action600< fn __action601< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, atom, _): (TextSize, ast::Expr, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( - mode, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action247( - mode, - __0, - __1, - __temp0, - __3, - ) + { + ast::Expr::Await( + ast::ExprAwait { value: Box::new(atom), range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -39956,26 +41532,10 @@ fn __action601< fn __action602< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, TextSize, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action247( - mode, - __0, - __1, - __temp0, - __2, - ) + __0 } #[allow(unused_variables)] @@ -39983,26 +41543,10 @@ fn __action602< fn __action603< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), + (_, __0, _): (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( - mode, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action244( - mode, - __0, - __1, - __temp0, - __3, - ) + __0 } #[allow(unused_variables)] @@ -40010,26 +41554,17 @@ fn __action603< fn __action604< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, TextSize, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, f, _): (TextSize, ast::Expr, TextSize), + (_, arguments, _): (TextSize, ast::Arguments, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), ) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action244( - mode, - __0, - __1, - __temp0, - __2, - ) + { + ast::Expr::Call( + ast::ExprCall { func: Box::new(f), arguments, range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -40037,29 +41572,16 @@ fn __action604< fn __action605< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Vec + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, s, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action66( - mode, - __0, - __1, - __2, - __temp0, - __4, - __5, + ast::Expr::Subscript( + ast::ExprSubscript { value: Box::new(e), slice: Box::new(s), ctx: ast::ExprContext::Load, range: (location..end_location).into() } ) } @@ -40068,29 +41590,15 @@ fn __action605< fn __action606< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Vec + (_, location, _): (TextSize, TextSize, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, attr, _): (TextSize, ast::Identifier, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action66( - mode, - __0, - __1, - __2, - __temp0, - __3, - __4, + ast::Expr::Attribute( + ast::ExprAttribute { value: Box::new(e), attr, ctx: ast::ExprContext::Load, range: (location..end_location).into() } ) } @@ -40099,22 +41607,11 @@ fn __action606< fn __action607< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Vec + (_, location, _): (TextSize, TextSize, TextSize), + (_, s, _): (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), +) -> Result> { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action356( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action210( - mode, - __0, - __temp0, - ) + Ok(parse_strings(s)?) } #[allow(unused_variables)] @@ -40122,21 +41619,13 @@ fn __action607< fn __action608< >( mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> Vec + (_, location, _): (TextSize, TextSize, TextSize), + (_, value, _): (TextSize, ast::Constant, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action210( - mode, - __0, - __temp0, + ast::Expr::Constant( + ast::ExprConstant { value, kind: None, range: (location..end_location).into() } ) } @@ -40145,29 +41634,13 @@ fn __action608< fn __action609< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, location, _): (TextSize, TextSize, TextSize), + (_, id, _): (TextSize, ast::Identifier, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action133( - mode, - __0, - __1, - __2, - __temp0, - __4, - __5, + ast::Expr::Name( + ast::ExprName { id: id.into(), ctx: ast::ExprContext::Load, range: (location..end_location).into() } ) } @@ -40176,30 +41649,19 @@ fn __action609< fn __action610< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, core::option::Option>, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action133( - mode, - __0, - __1, - __2, - __temp0, - __3, - __4, - ) + { + let elts = e.unwrap_or_default(); + ast::Expr::List( + ast::ExprList { elts, ctx: ast::ExprContext::Load, range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -40207,32 +41669,19 @@ fn __action610< fn __action611< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Identifier, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, elt, _): (TextSize, ast::Expr, TextSize), + (_, generators, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action356( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action134( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - __6, - ) + { + ast::Expr::ListComp( + ast::ExprListComp { elt: Box::new(elt), generators, range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -40240,32 +41689,32 @@ fn __action611< fn __action612< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Identifier, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, left, _): (TextSize, core::option::Option>, TextSize), + (_, mid, _): (TextSize, ast::Expr, TextSize), + (_, right, _): (TextSize, alloc::vec::Vec, TextSize), + (_, trailing_comma, _): (TextSize, core::option::Option, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action134( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) + { + if left.is_none() && right.is_empty() && trailing_comma.is_none() { + if mid.is_starred_expr() { + return Err(LexicalError{ + error: LexicalErrorType::OtherError("cannot use starred expression here".to_string()), + location: mid.start(), + })?; + } + Ok(mid) + } else { + let elts = left.into_iter().flatten().chain([mid]).chain(right).collect(); + Ok(ast::Expr::Tuple( + ast::ExprTuple { elts, ctx: ast::ExprContext::Load, range: (location..end_location).into() }, + )) + } + } } #[allow(unused_variables)] @@ -40273,35 +41722,14 @@ fn __action612< fn __action613< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Identifier, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __6.0; - let __end0 = __6.2; - let __temp0 = __action356( - mode, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action135( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - __7, - __8, + ast::Expr::Tuple( + ast::ExprTuple { elts: Vec::new(), ctx: ast::ExprContext::Load, range: (location..end_location).into() } ) } @@ -40310,36 +41738,12 @@ fn __action613< fn __action614< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Identifier, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Pattern + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __5.2; - let __end0 = __6.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action135( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - __6, - __7, - ) + e } #[allow(unused_variables)] @@ -40347,36 +41751,19 @@ fn __action614< fn __action615< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> ast::Stmt + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, elt, _): (TextSize, ast::Expr, TextSize), + (_, generators, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action85( - mode, - __0, - __1, - __2, - __temp0, - __4, - __5, - __6, - __7, - __8, - ) + { + ast::Expr::GeneratorExp( + ast::ExprGeneratorExp { elt: Box::new(elt), generators, range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -40384,36 +41771,20 @@ fn __action615< fn __action616< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> ast::Stmt + (_, _, _): (TextSize, token::Tok, TextSize), + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, ast::Expr, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action85( - mode, - __0, - __1, - __2, - __temp0, - __3, - __4, - __5, - __6, - __7, - ) + { + Err(LexicalError{ + error : LexicalErrorType::OtherError("cannot use double starred expression here".to_string()), + location, + }.into()) + } } #[allow(unused_variables)] @@ -40421,28 +41792,23 @@ fn __action616< fn __action617< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e, _): (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action277( - mode, - __0, - __1, - __2, - __temp0, - __4, - ) + { + let (keys, values) = e + .unwrap_or_default() + .into_iter() + .map(|(k, v)| (k.map(|x| *x), v)) + .unzip(); + ast::Expr::Dict( + ast::ExprDict { keys, values, range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -40450,28 +41816,24 @@ fn __action617< fn __action618< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, e1, _): (TextSize, (ast::Expr, ast::Expr), TextSize), + (_, generators, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action277( - mode, - __0, - __1, - __2, - __temp0, - __3, - ) + { + ast::Expr::DictComp( + ast::ExprDictComp { + key: Box::new(e1.0), + value: Box::new(e1.1), + generators, + range: (location..end_location).into() + } + ) + } } #[allow(unused_variables)] @@ -40479,27 +41841,15 @@ fn __action618< fn __action619< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, elts, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action278( - mode, - __0, - __1, - __2, - __temp0, - __4, + ast::Expr::Set( + ast::ExprSet { elts, range: (location..end_location).into() } ) } @@ -40508,28 +41858,19 @@ fn __action619< fn __action620< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, elt, _): (TextSize, ast::Expr, TextSize), + (_, generators, _): (TextSize, Vec, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action278( - mode, - __0, - __1, - __2, - __temp0, - __3, - ) + { + ast::Expr::SetComp( + ast::ExprSetComp { elt: Box::new(elt), generators, range: (location..end_location).into() } + ) + } } #[allow(unused_variables)] @@ -40537,26 +41878,12 @@ fn __action620< fn __action621< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Option>, Vec, Option>), TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Parameters + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( - mode, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action279( - mode, - __0, - __1, - __temp0, - __3, - ) + ast::Expr::Constant(ast::ExprConstant { value: true.into(), kind: None, range: (location..end_location).into() }) } #[allow(unused_variables)] @@ -40564,26 +41891,12 @@ fn __action621< fn __action622< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Option>, Vec, Option>), TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action279( - mode, - __0, - __1, - __temp0, - __2, - ) + ast::Expr::Constant(ast::ExprConstant { value: false.into(), kind: None, range: (location..end_location).into() }) } #[allow(unused_variables)] @@ -40591,26 +41904,12 @@ fn __action622< fn __action623< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Option>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Parameters + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( - mode, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action280( - mode, - __0, - __1, - __temp0, - __3, - ) + ast::Expr::Constant(ast::ExprConstant { value: ast::Constant::None, kind: None, range: (location..end_location).into() }) } #[allow(unused_variables)] @@ -40618,26 +41917,12 @@ fn __action623< fn __action624< >( mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Option>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters + (_, location, _): (TextSize, TextSize, TextSize), + (_, _, _): (TextSize, token::Tok, TextSize), + (_, end_location, _): (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action280( - mode, - __0, - __1, - __temp0, - __2, - ) + ast::Expr::Constant(ast::ExprConstant { value: ast::Constant::Ellipsis, kind: None, range: (location..end_location).into() }) } #[allow(unused_variables)] @@ -40646,26 +41931,28 @@ fn __action625< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action356( + let __temp0 = __action363( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action260( + __action569( mode, __0, __1, __2, __temp0, __4, + __5, ) } @@ -40675,26 +41962,28 @@ fn __action626< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action357( + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action260( + __action569( mode, __0, __1, __2, __temp0, __3, + __4, ) } @@ -40704,26 +41993,32 @@ fn __action627< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, core::option::Option>, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( + let __start0 = __5.0; + let __end0 = __5.2; + let __temp0 = __action363( mode, - __3, + __5, ); let __temp0 = (__start0, __temp0, __end0); - __action261( + __action570( mode, __0, __1, __2, - __temp0, + __3, __4, + __temp0, + __6, + __7, ) } @@ -40733,26 +42028,32 @@ fn __action628< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Vec, Vec), TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, core::option::Option>, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( + let __start0 = __4.2; + let __end0 = __5.0; + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action261( + __action570( mode, __0, __1, __2, - __temp0, __3, + __4, + __temp0, + __5, + __6, ) } @@ -40762,24 +42063,28 @@ fn __action629< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Option>, Vec, Option>), TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Parameters + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( mode, - __2, + __3, ); let __temp0 = (__start0, __temp0, __end0); - __action262( + __action550( mode, __0, __1, + __2, __temp0, - __3, + __4, + __5, ) } @@ -40789,24 +42094,28 @@ fn __action630< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, (Option>, Vec, Option>), TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action262( + __action550( mode, __0, __1, - __temp0, __2, + __temp0, + __3, + __4, ) } @@ -40816,24 +42125,32 @@ fn __action631< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Option>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Parameters + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, core::option::Option>, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( + let __start0 = __5.0; + let __end0 = __5.2; + let __temp0 = __action363( mode, - __2, + __5, ); let __temp0 = (__start0, __temp0, __end0); - __action263( + __action551( mode, __0, __1, - __temp0, + __2, __3, + __4, + __temp0, + __6, + __7, ) } @@ -40843,24 +42160,32 @@ fn __action632< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Option>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, core::option::Option>, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( + let __start0 = __4.2; + let __end0 = __5.0; + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action263( + __action551( mode, __0, __1, - __temp0, __2, + __3, + __4, + __temp0, + __5, + __6, ) } @@ -40870,24 +42195,32 @@ fn __action633< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, core::option::Option>, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( + let __start0 = __5.0; + let __end0 = __5.2; + let __temp0 = __action363( mode, - __2, + __5, ); let __temp0 = (__start0, __temp0, __end0); - __action89( + __action612( mode, __0, __1, - __temp0, + __2, __3, + __4, + __temp0, + __6, + __7, ) } @@ -40897,24 +42230,32 @@ fn __action634< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, core::option::Option>, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( + let __start0 = __4.2; + let __end0 = __5.0; + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action89( + __action612( mode, __0, __1, - __temp0, __2, + __3, + __4, + __temp0, + __5, + __6, ) } @@ -40924,9 +42265,83 @@ fn __action635< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, ast::Pattern, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __6.0; + let __end0 = __6.2; + let __temp0 = __action363( + mode, + __6, + ); + let __temp0 = (__start0, __temp0, __end0); + __action139( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action636< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __5.2; + let __end0 = __6.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action139( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action637< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), __4: (TextSize, token::Tok, TextSize), __5: (TextSize, token::Tok, TextSize), __6: (TextSize, TextSize, TextSize), @@ -40934,12 +42349,12 @@ fn __action635< { let __start0 = __4.0; let __end0 = __4.2; - let __temp0 = __action356( + let __temp0 = __action363( mode, __4, ); let __temp0 = (__start0, __temp0, __end0); - __action106( + __action140( mode, __0, __1, @@ -40953,26 +42368,26 @@ fn __action635< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action636< +fn __action638< >( mode: Mode, __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, ast::Pattern, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), __4: (TextSize, token::Tok, TextSize), __5: (TextSize, TextSize, TextSize), ) -> ast::Pattern { let __start0 = __3.2; let __end0 = __4.0; - let __temp0 = __action357( + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action106( + __action140( mode, __0, __1, @@ -40986,7 +42401,325 @@ fn __action636< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action637< +fn __action639< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action363( + mode, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action141( + mode, + __0, + __1, + __2, + __3, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action640< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action141( + mode, + __0, + __1, + __2, + __3, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action641< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __6.0; + let __end0 = __6.2; + let __temp0 = __action363( + mode, + __6, + ); + let __temp0 = (__start0, __temp0, __end0); + __action143( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action642< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __5.2; + let __end0 = __6.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action143( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action643< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action363( + mode, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action144( + mode, + __0, + __1, + __2, + __3, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action644< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action144( + mode, + __0, + __1, + __2, + __3, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action645< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action363( + mode, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action145( + mode, + __0, + __1, + __2, + __3, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action646< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action145( + mode, + __0, + __1, + __2, + __3, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action647< +>( + mode: Mode, + __0: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Vec<(Option>, ast::Expr)> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action363( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action213( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action648< +>( + mode: Mode, + __0: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), +) -> Vec<(Option>, ast::Expr)> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action213( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action649< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -40995,12 +42728,12 @@ fn __action637< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action356( + let __temp0 = __action363( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action215( + __action221( mode, __0, __temp0, @@ -41009,7 +42742,7 @@ fn __action637< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action638< +fn __action650< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -41017,13 +42750,13 @@ fn __action638< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action357( + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action215( + __action221( mode, __0, __temp0, @@ -41032,7 +42765,7 @@ fn __action638< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action639< +fn __action651< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41043,12 +42776,12 @@ fn __action639< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action356( + let __temp0 = __action363( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action206( + __action249( mode, __0, __1, @@ -41059,7 +42792,7 @@ fn __action639< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action640< +fn __action652< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41069,13 +42802,13 @@ fn __action640< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action357( + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action206( + __action249( mode, __0, __1, @@ -41084,373 +42817,25 @@ fn __action640< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action641< ->( - mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::TypeParams -{ - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action356( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action171( - mode, - __0, - __1, - __2, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action642< ->( - mode: Mode, - __0: (TextSize, TextSize, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::TypeParams -{ - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action171( - mode, - __0, - __1, - __2, - __temp0, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action643< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action356( - mode, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action156( - mode, - __0, - __1, - __temp0, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action644< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action156( - mode, - __0, - __1, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action645< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, ast::WithItem, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action356( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action157( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action646< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, ast::WithItem, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action357( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action157( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action647< ->( - mode: Mode, - __0: (TextSize, ast::Suite, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action380( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action5( - mode, - __0, - __1, - __2, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action648< ->( - mode: Mode, - __0: (TextSize, ast::Suite, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action381( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action5( - mode, - __0, - __1, - __2, - __temp0, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action649< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action380( - mode, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action9( - mode, - __0, - __1, - __temp0, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action650< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action381( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action9( - mode, - __0, - __1, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action651< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action380( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action12( - mode, - __0, - __1, - __2, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action652< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __2.2; - let __end0 = __3.0; - let __temp0 = __action381( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action12( - mode, - __0, - __1, - __2, - __temp0, - __3, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action653< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Suite + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action380( + let __temp0 = __action363( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action7( + __action246( mode, __0, __1, @@ -41464,20 +42849,20 @@ fn __action653< fn __action654< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Suite + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action381( + let __temp0 = __action364( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action7( + __action246( mode, __0, __1, @@ -41489,6 +42874,1460 @@ fn __action654< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action655< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Vec +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action67( + mode, + __0, + __1, + __2, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action656< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Vec +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action67( + mode, + __0, + __1, + __2, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action657< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action363( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action212( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action658< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), +) -> Vec +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action212( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action659< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action135( + mode, + __0, + __1, + __2, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action660< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action135( + mode, + __0, + __1, + __2, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action661< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action363( + mode, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action136( + mode, + __0, + __1, + __2, + __3, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action662< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action136( + mode, + __0, + __1, + __2, + __3, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action663< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Identifier, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __6.0; + let __end0 = __6.2; + let __temp0 = __action363( + mode, + __6, + ); + let __temp0 = (__start0, __temp0, __end0); + __action137( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action664< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Identifier, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __5.2; + let __end0 = __6.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action137( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action665< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action87( + mode, + __0, + __1, + __2, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action666< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action87( + mode, + __0, + __1, + __2, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action667< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action279( + mode, + __0, + __1, + __2, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action668< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action279( + mode, + __0, + __1, + __2, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action669< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action280( + mode, + __0, + __1, + __2, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action670< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action280( + mode, + __0, + __1, + __2, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action671< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Option>, Vec, Option>), TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action363( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action281( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action672< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Option>, Vec, Option>), TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action281( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action673< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Option>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action363( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action282( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action674< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Option>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action282( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action675< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action262( + mode, + __0, + __1, + __2, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action676< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action262( + mode, + __0, + __1, + __2, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action677< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action263( + mode, + __0, + __1, + __2, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action678< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Vec, Vec), TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action263( + mode, + __0, + __1, + __2, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action679< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Option>, Vec, Option>), TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action363( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action264( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action680< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, (Option>, Vec, Option>), TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action264( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action681< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Option>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action363( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action265( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action682< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Option>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action265( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action683< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action363( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action91( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action684< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action91( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action685< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, ast::Pattern, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action363( + mode, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action108( + mode, + __0, + __1, + __2, + __3, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action686< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, ast::Pattern, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action108( + mode, + __0, + __1, + __2, + __3, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action687< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action363( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action217( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action688< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), +) -> Vec +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action217( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action689< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action363( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action208( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action690< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action208( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action691< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::TypeParams +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action363( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action173( + mode, + __0, + __1, + __2, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action692< +>( + mode: Mode, + __0: (TextSize, TextSize, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::TypeParams +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action173( + mode, + __0, + __1, + __2, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action693< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action363( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action158( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action694< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action158( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action695< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::WithItem, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action363( + mode, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action159( + mode, + __0, + __1, + __2, + __3, + __temp0, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action696< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::WithItem, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action364( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action159( + mode, + __0, + __1, + __2, + __3, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action697< +>( + mode: Mode, + __0: (TextSize, ast::Suite, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action387( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action5( + mode, + __0, + __1, + __2, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action698< +>( + mode: Mode, + __0: (TextSize, ast::Suite, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action388( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action5( + mode, + __0, + __1, + __2, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action699< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action387( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action9( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action700< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action388( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action9( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action701< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action387( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action12( + mode, + __0, + __1, + __2, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action702< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action388( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action12( + mode, + __0, + __1, + __2, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action703< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action387( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action7( + mode, + __0, + __1, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action704< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action388( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action7( + mode, + __0, + __1, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action705< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41504,12 +44343,12 @@ fn __action655< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action313( + let __temp0 = __action315( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action147( + __action149( mode, __0, __temp0, @@ -41525,7 +44364,7 @@ fn __action655< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action656< +fn __action706< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41540,13 +44379,13 @@ fn __action656< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action314( + let __temp0 = __action316( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action147( + __action149( mode, __0, __temp0, @@ -41562,7 +44401,7 @@ fn __action656< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action657< +fn __action707< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41579,12 +44418,12 @@ fn __action657< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action313( + let __temp0 = __action315( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action161( + __action163( mode, __0, __1, @@ -41601,7 +44440,7 @@ fn __action657< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action658< +fn __action708< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41617,13 +44456,13 @@ fn __action658< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action314( + let __temp0 = __action316( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action161( + __action163( mode, __0, __1, @@ -41640,7 +44479,7 @@ fn __action658< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action659< +fn __action709< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41655,12 +44494,12 @@ fn __action659< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action313( + let __temp0 = __action315( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action223( + __action225( mode, __0, __temp0, @@ -41675,7 +44514,7 @@ fn __action659< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action660< +fn __action710< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41689,13 +44528,13 @@ fn __action660< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action314( + let __temp0 = __action316( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action223( + __action225( mode, __0, __temp0, @@ -41710,7 +44549,7 @@ fn __action660< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action661< +fn __action711< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41723,12 +44562,12 @@ fn __action661< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action313( + let __temp0 = __action315( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action155( + __action157( mode, __0, __temp0, @@ -41741,7 +44580,7 @@ fn __action661< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action662< +fn __action712< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41753,13 +44592,13 @@ fn __action662< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action314( + let __temp0 = __action316( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action155( + __action157( mode, __0, __temp0, @@ -41772,7 +44611,7 @@ fn __action662< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action663< +fn __action713< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -41781,13 +44620,13 @@ fn __action663< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action410( + let __temp0 = __action419( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action464( + __action471( mode, __temp0, ) @@ -41795,7 +44634,7 @@ fn __action663< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action664< +fn __action714< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41808,13 +44647,13 @@ fn __action664< { let __start0 = __2.0; let __end0 = __3.2; - let __temp0 = __action410( + let __temp0 = __action419( mode, __2, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action619( + __action669( mode, __0, __1, @@ -41826,7 +44665,7 @@ fn __action664< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action665< +fn __action715< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41838,13 +44677,13 @@ fn __action665< { let __start0 = __2.0; let __end0 = __3.2; - let __temp0 = __action410( + let __temp0 = __action419( mode, __2, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action620( + __action670( mode, __0, __1, @@ -41855,7 +44694,7 @@ fn __action665< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action666< +fn __action716< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41868,13 +44707,13 @@ fn __action666< { let __start0 = __4.0; let __end0 = __5.2; - let __temp0 = __action663( + let __temp0 = __action713( mode, __4, __5, ); let __temp0 = (__start0, __temp0, __end0); - __action415( + __action424( mode, __0, __1, @@ -41886,7 +44725,7 @@ fn __action666< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action667< +fn __action717< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41897,13 +44736,13 @@ fn __action667< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action465( + let __temp0 = __action472( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action415( + __action424( mode, __0, __1, @@ -41915,7 +44754,7 @@ fn __action667< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action668< +fn __action718< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -41924,13 +44763,13 @@ fn __action668< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action418( + let __temp0 = __action427( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action453( + __action460( mode, __temp0, ) @@ -41938,7 +44777,7 @@ fn __action668< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action669< +fn __action719< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41951,13 +44790,13 @@ fn __action669< { let __start0 = __2.0; let __end0 = __3.2; - let __temp0 = __action418( + let __temp0 = __action427( mode, __2, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action627( + __action677( mode, __0, __1, @@ -41969,7 +44808,7 @@ fn __action669< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action670< +fn __action720< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -41981,13 +44820,13 @@ fn __action670< { let __start0 = __2.0; let __end0 = __3.2; - let __temp0 = __action418( + let __temp0 = __action427( mode, __2, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action628( + __action678( mode, __0, __1, @@ -41998,7 +44837,7 @@ fn __action670< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action671< +fn __action721< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42011,13 +44850,13 @@ fn __action671< { let __start0 = __4.0; let __end0 = __5.2; - let __temp0 = __action668( + let __temp0 = __action718( mode, __4, __5, ); let __temp0 = (__start0, __temp0, __end0); - __action423( + __action432( mode, __0, __1, @@ -42029,7 +44868,7 @@ fn __action671< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action672< +fn __action722< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42040,13 +44879,13 @@ fn __action672< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action454( + let __temp0 = __action461( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action423( + __action432( mode, __0, __1, @@ -42058,7 +44897,7 @@ fn __action672< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action673< +fn __action723< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -42067,13 +44906,13 @@ fn __action673< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action468( + let __temp0 = __action475( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action479( + __action494( mode, __temp0, ) @@ -42081,7 +44920,7 @@ fn __action673< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action674< +fn __action724< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -42091,13 +44930,13 @@ fn __action674< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action468( + let __temp0 = __action475( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action480( + __action495( mode, __0, __temp0, @@ -42106,7 +44945,7 @@ fn __action674< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action675< +fn __action725< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -42116,13 +44955,13 @@ fn __action675< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action466( + let __temp0 = __action473( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action417( + __action426( mode, __0, __1, @@ -42133,7 +44972,7 @@ fn __action675< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action676< +fn __action726< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -42144,12 +44983,12 @@ fn __action676< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action467( + let __temp0 = __action474( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action417( + __action426( mode, __0, __1, @@ -42160,7 +44999,7 @@ fn __action676< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action677< +fn __action727< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42172,13 +45011,13 @@ fn __action677< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action466( + let __temp0 = __action473( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action666( + __action716( mode, __0, __1, @@ -42191,7 +45030,7 @@ fn __action677< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action678< +fn __action728< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42204,12 +45043,12 @@ fn __action678< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action467( + let __temp0 = __action474( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action666( + __action716( mode, __0, __1, @@ -42222,7 +45061,7 @@ fn __action678< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action679< +fn __action729< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42232,13 +45071,13 @@ fn __action679< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action466( + let __temp0 = __action473( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action667( + __action717( mode, __0, __1, @@ -42249,7 +45088,7 @@ fn __action679< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action680< +fn __action730< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42260,12 +45099,12 @@ fn __action680< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action467( + let __temp0 = __action474( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action667( + __action717( mode, __0, __1, @@ -42276,7 +45115,7 @@ fn __action680< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action681< +fn __action731< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -42285,13 +45124,13 @@ fn __action681< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action457( + let __temp0 = __action464( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action481( + __action496( mode, __temp0, ) @@ -42299,7 +45138,7 @@ fn __action681< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action682< +fn __action732< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -42309,13 +45148,13 @@ fn __action682< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action457( + let __temp0 = __action464( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action482( + __action497( mode, __0, __temp0, @@ -42324,7 +45163,7 @@ fn __action682< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action683< +fn __action733< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -42334,13 +45173,13 @@ fn __action683< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action455( + let __temp0 = __action462( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action425( + __action434( mode, __0, __1, @@ -42351,7 +45190,7 @@ fn __action683< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action684< +fn __action734< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -42362,12 +45201,12 @@ fn __action684< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action456( + let __temp0 = __action463( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action425( + __action434( mode, __0, __1, @@ -42378,7 +45217,7 @@ fn __action684< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action685< +fn __action735< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42390,13 +45229,13 @@ fn __action685< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action455( + let __temp0 = __action462( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action671( + __action721( mode, __0, __1, @@ -42409,7 +45248,7 @@ fn __action685< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action686< +fn __action736< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42422,12 +45261,12 @@ fn __action686< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action456( + let __temp0 = __action463( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action671( + __action721( mode, __0, __1, @@ -42440,7 +45279,7 @@ fn __action686< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action687< +fn __action737< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42450,13 +45289,13 @@ fn __action687< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action455( + let __temp0 = __action462( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action672( + __action722( mode, __0, __1, @@ -42467,7 +45306,7 @@ fn __action687< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action688< +fn __action738< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42478,12 +45317,12 @@ fn __action688< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action456( + let __temp0 = __action463( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action672( + __action722( mode, __0, __1, @@ -42494,7 +45333,7 @@ fn __action688< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action689< +fn __action739< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42506,12 +45345,12 @@ fn __action689< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action471( + let __temp0 = __action478( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action677( + __action727( mode, __0, __1, @@ -42523,7 +45362,7 @@ fn __action689< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action690< +fn __action740< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42534,13 +45373,13 @@ fn __action690< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action472( + let __temp0 = __action479( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action677( + __action727( mode, __0, __1, @@ -42552,7 +45391,7 @@ fn __action690< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action691< +fn __action741< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42565,12 +45404,12 @@ fn __action691< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action471( + let __temp0 = __action478( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action678( + __action728( mode, __0, __1, @@ -42583,7 +45422,7 @@ fn __action691< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action692< +fn __action742< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42595,13 +45434,13 @@ fn __action692< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action472( + let __temp0 = __action479( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action678( + __action728( mode, __0, __1, @@ -42614,7 +45453,7 @@ fn __action692< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action693< +fn __action743< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42624,12 +45463,12 @@ fn __action693< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action471( + let __temp0 = __action478( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action679( + __action729( mode, __0, __1, @@ -42639,7 +45478,7 @@ fn __action693< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action694< +fn __action744< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42648,13 +45487,13 @@ fn __action694< { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action472( + let __temp0 = __action479( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action679( + __action729( mode, __0, __1, @@ -42664,7 +45503,7 @@ fn __action694< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action695< +fn __action745< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42675,12 +45514,12 @@ fn __action695< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action471( + let __temp0 = __action478( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action680( + __action730( mode, __0, __1, @@ -42691,7 +45530,7 @@ fn __action695< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action696< +fn __action746< >( mode: Mode, __0: (TextSize, TextSize, TextSize), @@ -42701,13 +45540,13 @@ fn __action696< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action472( + let __temp0 = __action479( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action680( + __action730( mode, __0, __1, @@ -42718,7 +45557,7 @@ fn __action696< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action697< +fn __action747< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -42729,13 +45568,13 @@ fn __action697< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action323( + __action325( mode, __temp0, __0, @@ -42747,7 +45586,7 @@ fn __action697< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action698< +fn __action748< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -42757,13 +45596,13 @@ fn __action698< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action320( + __action322( mode, __temp0, __0, @@ -42774,7 +45613,7 @@ fn __action698< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action699< +fn __action749< >( mode: Mode, __0: (TextSize, (String, StringKind, bool), TextSize), @@ -42783,13 +45622,13 @@ fn __action699< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action332( + __action334( mode, __temp0, __0, @@ -42799,7 +45638,7 @@ fn __action699< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action700< +fn __action750< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -42810,13 +45649,13 @@ fn __action700< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action112( + __action114( mode, __temp0, __0, @@ -42828,7 +45667,7 @@ fn __action700< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action701< +fn __action751< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -42839,13 +45678,13 @@ fn __action701< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action449( + __action484( mode, __temp0, __0, @@ -42857,7 +45696,7 @@ fn __action701< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action702< +fn __action752< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -42868,13 +45707,13 @@ fn __action702< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action508( + __action486( mode, __temp0, __0, @@ -42886,567 +45725,18 @@ fn __action702< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action703< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action433( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action704< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action477( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action705< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action226( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action706< +fn __action753< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action490( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action707< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action535( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action708< ->( - mode: Mode, - __0: (TextSize, ast::Pattern, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action93( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action709< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action72( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action710< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action516( - mode, - __temp0, - __0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action711< ->( - mode: Mode, - __0: (TextSize, ast::Constant, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action517( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action712< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action518( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action713< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action519( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action714< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action520( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action715< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action579( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action716< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action580( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action717< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action581( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action718< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action582( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action719< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action523( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action720< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action525( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action721< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action526( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action722< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), - __2: (TextSize, token::Tok, TextSize), __3: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -43464,55 +45754,107 @@ fn __action722< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action723< +fn __action754< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (ast::Expr, ast::Expr), TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action528( + __action442( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action755< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action492( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action756< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action228( mode, __temp0, __0, __1, __2, __3, - __4, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action724< +fn __action757< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), __3: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action529( + __action505( mode, __temp0, __0, @@ -43524,138 +45866,123 @@ fn __action724< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action725< +fn __action758< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action507( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action759< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action543( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action760< +>( + mode: Mode, + __0: (TextSize, ast::Pattern, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action95( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action761< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Expr + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Stmt { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action530( + __action73( mode, __temp0, __0, __1, __2, __3, - __4, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action726< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action531( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action727< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action532( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action728< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action533( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action729< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action534( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action730< +fn __action762< >( mode: Mode, __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), @@ -43663,83 +45990,7 @@ fn __action730< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action561( - mode, - __temp0, - __0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action731< ->( - mode: Mode, - __0: (TextSize, ast::Constant, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action562( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action732< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action563( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action733< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -43749,27 +46000,21 @@ fn __action733< mode, __temp0, __0, - __1, - __2, - __3, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action734< +fn __action763< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), + __0: (TextSize, ast::Constant, TextSize), + __1: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -43780,6 +46025,88 @@ fn __action734< __temp0, __0, __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action764< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action566( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action765< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action567( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action766< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action568( + mode, + __temp0, + __0, + __1, __2, __3, __4, @@ -43788,7 +46115,67 @@ fn __action734< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action735< +fn __action767< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action625( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action768< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action626( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action769< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -43802,13 +46189,13 @@ fn __action735< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action583( + __action627( mode, __temp0, __0, @@ -43823,7 +46210,7 @@ fn __action735< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action736< +fn __action770< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -43836,13 +46223,13 @@ fn __action736< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action584( + __action628( mode, __temp0, __0, @@ -43856,7 +46243,7 @@ fn __action736< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action737< +fn __action771< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -43866,97 +46253,7 @@ fn __action737< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action567( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action738< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action569( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action739< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action570( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action740< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -43968,17 +46265,16 @@ fn __action740< __0, __1, __2, - __3, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action741< +fn __action772< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (ast::Expr, ast::Expr), TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, TextSize, TextSize), @@ -43986,37 +46282,7 @@ fn __action741< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action572( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action742< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -44029,12 +46295,133 @@ fn __action742< __1, __2, __3, + __4, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action743< +fn __action773< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action574( + mode, + __0, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action774< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action575( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action775< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (ast::Expr, ast::Expr), TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action576( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action776< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action577( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action777< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -44046,110 +46433,7 @@ fn __action743< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action574( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action744< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action575( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action745< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action576( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action746< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action577( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action747< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -44160,57 +46444,235 @@ fn __action747< __temp0, __0, __1, + __2, + __3, + __4, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action748< +fn __action778< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Arguments, TextSize), - __2: (TextSize, TextSize, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action513( + __action579( mode, __temp0, __0, __1, - __2, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action749< +fn __action779< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action580( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action780< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action581( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action781< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action582( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action782< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action545( + mode, + __temp0, + __0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action783< +>( + mode: Mode, + __0: (TextSize, ast::Constant, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action546( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action784< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action547( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action785< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action548( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action786< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action514( + __action549( mode, __temp0, __0, @@ -44223,24 +46685,55 @@ fn __action749< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action750< +fn __action787< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, TextSize, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action515( + __action629( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action788< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action630( mode, __temp0, __0, @@ -44252,17 +46745,235 @@ fn __action750< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action751< +fn __action789< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Arguments, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action631( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action790< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action632( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action791< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), __2: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action552( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action792< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action554( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action793< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action555( + mode, + __0, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action794< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action556( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action795< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (ast::Expr, ast::Expr), TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action557( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action796< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( mode, &__start0, &__end0, @@ -44274,24 +46985,25 @@ fn __action751< __0, __1, __2, + __3, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action752< +fn __action797< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -44310,18 +47022,16 @@ fn __action752< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action753< +fn __action798< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, TextSize, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -44332,1353 +47042,6 @@ fn __action753< __temp0, __0, __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action754< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action506( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action755< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action555( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action756< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action119( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action757< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action170( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action758< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action585( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action759< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action586( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action760< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action587( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action761< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action588( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action762< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action589( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action763< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action590( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action764< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action140( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action765< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action591( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action766< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action592( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action767< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action593( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action768< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action594( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action769< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action595( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action770< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action596( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action771< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action144( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action772< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action485( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action773< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action494( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action774< ->( - mode: Mode, - __0: (TextSize, ast::Constant, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action109( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action775< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action111( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action776< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Decorator -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action175( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action777< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action24( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action778< ->( - mode: Mode, - __0: (TextSize, String, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Identifier -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action68( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action779< ->( - mode: Mode, - __0: (TextSize, String, TextSize), - __1: (TextSize, alloc::vec::Vec<(token::Tok, ast::Identifier)>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Identifier -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action69( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action780< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameter -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action169( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action781< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action153( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action782< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (ast::Expr, ast::Identifier), TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action154( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action783< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action151( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action784< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, (ast::Expr, ast::Identifier), TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action152( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action785< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action248( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action786< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action500( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action787< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action25( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action788< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action26( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action789< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action27( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action790< ->( - mode: Mode, - __0: (TextSize, ast::UnaryOp, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action498( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action791< ->( - mode: Mode, - __0: (TextSize, ast::UnaryOp, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action551( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action792< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action52( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action793< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action53( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action794< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action54( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action795< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action55( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action796< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, core::option::Option, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action655( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action797< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Suite, TextSize), - __6: (TextSize, core::option::Option, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action656( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action798< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Identifier, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, ast::Parameters, TextSize), - __6: (TextSize, core::option::Option, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action657( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, - __8, ) } @@ -45687,25 +47050,232 @@ fn __action798< fn __action799< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, ast::Parameters, TextSize), - __5: (TextSize, core::option::Option, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action658( + __action561( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action800< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action562( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action801< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action563( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action802< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action607( + mode, + __temp0, + __0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action803< +>( + mode: Mode, + __0: (TextSize, ast::Constant, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action608( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action804< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action609( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action805< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action610( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action806< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action611( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action807< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action633( mode, __temp0, __0, @@ -45715,221 +47285,6 @@ fn __action799< __4, __5, __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action800< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action227( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action801< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action228( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action802< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action229( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action803< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action230( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action804< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action601( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action805< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action602( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action806< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action603( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action807< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action604( - mode, - __temp0, - __0, - __1, ) } @@ -45939,24 +47294,30 @@ fn __action808< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Stmt + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action70( + __action634( mode, __temp0, __0, __1, __2, + __3, + __4, + __5, ) } @@ -45965,23 +47326,25 @@ fn __action808< fn __action809< >( mode: Mode, - __0: (TextSize, String, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Identifier + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action234( + __action613( mode, __temp0, __0, __1, + __2, ) } @@ -45992,21 +47355,20 @@ fn __action810< mode: Mode, __0: (TextSize, token::Tok, TextSize), __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), - __5: (TextSize, core::option::Option<(TextSize, ast::Suite)>, TextSize), -) -> ast::Stmt + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action145( + __action615( mode, __temp0, __0, @@ -46014,7 +47376,6 @@ fn __action810< __2, __3, __4, - __5, ) } @@ -46023,25 +47384,29 @@ fn __action810< fn __action811< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Alias + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action367( + __action616( mode, - __temp0, __0, + __temp0, __1, __2, + __3, + __4, ) } @@ -46050,25 +47415,27 @@ fn __action811< fn __action812< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Alias + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action360( + __action617( mode, __temp0, __0, __1, __2, + __3, ) } @@ -46077,23 +47444,29 @@ fn __action812< fn __action813< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Vec + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (ast::Expr, ast::Expr), TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action65( + __action618( mode, __temp0, __0, __1, + __2, + __3, + __4, ) } @@ -46103,15 +47476,376 @@ fn __action814< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Vec + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action619( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action815< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action620( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action816< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action621( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action817< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action622( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action818< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action623( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action819< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action624( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action820< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Arguments, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action534( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action821< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action535( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action822< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action536( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action823< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Arguments, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action538( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action824< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action539( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action825< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action540( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action826< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Arguments, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action604( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action827< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( mode, &__start0, &__end0, @@ -46130,18 +47864,18 @@ fn __action814< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action815< +fn __action828< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), __3: (TextSize, TextSize, TextSize), -) -> Vec +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -46157,378 +47891,30 @@ fn __action815< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action816< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action67( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action817< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action59( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action818< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (Option, Option), TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action60( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action819< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, TextSize, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __start1 = __0.2; - let __end1 = __1.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action389( - mode, - &__start1, - &__end1, - ); - let __temp1 = (__start1, __temp1, __end1); - __action181( - mode, - __temp0, - __0, - __temp1, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action820< ->( - mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action74( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action821< ->( - mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action73( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action822< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action113( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action823< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action114( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action824< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action115( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action825< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action116( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action826< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action117( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action827< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action118( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action828< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action127( - mode, - __temp0, - __0, - __1, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action829< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action128( + __action529( mode, __temp0, __0, __1, + __2, ) } @@ -46538,22 +47924,24 @@ fn __action830< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action129( + __action531( mode, __temp0, __0, __1, + __2, ) } @@ -46562,21 +47950,25 @@ fn __action830< fn __action831< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action130( + __action601( mode, __temp0, __0, + __1, + __2, ) } @@ -46585,25 +47977,23 @@ fn __action831< fn __action832< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), ) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action132( + __action121( mode, __temp0, __0, __1, - __2, ) } @@ -46612,83 +48002,24 @@ fn __action832< fn __action833< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action609( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action834< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action610( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action835< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), __1: (TextSize, token::Tok, TextSize), __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action611( + __action172( mode, __temp0, __0, @@ -46697,50 +48028,20 @@ fn __action835< __3, __4, __5, + __6, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action836< +fn __action834< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action612( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action837< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), __5: (TextSize, token::Tok, TextSize), __6: (TextSize, token::Tok, TextSize), __7: (TextSize, TextSize, TextSize), @@ -46748,13 +48049,13 @@ fn __action837< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action613( + __action635( mode, __temp0, __0, @@ -46770,27 +48071,27 @@ fn __action837< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action838< +fn __action835< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), __5: (TextSize, token::Tok, TextSize), __6: (TextSize, TextSize, TextSize), ) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action614( + __action636( mode, __temp0, __0, @@ -46805,25 +48106,122 @@ fn __action838< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action839< +fn __action836< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, core::option::Option, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Suite, TextSize), -) -> ast::MatchCase + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action86( + __action637( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action837< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action638( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action838< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action639( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action839< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action640( mode, __temp0, __0, @@ -46839,23 +48237,27 @@ fn __action839< fn __action840< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action120( + __action142( mode, __temp0, __0, __1, + __2, + __3, ) } @@ -46866,25 +48268,33 @@ fn __action841< mode: Mode, __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action121( + __action641( mode, __temp0, __0, __1, __2, __3, + __4, + __5, + __6, + __7, ) } @@ -46895,25 +48305,31 @@ fn __action842< mode: Mode, __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action122( + __action642( mode, __temp0, __0, __1, __2, __3, + __4, + __5, + __6, ) } @@ -46922,24 +48338,23 @@ fn __action842< fn __action843< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> ast::Stmt + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action83( + __action643( mode, __temp0, __0, @@ -46948,7 +48363,6 @@ fn __action843< __3, __4, __5, - __6, ) } @@ -46957,25 +48371,22 @@ fn __action843< fn __action844< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> ast::Stmt + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action84( + __action644( mode, __temp0, __0, @@ -46983,9 +48394,6 @@ fn __action844< __2, __3, __4, - __5, - __6, - __7, ) } @@ -46994,25 +48402,23 @@ fn __action844< fn __action845< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> ast::Stmt + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action615( + __action645( mode, __temp0, __0, @@ -47021,8 +48427,6 @@ fn __action845< __3, __4, __5, - __6, - __7, ) } @@ -47031,24 +48435,22 @@ fn __action845< fn __action846< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> ast::Stmt + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action616( + __action646( mode, __temp0, __0, @@ -47056,8 +48458,6 @@ fn __action846< __2, __3, __4, - __5, - __6, ) } @@ -47066,21 +48466,21 @@ fn __action846< fn __action847< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, TextSize, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), -) -> ast::Expr + __3: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action180( + __action146( mode, __temp0, __0, @@ -47093,6 +48493,1086 @@ fn __action847< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action848< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action498( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action849< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action513( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action850< +>( + mode: Mode, + __0: (TextSize, ast::Constant, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action111( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action851< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action113( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action852< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Decorator +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action177( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action853< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action25( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action854< +>( + mode: Mode, + __0: (TextSize, String, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Identifier +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action69( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action855< +>( + mode: Mode, + __0: (TextSize, String, TextSize), + __1: (TextSize, alloc::vec::Vec<(token::Tok, ast::Identifier)>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Identifier +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action70( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action856< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameter +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action171( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action857< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action155( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action858< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (ast::Expr, ast::Identifier), TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action156( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action859< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action153( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action860< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, (ast::Expr, ast::Identifier), TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action154( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action861< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action353( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action862< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action250( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action863< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action515( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action864< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action26( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action865< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action27( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action866< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action28( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action867< +>( + mode: Mode, + __0: (TextSize, ast::UnaryOp, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action517( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action868< +>( + mode: Mode, + __0: (TextSize, ast::UnaryOp, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action519( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action869< +>( + mode: Mode, + __0: (TextSize, ast::UnaryOp, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action595( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action870< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action53( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action871< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action54( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action872< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action55( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action873< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action56( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action874< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, core::option::Option, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action705( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action875< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Suite, TextSize), + __6: (TextSize, core::option::Option, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action706( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action876< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, ast::Parameters, TextSize), + __6: (TextSize, core::option::Option, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action707( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action877< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, ast::Parameters, TextSize), + __5: (TextSize, core::option::Option, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action708( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action878< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action229( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action879< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action230( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action880< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action231( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action881< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action232( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action882< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action651( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action883< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action652( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action884< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action653( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action885< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action654( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action886< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -47102,7 +49582,7 @@ fn __action848< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -47117,1066 +49597,30 @@ fn __action848< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action849< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action447( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action850< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action492( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action851< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action95( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action852< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action240( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action853< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action475( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action854< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action617( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action855< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action618( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action856< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action664( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action857< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action665( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action858< ->( - mode: Mode, - __0: (TextSize, (Option>, Vec, Option>), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action621( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action859< ->( - mode: Mode, - __0: (TextSize, (Option>, Vec, Option>), TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action622( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action860< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action623( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action861< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action624( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action862< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action625( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action863< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action626( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action864< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action669( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action865< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action670( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action866< ->( - mode: Mode, - __0: (TextSize, (Option>, Vec, Option>), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action629( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action867< ->( - mode: Mode, - __0: (TextSize, (Option>, Vec, Option>), TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action630( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action868< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action631( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action869< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action632( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action870< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action689( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action871< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action690( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action872< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action691( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action873< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action692( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action874< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action693( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action875< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action694( - mode, - __temp0, - __0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action876< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action695( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action877< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action696( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action878< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action685( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action879< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action686( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action880< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action687( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action881< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action688( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action882< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action164( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action883< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action23( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action884< ->( - mode: Mode, - __0: (TextSize, ast::Pattern, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action88( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action885< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action633( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action886< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action634( - mode, - __temp0, - __0, - __1, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action887< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action504( + __action76( mode, __temp0, __0, __1, __2, - __3, ) } @@ -48185,27 +49629,23 @@ fn __action887< fn __action888< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, String, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Identifier { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action553( + __action236( mode, __temp0, __0, __1, - __2, - __3, ) } @@ -48215,22 +49655,30 @@ fn __action889< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), + __5: (TextSize, core::option::Option<(TextSize, ast::Suite)>, TextSize), ) -> ast::Stmt { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action57( + __action147( mode, __temp0, __0, __1, + __2, + __3, + __4, + __5, ) } @@ -48239,27 +49687,25 @@ fn __action889< fn __action890< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Stmt + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Alias { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action58( + __action374( mode, __temp0, __0, __1, __2, - __3, ) } @@ -48268,27 +49714,25 @@ fn __action890< fn __action891< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Alias { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action103( + __action367( mode, __temp0, __0, __1, __2, - __3, ) } @@ -48297,25 +49741,23 @@ fn __action891< fn __action892< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __0: (TextSize, Vec, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Vec { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action104( + __action66( mode, __temp0, __0, __1, - __2, ) } @@ -48325,21 +49767,21 @@ fn __action893< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern +) -> Vec { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action105( + __action655( mode, __temp0, __0, @@ -48356,30 +49798,26 @@ fn __action894< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Pattern, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Vec { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action635( + __action656( mode, __temp0, __0, __1, __2, __3, - __4, - __5, ) } @@ -48389,28 +49827,22 @@ fn __action895< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Pattern, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __1: (TextSize, TextSize, TextSize), +) -> Vec { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action636( + __action68( mode, __temp0, __0, __1, - __2, - __3, - __4, ) } @@ -48420,26 +49852,24 @@ fn __action896< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Pattern + __1: (TextSize, Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Stmt { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action107( + __action60( mode, __temp0, __0, __1, __2, - __3, ) } @@ -48448,27 +49878,29 @@ fn __action896< fn __action897< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (Option, Option), TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Stmt { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action483( + __action61( mode, __temp0, __0, __1, __2, __3, + __4, ) } @@ -48477,27 +49909,40 @@ fn __action897< fn __action898< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __start1 = __0.2; + let __end1 = __1.0; + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action510( + let __temp1 = __action396( + mode, + &__start1, + &__end1, + ); + let __temp1 = (__start1, __temp1, __end1); + __action183( mode, __temp0, __0, + __temp1, __1, __2, __3, + __4, + __5, ) } @@ -48506,33 +49951,23 @@ fn __action898< fn __action899< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Comprehension + __0: (TextSize, (MagicKind, String), TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action659( + __action75( mode, __temp0, __0, __1, - __2, - __3, - __4, - __5, - __6, ) } @@ -48541,31 +49976,23 @@ fn __action899< fn __action900< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Comprehension + __0: (TextSize, (MagicKind, String), TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action660( + __action74( mode, __temp0, __0, __1, - __2, - __3, - __4, - __5, ) } @@ -48575,18 +50002,18 @@ fn __action901< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), -) -> Option + __1: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action209( + __action115( mode, __temp0, __0, @@ -48600,24 +50027,22 @@ fn __action902< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Expr + __1: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action221( + __action116( mode, __temp0, __0, __1, - __2, ) } @@ -48627,24 +50052,22 @@ fn __action903< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), - __2: (TextSize, TextSize, TextSize), + __1: (TextSize, TextSize, TextSize), ) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action108( + __action117( mode, __temp0, __0, __1, - __2, ) } @@ -48653,25 +50076,23 @@ fn __action903< fn __action904< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Parameter + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action168( + __action118( mode, __temp0, __0, __1, - __2, ) } @@ -48680,19 +50101,19 @@ fn __action904< fn __action905< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, TextSize, TextSize), -) -> ast::Parameter +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action166( + __action119( mode, __temp0, __0, @@ -48705,29 +50126,23 @@ fn __action905< fn __action906< >( mode: Mode, - __0: (TextSize, core::option::Option, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, core::option::Option>, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action208( + __action120( mode, __temp0, __0, __1, - __2, - __3, - __4, ) } @@ -48736,19 +50151,19 @@ fn __action906< fn __action907< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action204( + __action129( mode, __temp0, __0, @@ -48761,25 +50176,23 @@ fn __action907< fn __action908< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action205( + __action130( mode, __temp0, __0, __1, - __2, ) } @@ -48788,25 +50201,23 @@ fn __action908< fn __action909< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), ) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action639( + __action131( mode, __temp0, __0, __1, - __2, ) } @@ -48815,23 +50226,21 @@ fn __action909< fn __action910< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), +) -> Result> { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action640( + __action132( mode, __temp0, __0, - __1, ) } @@ -48840,27 +50249,25 @@ fn __action910< fn __action911< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action496( + __action134( mode, __temp0, __0, __1, __2, - __3, ) } @@ -48869,27 +50276,29 @@ fn __action911< fn __action912< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action537( + __action659( mode, __temp0, __0, __1, __2, __3, + __4, ) } @@ -48898,31 +50307,27 @@ fn __action912< fn __action913< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action375( + __action660( mode, __temp0, __0, __1, __2, __3, - __4, - __5, ) } @@ -48931,23 +50336,23 @@ fn __action913< fn __action914< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), + __2: (TextSize, ast::Identifier, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), __5: (TextSize, TextSize, TextSize), -) -> ast::Expr +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action405( + __action661( mode, __temp0, __0, @@ -48965,24 +50370,28 @@ fn __action915< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Suite, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Mod + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1( + __action662( mode, __temp0, __0, __1, __2, + __3, + __4, ) } @@ -48992,26 +50401,34 @@ fn __action916< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Mod + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Identifier, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action2( + __action663( mode, __temp0, __0, __1, __2, __3, + __4, + __5, + __6, + __7, ) } @@ -49021,23 +50438,23 @@ fn __action917< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, core::option::Option, TextSize), + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Identifier, TextSize), + __5: (TextSize, token::Tok, TextSize), __6: (TextSize, TextSize, TextSize), -) -> ast::Stmt +) -> ast::Pattern { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action148( + __action664( mode, __temp0, __0, @@ -49056,23 +50473,137 @@ fn __action918< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, core::option::Option, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> ast::Stmt + __1: (TextSize, ast::Pattern, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Suite, TextSize), +) -> ast::MatchCase { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action149( + __action88( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action919< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action122( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action920< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action123( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action921< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action124( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action922< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action85( mode, __temp0, __0, @@ -49087,24 +50618,133 @@ fn __action918< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action919< +fn __action923< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, ast::Suite, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), ) -> ast::Stmt { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action150( + __action86( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action924< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action665( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action925< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action666( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action926< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action182( mode, __temp0, __0, @@ -49116,22 +50756,103 @@ fn __action919< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action920< +fn __action927< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Stmt { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action162( + __action72( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action928< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action456( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action929< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action503( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action930< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action97( mode, __temp0, __0, @@ -49141,26 +50862,1209 @@ fn __action920< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action921< +fn __action931< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Stmt + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action163( + __action242( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action932< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action482( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action933< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action667( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action934< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action668( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action935< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action714( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action936< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action715( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action937< +>( + mode: Mode, + __0: (TextSize, (Option>, Vec, Option>), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action671( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action938< +>( + mode: Mode, + __0: (TextSize, (Option>, Vec, Option>), TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action672( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action939< +>( + mode: Mode, + __0: (TextSize, Option>, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action673( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action940< +>( + mode: Mode, + __0: (TextSize, Option>, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action674( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action941< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action675( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action942< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, core::option::Option<(Option>, Vec, Option>)>, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action676( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action943< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action719( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action944< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action720( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action945< +>( + mode: Mode, + __0: (TextSize, (Option>, Vec, Option>), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action679( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action946< +>( + mode: Mode, + __0: (TextSize, (Option>, Vec, Option>), TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action680( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action947< +>( + mode: Mode, + __0: (TextSize, Option>, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action681( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action948< +>( + mode: Mode, + __0: (TextSize, Option>, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action682( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action949< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action739( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action950< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action740( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action951< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action741( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action952< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action742( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action953< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action743( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action954< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action744( + mode, + __temp0, + __0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action955< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action745( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action956< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action746( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action957< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action735( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action958< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action736( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action959< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action737( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action960< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action738( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action961< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action166( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action962< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action24( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action963< +>( + mode: Mode, + __0: (TextSize, ast::Pattern, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action90( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action964< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action683( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action965< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action684( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action966< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action523( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action967< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action521( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action968< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action599( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action969< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action58( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action970< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action59( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action971< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Pattern, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action105( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action972< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action106( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action973< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Pattern, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action107( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action974< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Pattern, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action685( mode, __temp0, __0, @@ -49174,7 +52078,854 @@ fn __action921< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action922< +fn __action975< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Pattern, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action686( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action976< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action109( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action977< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action488( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action978< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action490( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action979< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action541( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action980< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Comprehension +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action709( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action981< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Comprehension +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action710( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action982< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), +) -> Option +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action211( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action983< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action223( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action984< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action110( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action985< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Parameter +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action170( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action986< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Parameter +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action168( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action987< +>( + mode: Mode, + __0: (TextSize, core::option::Option, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, core::option::Option>, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action210( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action988< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action206( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action989< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action207( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action990< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action689( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action991< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action690( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action992< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action509( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action993< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action511( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action994< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action593( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action995< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action382( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action996< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action414( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action997< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Suite, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Mod +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action998< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Mod +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action2( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action999< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, core::option::Option, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action150( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1000< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, core::option::Option, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action151( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1001< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action152( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1002< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action164( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1003< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action165( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1004< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -49184,61 +52935,7 @@ fn __action922< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action172( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action923< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::TypeParam -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action173( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action924< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::TypeParam -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -49255,83 +52952,23 @@ fn __action924< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action925< +fn __action1005< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::TypeParams -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action641( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action926< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::TypeParams -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action642( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action927< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, core::option::Option, TextSize), + __1: (TextSize, ast::Identifier, TextSize), __2: (TextSize, TextSize, TextSize), -) -> ast::ParameterWithDefault +) -> ast::TypeParam { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action167( + __action175( mode, __temp0, __0, @@ -49342,378 +52979,17 @@ fn __action927< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action928< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::ParameterWithDefault -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action165( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action929< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action123( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action930< +fn __action1006< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, core::option::Option, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action146( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action931< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::WithItem -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action297( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action932< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::WithItem -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action298( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action933< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::WithItem -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action299( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action934< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> ast::WithItem -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action292( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action935< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::WithItem -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action293( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action936< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action160( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action937< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action661( - mode, - __temp0, - __0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action938< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action662( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action939< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action426( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action940< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> ast::Expr -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action389( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action502( - mode, - __temp0, - __0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action941< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), + __1: (TextSize, ast::Identifier, TextSize), __2: (TextSize, TextSize, TextSize), -) -> ast::Expr +) -> ast::TypeParam { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, @@ -49730,7 +53006,511 @@ fn __action941< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action942< +fn __action1007< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::TypeParams +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action691( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1008< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::TypeParams +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action692( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1009< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::ParameterWithDefault +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action169( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1010< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::ParameterWithDefault +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action167( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1011< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action125( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1012< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, core::option::Option, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action148( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1013< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::WithItem +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action299( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1014< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::WithItem +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action300( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1015< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::WithItem +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action301( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1016< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> ast::WithItem +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action294( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1017< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::WithItem +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action295( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1018< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action162( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1019< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action711( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1020< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action712( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1021< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action406( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1022< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action435( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1023< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action525( + mode, + __temp0, + __0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1024< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Expr +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action178( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1025< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49741,13 +53521,13 @@ fn __action942< { let __start0 = __0.0; let __end0 = __0.0; - let __temp0 = __action389( + let __temp0 = __action396( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action177( + __action179( mode, __temp0, __0, @@ -49757,2365 +53537,32 @@ fn __action942< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action943< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action870( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action944< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action871( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action945< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __5.2; - let __temp0 = __action872( - mode, - __1, - __2, - __3, - __4, - __5, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action946< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action873( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action947< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action874( - mode, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action948< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action875( - mode, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action949< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action876( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action950< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action877( - mode, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action414( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action951< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action870( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __4, - __5, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action952< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action871( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __3, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action953< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __4.2; - let __temp0 = __action872( - mode, - __0, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __5, - __6, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action954< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action873( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __4, - __5, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action955< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action874( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __2, - __3, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action956< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action875( - mode, - __0, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __1, - __2, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action957< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action876( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __3, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action958< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action877( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action858( - mode, - __temp0, - __2, - __3, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action959< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action870( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action960< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action871( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __3, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action961< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __4.2; - let __temp0 = __action872( - mode, - __0, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __5, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action962< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action873( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action963< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action874( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __2, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action964< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action875( - mode, - __0, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __1, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action965< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action876( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __3, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action966< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action877( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action859( - mode, - __temp0, - __2, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action967< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __4.2; - let __temp0 = __action943( - mode, - __0, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action968< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action944( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action969< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __5.2; - let __temp0 = __action945( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action970< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __4.2; - let __temp0 = __action946( - mode, - __0, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action971< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action947( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action972< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action948( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action973< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action949( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action974< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action950( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action412( - mode, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action975< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __5.2; - let __temp0 = __action967( - mode, - __1, - __2, - __3, - __4, - __5, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action976< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action968( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action977< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __6.2; - let __temp0 = __action969( - mode, - __1, - __2, - __3, - __4, - __5, - __6, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __7, - __8, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action978< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __5.2; - let __temp0 = __action970( - mode, - __1, - __2, - __3, - __4, - __5, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action979< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action971( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action980< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action972( - mode, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action981< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action973( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action982< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action974( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action983< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action413( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action854( - mode, - __0, - __temp0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action984< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __5.2; - let __temp0 = __action967( - mode, - __1, - __2, - __3, - __4, - __5, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action985< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action968( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action986< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __6.2; - let __temp0 = __action969( - mode, - __1, - __2, - __3, - __4, - __5, - __6, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action987< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __5.2; - let __temp0 = __action970( - mode, - __1, - __2, - __3, - __4, - __5, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action988< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action971( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action989< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action972( - mode, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action990< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action973( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action991< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action974( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action992< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action413( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action855( - mode, - __0, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action993< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), -) -> Option> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action460( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action419( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action994< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> Option> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action461( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action419( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action995< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action460( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action878( - mode, - __0, - __temp0, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action996< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action461( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action878( - mode, - __0, - __temp0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action997< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action460( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action879( - mode, - __0, - __temp0, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action998< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action461( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action879( - mode, - __0, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action999< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action460( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action880( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1000< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action461( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action880( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1001< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action460( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action881( - mode, - __0, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1002< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action461( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action881( - mode, - __0, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1003< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action995( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1004< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action996( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1005< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __5.2; - let __temp0 = __action997( - mode, - __1, - __2, - __3, - __4, - __5, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1006< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action998( - mode, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1007< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action999( - mode, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1008< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1000( - mode, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1009< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action1001( - mode, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1010< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1002( - mode, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action422( - mode, - __0, - __temp0, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1011< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action995( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __4, - __5, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1012< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action996( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __3, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1013< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __4.2; - let __temp0 = __action997( - mode, - __0, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __5, - __6, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1014< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action998( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __4, - __5, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1015< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action999( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __2, - __3, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1016< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action1000( - mode, - __0, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __1, - __2, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1017< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action1001( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __3, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1018< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action1002( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action866( - mode, - __temp0, - __2, - __3, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1019< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action995( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( - mode, - __temp0, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1020< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action996( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( - mode, - __temp0, - __3, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1021< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __4.2; - let __temp0 = __action997( - mode, - __0, - __1, - __2, - __3, - __4, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( - mode, - __temp0, - __5, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1022< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action998( - mode, - __0, - __1, - __2, - __3, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( - mode, - __temp0, - __4, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1023< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action999( - mode, - __0, - __1, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( - mode, - __temp0, - __2, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1024< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action1000( - mode, - __0, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( - mode, - __temp0, - __1, - )) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1025< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action1001( - mode, - __0, - __1, - __2, - )?; - let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( - mode, - __temp0, - __3, - )) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1026< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> { - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action1002( + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action949( mode, - __0, __1, + __2, + __3, + __4, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action867( + Ok(__action423( mode, + __0, __temp0, - __2, )) } @@ -52126,24 +53573,22 @@ fn __action1027< mode: Mode, __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Parameter, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> { - let __start0 = __0.0; - let __end0 = __4.2; - let __temp0 = __action1003( + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action950( mode, - __0, __1, __2, __3, - __4, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action423( mode, + __0, __temp0, )) } @@ -52155,22 +53600,26 @@ fn __action1028< mode: Mode, __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action1004( + let __start0 = __1.0; + let __end0 = __5.2; + let __temp0 = __action951( mode, - __0, __1, __2, __3, + __4, + __5, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action423( mode, + __0, __temp0, )) } @@ -52178,6 +53627,639 @@ fn __action1028< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1029< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action952( + mode, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action423( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1030< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action953( + mode, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action423( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1031< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action954( + mode, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action423( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1032< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action955( + mode, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action423( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1033< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action956( + mode, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action423( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1034< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action949( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __4, + __5, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1035< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action950( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __3, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1036< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __4.2; + let __temp0 = __action951( + mode, + __0, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __5, + __6, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1037< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action952( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __4, + __5, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1038< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action953( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __2, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1039< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action954( + mode, + __0, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __1, + __2, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1040< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action955( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __3, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1041< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action956( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action937( + mode, + __temp0, + __2, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1042< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action949( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1043< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action950( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1044< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __4.2; + let __temp0 = __action951( + mode, + __0, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __5, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1045< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action952( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1046< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action953( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __2, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1047< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action954( + mode, + __0, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __1, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1048< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action955( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1049< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action956( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action938( + mode, + __temp0, + __2, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1050< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __4.2; + let __temp0 = __action1026( + mode, + __0, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action421( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1051< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action1027( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action421( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1052< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52190,7 +54272,7 @@ fn __action1029< { let __start0 = __0.0; let __end0 = __5.2; - let __temp0 = __action1005( + let __temp0 = __action1028( mode, __0, __1, @@ -52200,7 +54282,7 @@ fn __action1029< __5, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action421( mode, __temp0, )) @@ -52208,7 +54290,7 @@ fn __action1029< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1030< +fn __action1053< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52220,7 +54302,7 @@ fn __action1030< { let __start0 = __0.0; let __end0 = __4.2; - let __temp0 = __action1006( + let __temp0 = __action1029( mode, __0, __1, @@ -52229,7 +54311,7 @@ fn __action1030< __4, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action421( mode, __temp0, )) @@ -52237,7 +54319,7 @@ fn __action1030< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1031< +fn __action1054< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52247,14 +54329,14 @@ fn __action1031< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action1007( + let __temp0 = __action1030( mode, __0, __1, __2, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action421( mode, __temp0, )) @@ -52262,7 +54344,7 @@ fn __action1031< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1032< +fn __action1055< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52271,13 +54353,13 @@ fn __action1032< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action1008( + let __temp0 = __action1031( mode, __0, __1, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action421( mode, __temp0, )) @@ -52285,7 +54367,7 @@ fn __action1032< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1033< +fn __action1056< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52296,7 +54378,7 @@ fn __action1033< { let __start0 = __0.0; let __end0 = __3.2; - let __temp0 = __action1009( + let __temp0 = __action1032( mode, __0, __1, @@ -52304,7 +54386,7 @@ fn __action1033< __3, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action421( mode, __temp0, )) @@ -52312,7 +54394,7 @@ fn __action1033< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1034< +fn __action1057< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52322,14 +54404,14 @@ fn __action1034< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action1010( + let __temp0 = __action1033( mode, __0, __1, __2, )?; let __temp0 = (__start0, __temp0, __end0); - Ok(__action420( + Ok(__action421( mode, __temp0, )) @@ -52337,7 +54419,7 @@ fn __action1034< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1035< +fn __action1058< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52352,7 +54434,7 @@ fn __action1035< { let __start0 = __1.0; let __end0 = __5.2; - let __temp0 = __action1027( + let __temp0 = __action1050( mode, __1, __2, @@ -52361,7 +54443,7 @@ fn __action1035< __5, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52372,7 +54454,7 @@ fn __action1035< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1036< +fn __action1059< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52386,7 +54468,7 @@ fn __action1036< { let __start0 = __1.0; let __end0 = __4.2; - let __temp0 = __action1028( + let __temp0 = __action1051( mode, __1, __2, @@ -52394,7 +54476,7 @@ fn __action1036< __4, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52405,7 +54487,7 @@ fn __action1036< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1037< +fn __action1060< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52421,7 +54503,7 @@ fn __action1037< { let __start0 = __1.0; let __end0 = __6.2; - let __temp0 = __action1029( + let __temp0 = __action1052( mode, __1, __2, @@ -52431,7 +54513,7 @@ fn __action1037< __6, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52442,7 +54524,7 @@ fn __action1037< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1038< +fn __action1061< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52457,7 +54539,7 @@ fn __action1038< { let __start0 = __1.0; let __end0 = __5.2; - let __temp0 = __action1030( + let __temp0 = __action1053( mode, __1, __2, @@ -52466,7 +54548,7 @@ fn __action1038< __5, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52477,7 +54559,7 @@ fn __action1038< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1039< +fn __action1062< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52490,14 +54572,14 @@ fn __action1039< { let __start0 = __1.0; let __end0 = __3.2; - let __temp0 = __action1031( + let __temp0 = __action1054( mode, __1, __2, __3, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52508,7 +54590,7 @@ fn __action1039< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1040< +fn __action1063< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52520,13 +54602,13 @@ fn __action1040< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1032( + let __temp0 = __action1055( mode, __1, __2, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52537,7 +54619,7 @@ fn __action1040< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1041< +fn __action1064< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52551,7 +54633,7 @@ fn __action1041< { let __start0 = __1.0; let __end0 = __4.2; - let __temp0 = __action1033( + let __temp0 = __action1056( mode, __1, __2, @@ -52559,7 +54641,7 @@ fn __action1041< __4, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52570,7 +54652,7 @@ fn __action1041< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1042< +fn __action1065< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52583,14 +54665,14 @@ fn __action1042< { let __start0 = __1.0; let __end0 = __3.2; - let __temp0 = __action1034( + let __temp0 = __action1057( mode, __1, __2, __3, )?; let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52601,7 +54683,7 @@ fn __action1042< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1043< +fn __action1066< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52611,13 +54693,13 @@ fn __action1043< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action421( + let __temp0 = __action422( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action862( + __action933( mode, __0, __temp0, @@ -52628,7 +54710,7 @@ fn __action1043< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1044< +fn __action1067< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52642,7 +54724,7 @@ fn __action1044< { let __start0 = __1.0; let __end0 = __5.2; - let __temp0 = __action1027( + let __temp0 = __action1050( mode, __1, __2, @@ -52651,7 +54733,7 @@ fn __action1044< __5, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52661,7 +54743,7 @@ fn __action1044< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1045< +fn __action1068< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52674,7 +54756,7 @@ fn __action1045< { let __start0 = __1.0; let __end0 = __4.2; - let __temp0 = __action1028( + let __temp0 = __action1051( mode, __1, __2, @@ -52682,7 +54764,7 @@ fn __action1045< __4, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52692,7 +54774,7 @@ fn __action1045< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1046< +fn __action1069< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52707,7 +54789,7 @@ fn __action1046< { let __start0 = __1.0; let __end0 = __6.2; - let __temp0 = __action1029( + let __temp0 = __action1052( mode, __1, __2, @@ -52717,7 +54799,7 @@ fn __action1046< __6, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52727,7 +54809,7 @@ fn __action1046< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1047< +fn __action1070< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52741,7 +54823,7 @@ fn __action1047< { let __start0 = __1.0; let __end0 = __5.2; - let __temp0 = __action1030( + let __temp0 = __action1053( mode, __1, __2, @@ -52750,7 +54832,7 @@ fn __action1047< __5, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52760,7 +54842,7 @@ fn __action1047< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1048< +fn __action1071< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52772,14 +54854,14 @@ fn __action1048< { let __start0 = __1.0; let __end0 = __3.2; - let __temp0 = __action1031( + let __temp0 = __action1054( mode, __1, __2, __3, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52789,7 +54871,7 @@ fn __action1048< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1049< +fn __action1072< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52800,13 +54882,13 @@ fn __action1049< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1032( + let __temp0 = __action1055( mode, __1, __2, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52816,7 +54898,7 @@ fn __action1049< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1050< +fn __action1073< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52829,7 +54911,7 @@ fn __action1050< { let __start0 = __1.0; let __end0 = __4.2; - let __temp0 = __action1033( + let __temp0 = __action1056( mode, __1, __2, @@ -52837,7 +54919,7 @@ fn __action1050< __4, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52847,7 +54929,7 @@ fn __action1050< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1051< +fn __action1074< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52859,14 +54941,14 @@ fn __action1051< { let __start0 = __1.0; let __end0 = __3.2; - let __temp0 = __action1034( + let __temp0 = __action1057( mode, __1, __2, __3, )?; let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52876,7 +54958,7 @@ fn __action1051< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1052< +fn __action1075< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -52885,13 +54967,13 @@ fn __action1052< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action421( + let __temp0 = __action422( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action863( + __action934( mode, __0, __temp0, @@ -52901,7 +54983,1705 @@ fn __action1052< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1053< +fn __action1076< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), +) -> Option> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action467( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action428( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1077< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> Option> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action468( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action428( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1078< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action467( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action957( + mode, + __0, + __temp0, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1079< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action468( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action957( + mode, + __0, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1080< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action467( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action958( + mode, + __0, + __temp0, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1081< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action468( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action958( + mode, + __0, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1082< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action467( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action959( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1083< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action468( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action959( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1084< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action467( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action960( + mode, + __0, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1085< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action468( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action960( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1086< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action1078( + mode, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1087< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action1079( + mode, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1088< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __5.2; + let __temp0 = __action1080( + mode, + __1, + __2, + __3, + __4, + __5, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1089< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action1081( + mode, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1090< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1082( + mode, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1091< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1083( + mode, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1092< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action1084( + mode, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1093< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result<(Option>, Vec, Option>),__lalrpop_util::ParseError> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1085( + mode, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action431( + mode, + __0, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1094< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action1078( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __4, + __5, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1095< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1079( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __3, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1096< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __4.2; + let __temp0 = __action1080( + mode, + __0, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __5, + __6, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1097< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action1081( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __4, + __5, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1098< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action1082( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __2, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1099< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action1083( + mode, + __0, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __1, + __2, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1100< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1084( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __3, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1101< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action1085( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action945( + mode, + __temp0, + __2, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1102< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action1078( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1103< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1079( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1104< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __4.2; + let __temp0 = __action1080( + mode, + __0, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __5, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1105< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action1081( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __4, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1106< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action1082( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __2, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1107< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action1083( + mode, + __0, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __1, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1108< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1084( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __3, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1109< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action1085( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action946( + mode, + __temp0, + __2, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1110< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __4.2; + let __temp0 = __action1086( + mode, + __0, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1111< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action1087( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1112< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __5.2; + let __temp0 = __action1088( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1113< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __4.2; + let __temp0 = __action1089( + mode, + __0, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1114< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1090( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1115< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action1091( + mode, + __0, + __1, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1116< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action1092( + mode, + __0, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1117< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result>, Vec, Option>)>,__lalrpop_util::ParseError> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1093( + mode, + __0, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + Ok(__action429( + mode, + __temp0, + )) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1118< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __5.2; + let __temp0 = __action1110( + mode, + __1, + __2, + __3, + __4, + __5, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1119< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action1111( + mode, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1120< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __6.2; + let __temp0 = __action1112( + mode, + __1, + __2, + __3, + __4, + __5, + __6, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1121< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __5.2; + let __temp0 = __action1113( + mode, + __1, + __2, + __3, + __4, + __5, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1122< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action1114( + mode, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1123< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1115( + mode, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1124< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action1116( + mode, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1125< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action1117( + mode, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1126< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action430( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action941( + mode, + __0, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1127< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __5.2; + let __temp0 = __action1110( + mode, + __1, + __2, + __3, + __4, + __5, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1128< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action1111( + mode, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1129< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __6.2; + let __temp0 = __action1112( + mode, + __1, + __2, + __3, + __4, + __5, + __6, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1130< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __5.2; + let __temp0 = __action1113( + mode, + __1, + __2, + __3, + __4, + __5, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1131< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action1114( + mode, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1132< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1115( + mode, + __1, + __2, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1133< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action1116( + mode, + __1, + __2, + __3, + __4, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1134< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action1117( + mode, + __1, + __2, + __3, + )?; + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1135< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action430( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action942( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1136< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52910,13 +56690,13 @@ fn __action1053< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action350( + let __temp0 = __action357( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action348( + __action355( mode, __temp0, ) @@ -52924,7 +56704,7 @@ fn __action1053< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1054< +fn __action1137< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52936,13 +56716,13 @@ fn __action1054< { let __start0 = __2.0; let __end0 = __3.2; - let __temp0 = __action1053( + let __temp0 = __action1136( mode, __2, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action709( + __action761( mode, __0, __1, @@ -52953,7 +56733,7 @@ fn __action1054< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1055< +fn __action1138< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52963,13 +56743,13 @@ fn __action1055< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action349( + let __temp0 = __action356( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action709( + __action761( mode, __0, __1, @@ -52980,7 +56760,7 @@ fn __action1055< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1056< +fn __action1139< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -52989,13 +56769,13 @@ fn __action1056< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action543( + let __temp0 = __action587( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action549( + __action597( mode, __temp0, ) @@ -53003,7 +56783,7 @@ fn __action1056< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1057< +fn __action1140< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -53013,13 +56793,13 @@ fn __action1057< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action543( + let __temp0 = __action587( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action550( + __action598( mode, __0, __temp0, @@ -53028,7 +56808,7 @@ fn __action1057< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1058< +fn __action1141< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53041,13 +56821,13 @@ fn __action1058< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action541( + let __temp0 = __action585( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action717( + __action769( mode, __0, __1, @@ -53061,7 +56841,7 @@ fn __action1058< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1059< +fn __action1142< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53075,12 +56855,12 @@ fn __action1059< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action542( + let __temp0 = __action586( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action717( + __action769( mode, __0, __1, @@ -53094,7 +56874,7 @@ fn __action1059< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1060< +fn __action1143< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53106,13 +56886,13 @@ fn __action1060< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action541( + let __temp0 = __action585( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action718( + __action770( mode, __0, __1, @@ -53125,7 +56905,7 @@ fn __action1060< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1061< +fn __action1144< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53138,12 +56918,12 @@ fn __action1061< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action542( + let __temp0 = __action586( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action718( + __action770( mode, __0, __1, @@ -53156,7 +56936,7 @@ fn __action1061< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1062< +fn __action1145< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53169,13 +56949,13 @@ fn __action1062< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action541( + let __temp0 = __action585( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action735( + __action789( mode, __0, __1, @@ -53189,7 +56969,7 @@ fn __action1062< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1063< +fn __action1146< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53203,12 +56983,12 @@ fn __action1063< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action542( + let __temp0 = __action586( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action735( + __action789( mode, __0, __1, @@ -53222,7 +57002,7 @@ fn __action1063< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1064< +fn __action1147< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53234,13 +57014,13 @@ fn __action1064< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action541( + let __temp0 = __action585( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action736( + __action790( mode, __0, __1, @@ -53253,7 +57033,7 @@ fn __action1064< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1065< +fn __action1148< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53266,12 +57046,12 @@ fn __action1065< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action542( + let __temp0 = __action586( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action736( + __action790( mode, __0, __1, @@ -53284,7 +57064,135 @@ fn __action1065< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1066< +fn __action1149< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action585( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action807( + mode, + __0, + __1, + __2, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1150< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action586( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action807( + mode, + __0, + __1, + __2, + __temp0, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1151< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __3.0; + let __temp0 = __action585( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action808( + mode, + __0, + __1, + __2, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1152< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action586( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action808( + mode, + __0, + __1, + __2, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1153< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53293,13 +57201,13 @@ fn __action1066< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action296( + let __temp0 = __action298( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action290( + __action292( mode, __temp0, ) @@ -53307,7 +57215,7 @@ fn __action1066< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1067< +fn __action1154< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -53317,13 +57225,13 @@ fn __action1067< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action296( + let __temp0 = __action298( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action291( + __action293( mode, __0, __temp0, @@ -53332,7 +57240,7 @@ fn __action1067< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1068< +fn __action1155< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53344,13 +57252,13 @@ fn __action1068< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action294( + let __temp0 = __action296( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action645( + __action695( mode, __0, __1, @@ -53363,7 +57271,7 @@ fn __action1068< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1069< +fn __action1156< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53376,12 +57284,12 @@ fn __action1069< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action295( + let __temp0 = __action297( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action645( + __action695( mode, __0, __1, @@ -53394,7 +57302,7 @@ fn __action1069< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1070< +fn __action1157< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53405,13 +57313,13 @@ fn __action1070< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action294( + let __temp0 = __action296( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action646( + __action696( mode, __0, __1, @@ -53423,7 +57331,7 @@ fn __action1070< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1071< +fn __action1158< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53435,12 +57343,12 @@ fn __action1071< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action295( + let __temp0 = __action297( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action646( + __action696( mode, __0, __1, @@ -53452,7 +57360,7 @@ fn __action1071< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1072< +fn __action1159< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53461,13 +57369,13 @@ fn __action1072< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action283( + let __temp0 = __action285( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action281( + __action283( mode, __temp0, ) @@ -53475,7 +57383,7 @@ fn __action1072< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1073< +fn __action1160< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -53492,13 +57400,13 @@ fn __action1073< { let __start0 = __6.0; let __end0 = __7.2; - let __temp0 = __action1072( + let __temp0 = __action1159( mode, __6, __7, ); let __temp0 = (__start0, __temp0, __end0); - __action798( + __action876( mode, __0, __1, @@ -53514,7 +57422,7 @@ fn __action1073< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1074< +fn __action1161< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -53529,13 +57437,13 @@ fn __action1074< { let __start0 = __5.2; let __end0 = __6.0; - let __temp0 = __action282( + let __temp0 = __action284( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action798( + __action876( mode, __0, __1, @@ -53551,7 +57459,7 @@ fn __action1074< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1075< +fn __action1162< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -53567,13 +57475,13 @@ fn __action1075< { let __start0 = __5.0; let __end0 = __6.2; - let __temp0 = __action1072( + let __temp0 = __action1159( mode, __5, __6, ); let __temp0 = (__start0, __temp0, __end0); - __action799( + __action877( mode, __0, __1, @@ -53588,7 +57496,7 @@ fn __action1075< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1076< +fn __action1163< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -53602,13 +57510,13 @@ fn __action1076< { let __start0 = __4.2; let __end0 = __5.0; - let __temp0 = __action282( + let __temp0 = __action284( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action799( + __action877( mode, __0, __1, @@ -53623,7 +57531,7 @@ fn __action1076< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1077< +fn __action1164< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53632,13 +57540,13 @@ fn __action1077< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action355( + let __temp0 = __action362( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action353( + __action360( mode, __temp0, ) @@ -53646,7 +57554,7 @@ fn __action1077< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1078< +fn __action1165< >( mode: Mode, __0: (TextSize, alloc::vec::Vec<(token::Tok, ast::Identifier)>, TextSize), @@ -53656,13 +57564,13 @@ fn __action1078< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action355( + let __temp0 = __action362( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action354( + __action361( mode, __0, __temp0, @@ -53671,7 +57579,7 @@ fn __action1078< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1079< +fn __action1166< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53680,13 +57588,13 @@ fn __action1079< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action273( + let __temp0 = __action275( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action271( + __action273( mode, __temp0, ) @@ -53694,7 +57602,7 @@ fn __action1079< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1080< +fn __action1167< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53705,13 +57613,13 @@ fn __action1080< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1079( + let __temp0 = __action1166( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action780( + __action856( mode, __0, __temp0, @@ -53721,7 +57629,7 @@ fn __action1080< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1081< +fn __action1168< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53730,13 +57638,13 @@ fn __action1081< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action272( + let __temp0 = __action274( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action780( + __action856( mode, __0, __temp0, @@ -53746,7 +57654,7 @@ fn __action1081< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1082< +fn __action1169< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53757,13 +57665,13 @@ fn __action1082< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1079( + let __temp0 = __action1166( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action922( + __action1004( mode, __0, __temp0, @@ -53773,7 +57681,7 @@ fn __action1082< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1083< +fn __action1170< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53782,13 +57690,13 @@ fn __action1083< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action272( + let __temp0 = __action274( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action922( + __action1004( mode, __0, __temp0, @@ -53798,7 +57706,7 @@ fn __action1083< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1084< +fn __action1171< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53809,13 +57717,13 @@ fn __action1084< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1079( + let __temp0 = __action1166( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action927( + __action1009( mode, __0, __temp0, @@ -53825,7 +57733,7 @@ fn __action1084< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1085< +fn __action1172< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53834,13 +57742,13 @@ fn __action1085< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action272( + let __temp0 = __action274( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action927( + __action1009( mode, __0, __temp0, @@ -53850,7 +57758,7 @@ fn __action1085< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1086< +fn __action1173< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53859,13 +57767,13 @@ fn __action1086< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action270( + let __temp0 = __action272( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action268( + __action270( mode, __temp0, ) @@ -53873,7 +57781,7 @@ fn __action1086< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1087< +fn __action1174< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53884,13 +57792,13 @@ fn __action1087< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1086( + let __temp0 = __action1173( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action904( + __action985( mode, __0, __temp0, @@ -53900,7 +57808,7 @@ fn __action1087< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1088< +fn __action1175< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -53909,13 +57817,13 @@ fn __action1088< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action269( + let __temp0 = __action271( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action904( + __action985( mode, __0, __temp0, @@ -53925,7 +57833,7 @@ fn __action1088< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1089< +fn __action1176< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53933,12 +57841,12 @@ fn __action1089< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action387( + let __temp0 = __action352( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action390( + __action350( mode, __temp0, ) @@ -53946,7 +57854,7 @@ fn __action1089< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1090< +fn __action1177< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -53955,12 +57863,12 @@ fn __action1090< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action387( + let __temp0 = __action352( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action391( + __action351( mode, __0, __temp0, @@ -53969,7 +57877,51 @@ fn __action1090< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1091< +fn __action1178< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action394( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action397( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1179< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action394( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action398( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1180< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -53979,13 +57931,13 @@ fn __action1091< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action385( + let __temp0 = __action392( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action916( + __action998( mode, __0, __1, @@ -53996,7 +57948,7 @@ fn __action1091< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1092< +fn __action1181< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -54007,12 +57959,12 @@ fn __action1092< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action386( + let __temp0 = __action393( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action916( + __action998( mode, __0, __1, @@ -54023,7 +57975,7 @@ fn __action1092< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1093< +fn __action1182< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -54032,13 +57984,13 @@ fn __action1093< { let __start0 = __0.0; let __end0 = __1.2; - let __temp0 = __action398( + let __temp0 = __action405( mode, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action396( + __action403( mode, __temp0, ) @@ -54046,7 +57998,7 @@ fn __action1093< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1094< +fn __action1183< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -54057,13 +58009,13 @@ fn __action1094< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1093( + let __temp0 = __action1182( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action811( + __action890( mode, __0, __temp0, @@ -54073,7 +58025,7 @@ fn __action1094< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1095< +fn __action1184< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -54082,13 +58034,13 @@ fn __action1095< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action397( + let __temp0 = __action404( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action811( + __action890( mode, __0, __temp0, @@ -54098,7 +58050,7 @@ fn __action1095< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1096< +fn __action1185< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -54109,13 +58061,13 @@ fn __action1096< { let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action1093( + let __temp0 = __action1182( mode, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action812( + __action891( mode, __0, __temp0, @@ -54125,7 +58077,7 @@ fn __action1096< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1097< +fn __action1186< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -54134,13 +58086,13 @@ fn __action1097< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action397( + let __temp0 = __action404( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action812( + __action891( mode, __0, __temp0, @@ -54150,7 +58102,7 @@ fn __action1097< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1098< +fn __action1187< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -54160,14 +58112,14 @@ fn __action1098< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action317( + let __temp0 = __action319( mode, __0, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action315( + __action317( mode, __temp0, ) @@ -54175,7 +58127,7 @@ fn __action1098< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1099< +fn __action1188< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -54192,14 +58144,14 @@ fn __action1099< { let __start0 = __7.0; let __end0 = __9.2; - let __temp0 = __action1098( + let __temp0 = __action1187( mode, __7, __8, __9, ); let __temp0 = (__start0, __temp0, __end0); - __action796( + __action874( mode, __0, __1, @@ -54214,7 +58166,7 @@ fn __action1099< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1100< +fn __action1189< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -54228,13 +58180,13 @@ fn __action1100< { let __start0 = __6.2; let __end0 = __6.2; - let __temp0 = __action316( + let __temp0 = __action318( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action796( + __action874( mode, __0, __1, @@ -54249,7 +58201,7 @@ fn __action1100< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1101< +fn __action1190< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -54265,14 +58217,14 @@ fn __action1101< { let __start0 = __6.0; let __end0 = __8.2; - let __temp0 = __action1098( + let __temp0 = __action1187( mode, __6, __7, __8, ); let __temp0 = (__start0, __temp0, __end0); - __action797( + __action875( mode, __0, __1, @@ -54286,7 +58238,7 @@ fn __action1101< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1102< +fn __action1191< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -54299,13 +58251,13 @@ fn __action1102< { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action316( + let __temp0 = __action318( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action797( + __action875( mode, __0, __1, @@ -54317,2601 +58269,40 @@ fn __action1102< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1103< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, core::option::Option, TextSize), - __8: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __6.2; - let __temp0 = __action1098( - mode, - __4, - __5, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action917( - mode, - __0, - __1, - __2, - __3, - __temp0, - __7, - __8, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1104< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action316( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action917( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1105< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, core::option::Option, TextSize), - __8: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __6.2; - let __temp0 = __action1098( - mode, - __4, - __5, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action918( - mode, - __0, - __1, - __2, - __3, - __temp0, - __7, - __8, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1106< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action316( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action918( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1107< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __6.2; - let __temp0 = __action1098( - mode, - __4, - __5, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action930( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1108< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action316( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action930( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1109< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), -) -> core::option::Option -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action310( - mode, - __0, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action308( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1110< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.0; - let __end0 = __5.2; - let __temp0 = __action310( - mode, - __3, - __4, - __5, - ); - let __temp0 = (__start0, __temp0, __end0); - __action919( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1111< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, ast::Suite, TextSize), - __10: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __7.0; - let __end0 = __9.2; - let __temp0 = __action1109( - mode, - __7, - __8, - __9, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1103( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - __10, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1112< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __6.2; - let __end0 = __7.0; - let __temp0 = __action309( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1103( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1113< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __6.2; - let __temp0 = __action1109( - mode, - __4, - __5, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1104( - mode, - __0, - __1, - __2, - __3, - __temp0, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1114< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action309( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1104( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1115< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, ast::Suite, TextSize), - __10: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __7.0; - let __end0 = __9.2; - let __temp0 = __action1109( - mode, - __7, - __8, - __9, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1105( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - __10, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1116< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __6.2; - let __end0 = __7.0; - let __temp0 = __action309( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1105( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1117< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __6.2; - let __temp0 = __action1109( - mode, - __4, - __5, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1106( - mode, - __0, - __1, - __2, - __3, - __temp0, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1118< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action309( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1106( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1119< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> core::option::Option -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action370( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action368( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1120< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __2.0; - let __end0 = __3.2; - let __temp0 = __action1119( - mode, - __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action890( - mode, - __0, - __1, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1121< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> ast::Stmt -{ - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action369( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action890( - mode, - __0, - __1, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1122< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), -) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> -{ - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action697( - mode, - __0, - __1, - __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action403( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1123< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Suite, TextSize), -) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> -{ - let __start0 = __1.0; - let __end0 = __4.2; - let __temp0 = __action697( - mode, - __1, - __2, - __3, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action404( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1124< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, core::option::Option<(TextSize, ast::Suite)>, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action321( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action810( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1125< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), - __5: (TextSize, core::option::Option<(TextSize, ast::Suite)>, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action322( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action810( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1126< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), -) -> core::option::Option<(TextSize, ast::Suite)> -{ - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action698( - mode, - __0, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action318( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1127< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __6.2; - let __temp0 = __action1126( - mode, - __4, - __5, - __6, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1124( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1128< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action319( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1124( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1129< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __5.0; - let __end0 = __7.2; - let __temp0 = __action1126( - mode, - __5, - __6, - __7, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1125( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1130< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), - __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action319( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1125( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1131< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action432( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action430( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1132< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action432( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action431( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1133< ->( - mode: Mode, - __0: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action441( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action442( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1134< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - __1: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action441( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action443( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1135< ->( - mode: Mode, - __0: (TextSize, core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), -) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action439( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action237( - mode, - __temp0, - __0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1136< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - __1: (TextSize, core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), -) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action440( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action237( - mode, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1137< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action446( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action444( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1138< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action446( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action445( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1139< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> core::option::Option> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action546( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action544( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1140< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1058( - mode, - __0, - __temp0, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1141< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1058( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1142< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1059( - mode, - __0, - __temp0, - __3, - __4, - __5, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1143< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1059( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1144< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1060( - mode, - __0, - __temp0, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1145< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1060( - mode, - __0, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1146< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1061( - mode, - __0, - __temp0, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1147< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1061( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1148< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1062( - mode, - __0, - __temp0, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1149< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1062( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1150< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1063( - mode, - __0, - __temp0, - __3, - __4, - __5, - __6, - __7, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1151< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1063( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1152< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1064( - mode, - __0, - __temp0, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1153< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1064( - mode, - __0, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1154< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1139( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1065( - mode, - __0, - __temp0, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1155< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action545( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1065( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1156< ->( - mode: Mode, - __0: (TextSize, ast::Pattern, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action336( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action334( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1157< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action336( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action335( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1158< ->( - mode: Mode, - __0: (TextSize, core::option::Option, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action401( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action333( - mode, - __temp0, - __0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1159< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, core::option::Option, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action402( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action333( - mode, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1160< ->( - mode: Mode, - __0: (TextSize, ast::Stmt, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action384( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action392( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1161< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> alloc::vec::Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action384( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action393( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1162< ->( - mode: Mode, - __0: (TextSize, ast::Suite, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action647( - mode, - __0, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1163< ->( - mode: Mode, - __0: (TextSize, ast::Suite, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action383( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action647( - mode, - __0, - __temp0, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1164< ->( - mode: Mode, - __0: (TextSize, ast::Suite, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action648( - mode, - __0, - __temp0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1165< ->( - mode: Mode, - __0: (TextSize, ast::Suite, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action383( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action648( - mode, - __0, - __temp0, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1166< ->( - mode: Mode, - __0: (TextSize, ast::Stmt, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action649( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1167< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action383( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action649( - mode, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1168< ->( - mode: Mode, - __0: (TextSize, ast::Stmt, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action650( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1169< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action383( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action650( - mode, - __temp0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1170< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action651( - mode, - __0, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1171< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action383( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action651( - mode, - __0, - __temp0, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1172< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action652( - mode, - __0, - __temp0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1173< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Stmt, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action383( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action652( - mode, - __0, - __temp0, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1174< ->( - mode: Mode, - __0: (TextSize, ast::Stmt, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action653( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1175< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action383( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action653( - mode, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1176< ->( - mode: Mode, - __0: (TextSize, ast::Stmt, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action382( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action654( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1177< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Stmt, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Suite -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action383( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action654( - mode, - __temp0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1178< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Identifier, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - let __start0 = __1.0; - let __end0 = __3.2; - let __temp0 = __action305( - mode, - __1, - __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action782( - mode, - __0, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1179< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Identifier, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::ExceptHandler -{ - let __start0 = __2.0; - let __end0 = __4.2; - let __temp0 = __action305( - mode, - __2, - __3, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action784( - mode, - __0, - __1, - __temp0, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1180< ->( - mode: Mode, - __0: (TextSize, (String, StringKind, bool), TextSize), -) -> (TextSize, (String, StringKind, bool), TextSize) -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action699( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1181< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action700( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1182< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action701( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1183< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action702( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1184< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action703( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1185< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action704( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1186< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action705( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1187< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action706( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1188< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action707( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1189< ->( - mode: Mode, - __0: (TextSize, ast::Pattern, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action708( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1190< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1054( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1191< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1055( - mode, - __0, - __1, - __temp0, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1192< >( mode: Mode, - __0: (TextSize, ast::Constant, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, core::option::Option, TextSize), + __8: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __4.0; + let __end0 = __6.2; + let __temp0 = __action1187( mode, - &__start0, - &__end0, + __4, + __5, + __6, ); let __temp0 = (__start0, __temp0, __end0); - __action711( + __action999( mode, __0, + __1, + __2, + __3, __temp0, + __7, + __8, ) } @@ -56920,21 +58311,31 @@ fn __action1192< fn __action1193< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action318( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action712( + __action999( mode, __0, + __1, + __2, + __3, __temp0, + __4, + __5, ) } @@ -56944,24 +58345,34 @@ fn __action1194< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, core::option::Option, TextSize), + __8: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __4.0; + let __end0 = __6.2; + let __temp0 = __action1187( mode, - &__start0, - &__end0, + __4, + __5, + __6, ); let __temp0 = (__start0, __temp0, __end0); - __action713( + __action1000( mode, __0, __1, __2, + __3, __temp0, + __7, + __8, ) } @@ -56971,26 +58382,30 @@ fn __action1195< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> ast::Stmt { let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __end0 = __4.0; + let __temp0 = __action318( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action714( + __action1000( mode, __0, __1, __2, __3, __temp0, + __4, + __5, ) } @@ -57000,20 +58415,24 @@ fn __action1196< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __4.0; + let __end0 = __6.2; + let __temp0 = __action1187( mode, - &__start0, - &__end0, + __4, + __5, + __6, ); let __temp0 = (__start0, __temp0, __end0); - __action715( + __action1012( mode, __0, __1, @@ -57029,23 +58448,25 @@ fn __action1197< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __3: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action318( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action716( + __action1012( mode, __0, __1, __2, + __3, __temp0, ) } @@ -57056,29 +58477,21 @@ fn __action1198< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), +) -> core::option::Option { - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1140( + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action312( mode, __0, __1, __2, - __3, - __4, - __5, + ); + let __temp0 = (__start0, __temp0, __end0); + __action310( + mode, __temp0, ) } @@ -57089,25 +58502,27 @@ fn __action1199< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), __3: (TextSize, token::Tok, TextSize), -) -> Result> + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __3.0; + let __end0 = __5.2; + let __temp0 = __action312( mode, - &__start0, - &__end0, + __3, + __4, + __5, ); let __temp0 = (__start0, __temp0, __end0); - __action1141( + __action1001( mode, __0, __1, __2, - __3, __temp0, ) } @@ -57118,23 +58533,28 @@ fn __action1200< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, ast::Suite, TextSize), + __10: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( + let __start0 = __7.0; + let __end0 = __9.2; + let __temp0 = __action1198( mode, - &__start0, - &__end0, + __7, + __8, + __9, ); let __temp0 = (__start0, __temp0, __end0); - __action1142( + __action1192( mode, __0, __1, @@ -57144,6 +58564,7 @@ fn __action1200< __5, __6, __temp0, + __10, ) } @@ -57153,28 +58574,34 @@ fn __action1201< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), __4: (TextSize, token::Tok, TextSize), -) -> Result> + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( + let __start0 = __6.2; + let __end0 = __7.0; + let __temp0 = __action311( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1143( + __action1192( mode, __0, __1, __2, __3, __4, + __5, + __6, __temp0, + __7, ) } @@ -57184,28 +58611,32 @@ fn __action1202< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), __4: (TextSize, token::Tok, TextSize), -) -> Result> + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( + let __start0 = __4.0; + let __end0 = __6.2; + let __temp0 = __action1198( mode, - &__start0, - &__end0, + __4, + __5, + __6, ); let __temp0 = (__start0, __temp0, __end0); - __action1144( + __action1193( mode, __0, __1, __2, __3, - __4, __temp0, + __7, ) } @@ -57215,24 +58646,28 @@ fn __action1203< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action311( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1145( + __action1193( mode, __0, __1, __2, + __3, __temp0, + __4, ) } @@ -57242,22 +58677,28 @@ fn __action1204< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), __5: (TextSize, token::Tok, TextSize), -) -> Result> + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, ast::Suite, TextSize), + __10: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( + let __start0 = __7.0; + let __end0 = __9.2; + let __temp0 = __action1198( mode, - &__start0, - &__end0, + __7, + __8, + __9, ); let __temp0 = (__start0, __temp0, __end0); - __action1146( + __action1194( mode, __0, __1, @@ -57265,7 +58706,9 @@ fn __action1204< __3, __4, __5, + __6, __temp0, + __10, ) } @@ -57275,26 +58718,34 @@ fn __action1205< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __6.2; + let __end0 = __7.0; + let __temp0 = __action311( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1147( + __action1194( mode, __0, __1, __2, __3, + __4, + __5, + __6, __temp0, + __7, ) } @@ -57305,21 +58756,31 @@ fn __action1206< mode: Mode, __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __4.0; + let __end0 = __6.2; + let __temp0 = __action1198( mode, - &__start0, - &__end0, + __4, + __5, + __6, ); let __temp0 = (__start0, __temp0, __end0); - __action719( + __action1195( mode, __0, __1, + __2, + __3, __temp0, + __7, ) } @@ -57329,26 +58790,28 @@ fn __action1207< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Stmt { let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __end0 = __4.0; + let __temp0 = __action311( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action720( + __action1195( mode, __0, __1, __2, __3, __temp0, + __4, ) } @@ -57358,25 +58821,19 @@ fn __action1208< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> + __1: (TextSize, ast::Expr, TextSize), +) -> core::option::Option { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action721( + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action377( mode, __0, __1, - __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action375( + mode, __temp0, ) } @@ -57387,24 +58844,26 @@ fn __action1209< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __2.0; + let __end0 = __3.2; + let __temp0 = __action1208( mode, - &__start0, - &__end0, + __2, + __3, ); let __temp0 = (__start0, __temp0, __end0); - __action722( + __action970( mode, __0, __1, - __2, __temp0, + __4, ) } @@ -57414,26 +58873,24 @@ fn __action1210< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (ast::Expr, ast::Expr), TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> ast::Stmt { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action376( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action723( + __action970( mode, __0, __1, - __2, - __3, __temp0, + __2, ) } @@ -57443,23 +58900,23 @@ fn __action1211< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __3: (TextSize, ast::Suite, TextSize), +) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action724( + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action747( mode, __0, __1, __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action412( + mode, __temp0, ) } @@ -57469,26 +58926,26 @@ fn __action1211< fn __action1212< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), + __0: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __4: (TextSize, ast::Suite, TextSize), +) -> alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __4.2; + let __temp0 = __action747( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action725( - mode, - __0, __1, __2, __3, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action413( + mode, + __0, __temp0, ) } @@ -57499,20 +58956,28 @@ fn __action1213< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, core::option::Option<(TextSize, ast::Suite)>, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action323( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action726( + __action889( mode, __0, + __1, + __2, + __3, __temp0, + __4, ) } @@ -57522,20 +58987,28 @@ fn __action1214< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), + __5: (TextSize, core::option::Option<(TextSize, ast::Suite)>, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action324( mode, - &__start0, - &__end0, + __4, ); let __temp0 = (__start0, __temp0, __end0); - __action727( + __action889( mode, __0, + __1, + __2, + __3, __temp0, + __5, ) } @@ -57545,19 +59018,21 @@ fn __action1215< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), +) -> core::option::Option<(TextSize, ast::Suite)> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action728( + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action748( mode, __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action320( + mode, __temp0, ) } @@ -57568,19 +59043,29 @@ fn __action1216< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __4.0; + let __end0 = __6.2; + let __temp0 = __action1215( mode, - &__start0, - &__end0, + __4, + __5, + __6, ); let __temp0 = (__start0, __temp0, __end0); - __action729( + __action1213( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -57590,20 +59075,26 @@ fn __action1216< fn __action1217< >( mode: Mode, - __0: (TextSize, ast::Constant, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action321( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action731( + __action1213( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -57613,20 +59104,32 @@ fn __action1217< fn __action1218< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __5.0; + let __end0 = __7.2; + let __temp0 = __action1215( mode, - &__start0, - &__end0, + __5, + __6, + __7, ); let __temp0 = (__start0, __temp0, __end0); - __action732( + __action1214( mode, __0, + __1, + __2, + __3, + __4, __temp0, ) } @@ -57637,23 +59140,27 @@ fn __action1219< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __3: (TextSize, ast::Suite, TextSize), + __4: (TextSize, alloc::vec::Vec<(TextSize, ast::Expr, ast::Suite)>, TextSize), +) -> ast::Stmt { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action321( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action733( + __action1214( mode, __0, __1, __2, + __3, + __4, __temp0, ) } @@ -57663,26 +59170,20 @@ fn __action1219< fn __action1220< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action734( + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action441( mode, __0, __1, - __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action439( + mode, __temp0, ) } @@ -57692,30 +59193,22 @@ fn __action1220< fn __action1221< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> +) -> alloc::vec::Vec { - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action441( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1148( - mode, - __0, __1, __2, - __3, - __4, - __5, + ); + let __temp0 = (__start0, __temp0, __end0); + __action440( + mode, + __0, __temp0, ) } @@ -57725,26 +59218,20 @@ fn __action1221< fn __action1222< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1149( + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action450( mode, __0, __1, - __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action451( + mode, __temp0, ) } @@ -57754,32 +59241,22 @@ fn __action1222< fn __action1223< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), + __1: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> +) -> alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action450( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1150( - mode, - __0, __1, __2, - __3, - __4, - __5, - __6, + ); + let __temp0 = (__start0, __temp0, __end0); + __action452( + mode, + __0, __temp0, ) } @@ -57789,29 +59266,21 @@ fn __action1223< fn __action1224< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), +) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action448( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1151( + __action239( mode, - __0, - __1, - __2, - __3, - __4, __temp0, + __0, ) } @@ -57820,29 +59289,21 @@ fn __action1224< fn __action1225< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), + __1: (TextSize, core::option::Option<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), +) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1152( + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action449( mode, __0, - __1, - __2, - __3, - __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action239( + mode, __temp0, + __1, ) } @@ -57851,24 +59312,20 @@ fn __action1225< fn __action1226< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1153( + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action455( mode, __0, __1, - __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action453( + mode, __temp0, ) } @@ -57878,30 +59335,22 @@ fn __action1226< fn __action1227< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> +) -> alloc::vec::Vec { - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action455( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1154( - mode, - __0, __1, __2, - __3, - __4, - __5, + ); + let __temp0 = (__start0, __temp0, __end0); + __action454( + mode, + __0, __temp0, ) } @@ -57911,26 +59360,20 @@ fn __action1227< fn __action1228< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> core::option::Option> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1155( + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action590( mode, __0, __1, - __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action588( + mode, __temp0, ) } @@ -57941,22 +59384,30 @@ fn __action1229< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( mode, - &__start0, - &__end0, + __1, + __2, ); let __temp0 = (__start0, __temp0, __end0); - __action737( + __action1141( mode, __0, - __1, __temp0, + __3, + __4, + __5, + __6, ) } @@ -57967,25 +59418,27 @@ fn __action1230< mode: Mode, __0: (TextSize, token::Tok, TextSize), __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __4: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action738( + __action1141( mode, __0, + __temp0, __1, __2, __3, - __temp0, + __4, ) } @@ -57995,26 +59448,32 @@ fn __action1231< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), ) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action739( - mode, - __0, __1, __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1142( + mode, + __0, __temp0, + __3, + __4, + __5, + __6, + __7, ) } @@ -58024,24 +59483,30 @@ fn __action1232< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action740( + __action1142( mode, __0, + __temp0, __1, __2, - __temp0, + __3, + __4, + __5, ) } @@ -58051,26 +59516,28 @@ fn __action1233< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (ast::Expr, ast::Expr), TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action741( - mode, - __0, __1, __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1143( + mode, + __0, __temp0, + __3, + __4, + __5, ) } @@ -58080,24 +59547,26 @@ fn __action1234< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __3: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action742( + __action1143( mode, __0, + __temp0, __1, __2, - __temp0, + __3, ) } @@ -58107,26 +59576,30 @@ fn __action1235< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action743( - mode, - __0, __1, __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1144( + mode, + __0, __temp0, + __3, + __4, + __5, + __6, ) } @@ -58136,20 +59609,28 @@ fn __action1236< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __end0 = __1.0; + let __temp0 = __action589( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action744( + __action1144( mode, __0, __temp0, + __1, + __2, + __3, + __4, ) } @@ -58159,20 +59640,30 @@ fn __action1237< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( mode, - &__start0, - &__end0, + __1, + __2, ); let __temp0 = (__start0, __temp0, __end0); - __action745( + __action1145( mode, __0, __temp0, + __3, + __4, + __5, + __6, ) } @@ -58182,20 +59673,28 @@ fn __action1238< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> { let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __end0 = __1.0; + let __temp0 = __action589( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action746( + __action1145( mode, __0, __temp0, + __1, + __2, + __3, + __4, ) } @@ -58205,20 +59704,32 @@ fn __action1239< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( mode, - &__start0, - &__end0, + __1, + __2, ); let __temp0 = (__start0, __temp0, __end0); - __action747( + __action1146( mode, __0, __temp0, + __3, + __4, + __5, + __6, + __7, ) } @@ -58227,23 +59738,31 @@ fn __action1239< fn __action1240< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Arguments, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action748( + __action1146( mode, __0, - __1, __temp0, + __1, + __2, + __3, + __4, + __5, ) } @@ -58252,27 +59771,29 @@ fn __action1240< fn __action1241< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action749( - mode, - __0, __1, __2, - __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1147( + mode, + __0, __temp0, + __3, + __4, + __5, ) } @@ -58281,14 +59802,1024 @@ fn __action1241< fn __action1242< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1147( + mode, + __0, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1243< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( + mode, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1148( + mode, + __0, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1244< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1148( + mode, + __0, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1245< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( + mode, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1149( + mode, + __0, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1246< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1149( + mode, + __0, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1247< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( + mode, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1150( + mode, + __0, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1248< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1150( + mode, + __0, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1249< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( + mode, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1151( + mode, + __0, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1250< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1151( + mode, + __0, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1251< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1228( + mode, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1152( + mode, + __0, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1252< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action589( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1152( + mode, + __0, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1253< +>( + mode: Mode, + __0: (TextSize, ast::Pattern, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), +) -> alloc::vec::Vec +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action338( + mode, + __0, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action336( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1254< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Pattern, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action338( + mode, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action337( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1255< +>( + mode: Mode, + __0: (TextSize, core::option::Option, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action410( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action335( + mode, + __temp0, + __0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1256< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, core::option::Option, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action411( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action335( + mode, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1257< +>( + mode: Mode, + __0: (TextSize, ast::Stmt, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + let __start0 = __0.0; + let __end0 = __1.2; + let __temp0 = __action391( + mode, + __0, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action399( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1258< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> alloc::vec::Vec +{ + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action391( + mode, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action400( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1259< +>( + mode: Mode, + __0: (TextSize, ast::Suite, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action697( + mode, + __0, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1260< +>( + mode: Mode, + __0: (TextSize, ast::Suite, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action390( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action697( + mode, + __0, + __temp0, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1261< +>( + mode: Mode, + __0: (TextSize, ast::Suite, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action698( + mode, + __0, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1262< +>( + mode: Mode, + __0: (TextSize, ast::Suite, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action390( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action698( + mode, + __0, + __temp0, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1263< +>( + mode: Mode, + __0: (TextSize, ast::Stmt, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action699( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1264< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action390( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action699( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1265< +>( + mode: Mode, + __0: (TextSize, ast::Stmt, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action700( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1266< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action390( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action700( + mode, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1267< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action701( + mode, + __0, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1268< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action390( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action701( + mode, + __0, + __temp0, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1269< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action702( + mode, + __0, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1270< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Stmt, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action390( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action702( + mode, + __0, + __temp0, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1271< +>( + mode: Mode, + __0: (TextSize, ast::Stmt, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action703( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1272< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action390( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action703( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1273< +>( + mode: Mode, + __0: (TextSize, ast::Stmt, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action389( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action704( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1274< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Stmt, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Suite +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action390( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action704( + mode, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1275< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + let __start0 = __1.0; + let __end0 = __3.2; + let __temp0 = __action307( + mode, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action858( + mode, + __0, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1276< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Identifier, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::ExceptHandler +{ + let __start0 = __2.0; + let __end0 = __4.2; + let __temp0 = __action307( + mode, + __2, + __3, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action860( + mode, + __0, + __1, + __temp0, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1277< +>( + mode: Mode, + __0: (TextSize, (String, StringKind, bool), TextSize), +) -> (TextSize, (String, StringKind, bool), TextSize) +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action749( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1278< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), ) -> ast::Expr { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -58305,16 +60836,17 @@ fn __action1242< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1243< +fn __action1279< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Arguments, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -58324,24 +60856,24 @@ fn __action1243< mode, __0, __1, + __2, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1244< +fn __action1280< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), ) -> ast::Expr { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -58352,24 +60884,23 @@ fn __action1244< __0, __1, __2, - __3, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1245< +fn __action1281< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), + __2: (TextSize, ast::Expr, TextSize), ) -> ast::Expr { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -58386,16 +60917,16 @@ fn __action1245< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1246< +fn __action1282< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), __1: (TextSize, ast::Expr, TextSize), ) -> ast::Expr { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -58411,16 +60942,16 @@ fn __action1246< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1247< +fn __action1283< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), __1: (TextSize, ast::Expr, TextSize), ) -> ast::Expr { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -58436,1005 +60967,27 @@ fn __action1247< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1248< +fn __action1284< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Pattern + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); __action756( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1249< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action758( mode, __0, __1, __2, - __3, - __4, - __5, - __6, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1250< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action759( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1251< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action760( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1252< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action761( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1253< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action762( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1254< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action763( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1255< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action764( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1256< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action765( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1257< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action766( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1258< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action767( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1259< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action768( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1260< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action769( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1261< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action770( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1262< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action771( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1263< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action772( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1264< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action773( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1265< ->( - mode: Mode, - __0: (TextSize, ast::Constant, TextSize), -) -> ast::Expr -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action774( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1266< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action775( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1267< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Decorator -{ - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action776( - mode, - __0, - __1, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1268< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), -) -> ast::Stmt -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action777( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1269< ->( - mode: Mode, - __0: (TextSize, String, TextSize), -) -> ast::Identifier -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action778( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1270< ->( - mode: Mode, - __0: (TextSize, String, TextSize), - __1: (TextSize, alloc::vec::Vec<(token::Tok, ast::Identifier)>, TextSize), -) -> ast::Identifier -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action779( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1271< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Parameter -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1080( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1272< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Parameter -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1081( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1273< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action785( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1274< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action786( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1275< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Stmt -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action787( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1276< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action788( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1277< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, core::option::Option, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action789( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1278< ->( - mode: Mode, - __0: (TextSize, ast::UnaryOp, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action790( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1279< ->( - mode: Mode, - __0: (TextSize, ast::UnaryOp, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action791( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1280< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action792( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1281< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action793( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1282< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), -) -> ast::Stmt -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action794( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1283< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action795( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1284< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, core::option::Option>, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action800( - mode, - __0, - __1, __temp0, ) } @@ -59444,20 +60997,20 @@ fn __action1284< fn __action1285< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), __2: (TextSize, ast::Expr, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +) -> ast::Expr { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action801( + __action757( mode, __0, __1, @@ -59471,22 +61024,24 @@ fn __action1285< fn __action1286< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action802( + __action758( mode, __0, __1, + __2, __temp0, ) } @@ -59496,22 +61051,24 @@ fn __action1286< fn __action1287< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action803( + __action759( mode, __0, __1, + __2, __temp0, ) } @@ -59521,22 +61078,24 @@ fn __action1287< fn __action1288< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Pattern, TextSize), __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __2: (TextSize, ast::Identifier, TextSize), +) -> Result> { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action804( + __action760( mode, __0, __1, + __2, __temp0, ) } @@ -59546,20 +61105,26 @@ fn __action1288< fn __action1289< >( mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action805( + __action1137( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -59569,19 +61134,19 @@ fn __action1289< fn __action1290< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action806( + __action1138( mode, __0, __1, @@ -59594,18 +61159,18 @@ fn __action1290< fn __action1291< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Constant, TextSize), ) -> ast::Expr { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action807( + __action763( mode, __0, __temp0, @@ -59617,22 +61182,20 @@ fn __action1291< fn __action1292< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), -) -> ast::Stmt + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action808( + __action764( mode, __0, - __1, __temp0, ) } @@ -59642,43 +61205,20 @@ fn __action1292< fn __action1293< >( mode: Mode, - __0: (TextSize, String, TextSize), -) -> ast::Identifier -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action809( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1294< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> ast::Alias + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1094( + __action765( mode, __0, __1, @@ -59689,23 +61229,58 @@ fn __action1294< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1295< +fn __action1294< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Alias + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1095( + __action766( mode, __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1295< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action767( + mode, + __0, + __1, + __2, + __3, __temp0, ) } @@ -59715,20 +61290,20 @@ fn __action1295< fn __action1296< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> ast::Alias + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1096( + __action768( mode, __0, __1, @@ -59742,20 +61317,30 @@ fn __action1296< fn __action1297< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Alias + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1097( + __action1229( mode, __0, + __1, + __2, + __3, + __4, + __5, __temp0, ) } @@ -59765,20 +61350,26 @@ fn __action1297< fn __action1298< >( mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> Vec + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action813( + __action1230( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -59789,25 +61380,31 @@ fn __action1299< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action814( + __action1231( mode, __0, __1, __2, __3, + __4, + __5, + __6, __temp0, ) } @@ -59818,23 +61415,27 @@ fn __action1300< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action815( + __action1232( mode, __0, __1, __2, + __3, + __4, __temp0, ) } @@ -59845,19 +61446,27 @@ fn __action1301< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> Vec + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action816( + __action1233( mode, __0, + __1, + __2, + __3, + __4, __temp0, ) } @@ -59868,21 +61477,23 @@ fn __action1302< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), -) -> ast::Stmt + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action817( + __action1234( mode, __0, __1, + __2, __temp0, ) } @@ -59893,25 +61504,29 @@ fn __action1303< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (Option, Option), TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Vec, TextSize), -) -> ast::Stmt + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action818( + __action1235( mode, __0, __1, __2, __3, + __4, + __5, __temp0, ) } @@ -59922,35 +61537,26 @@ fn __action1304< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __1.2; - let __end0 = __2.0; - let __start1 = __3.2; - let __end1 = __3.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action388( - mode, - &__start1, - &__end1, - ); - let __temp1 = (__start1, __temp1, __end1); - __action819( + __action1236( mode, __0, __1, - __temp0, __2, __3, - __temp1, + __temp0, ) } @@ -59959,20 +61565,22 @@ fn __action1304< fn __action1305< >( mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action820( + __action771( mode, __0, + __1, __temp0, ) } @@ -59982,20 +61590,26 @@ fn __action1305< fn __action1306< >( mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action821( + __action772( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -60006,19 +61620,25 @@ fn __action1307< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Pattern + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action822( + __action773( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -60029,19 +61649,23 @@ fn __action1308< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Pattern + __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action823( + __action774( mode, __0, + __1, + __2, __temp0, ) } @@ -60052,19 +61676,25 @@ fn __action1309< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), -) -> ast::Pattern + __1: (TextSize, (ast::Expr, ast::Expr), TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action824( + __action775( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -60074,20 +61704,24 @@ fn __action1309< fn __action1310< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::Pattern + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action825( + __action776( mode, __0, + __1, + __2, __temp0, ) } @@ -60097,20 +61731,26 @@ fn __action1310< fn __action1311< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::Pattern + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action826( + __action777( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -60120,18 +61760,18 @@ fn __action1311< fn __action1312< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action827( + __action778( mode, __0, __temp0, @@ -60148,13 +61788,13 @@ fn __action1313< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action828( + __action779( mode, __0, __temp0, @@ -60171,13 +61811,13 @@ fn __action1314< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action829( + __action780( mode, __0, __temp0, @@ -60194,13 +61834,13 @@ fn __action1315< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action830( + __action781( mode, __0, __temp0, @@ -60212,22 +61852,20 @@ fn __action1315< fn __action1316< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Pattern + __0: (TextSize, ast::Constant, TextSize), +) -> ast::Expr { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action832( + __action783( mode, __0, - __1, __temp0, ) } @@ -60237,26 +61875,20 @@ fn __action1316< fn __action1317< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action833( + __action784( mode, __0, - __1, - __2, - __3, __temp0, ) } @@ -60267,19 +61899,19 @@ fn __action1318< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __1: (TextSize, core::option::Option>, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Pattern +) -> ast::Expr { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action834( + __action785( mode, __0, __1, @@ -60294,27 +61926,25 @@ fn __action1319< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Pattern +) -> ast::Expr { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action835( + __action786( mode, __0, __1, __2, __3, - __4, __temp0, ) } @@ -60325,20 +61955,20 @@ fn __action1320< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern +) -> ast::Expr { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action836( + __action787( mode, __0, __1, @@ -60354,31 +61984,23 @@ fn __action1321< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Identifier, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> ast::Pattern +) -> ast::Expr { - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action837( + __action788( mode, __0, __1, __2, - __3, - __4, - __5, - __6, __temp0, ) } @@ -60389,22 +62011,22 @@ fn __action1322< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), __5: (TextSize, token::Tok, TextSize), -) -> ast::Pattern +) -> Result> { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action838( + __action1237( mode, __0, __1, @@ -60421,20 +62043,26 @@ fn __action1322< fn __action1323< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action840( + __action1238( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -60442,6 +62070,1170 @@ fn __action1323< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1324< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1239( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1325< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1240( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1326< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1241( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1327< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1242( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1328< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1243( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1329< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1244( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1330< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action791( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1331< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action792( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1332< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action793( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1333< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action794( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1334< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (ast::Expr, ast::Expr), TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action795( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1335< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action796( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1336< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action797( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1337< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action798( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1338< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action799( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1339< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action800( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1340< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action801( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1341< +>( + mode: Mode, + __0: (TextSize, ast::Constant, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action803( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1342< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action804( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1343< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action805( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1344< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action806( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1345< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1245( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1346< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1246( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1347< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1247( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1348< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1248( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1349< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1249( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1350< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1250( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1351< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1251( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1352< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1252( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1353< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action809( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1354< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action810( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1355< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action811( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1356< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option>, ast::Expr)>>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action812( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1357< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (ast::Expr, ast::Expr), TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action813( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1358< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action814( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1359< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action815( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1360< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action816( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1361< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action817( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1362< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action818( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1363< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action819( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1364< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Arguments, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action820( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1365< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action821( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1366< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -60451,7 +63243,513 @@ fn __action1324< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action822( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1367< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Arguments, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action823( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1368< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action824( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1369< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action825( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1370< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Arguments, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action826( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1371< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action827( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1372< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action828( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1373< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action829( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1374< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action830( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1375< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action831( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1376< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action832( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1377< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action834( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1378< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action835( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1379< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action836( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1380< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action837( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1381< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action838( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1382< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action839( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1383< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action840( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1384< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -60462,23 +63760,30 @@ fn __action1324< __0, __1, __2, + __3, + __4, + __5, + __6, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1325< +fn __action1385< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> ast::Expr + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -60489,23 +63794,146 @@ fn __action1325< __0, __1, __2, + __3, + __4, + __5, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1326< +fn __action1386< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action388( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action843( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1387< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action844( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1388< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action845( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1389< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Vec<(ast::Identifier, ast::Pattern)>, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action846( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1390< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -60514,24 +63942,24 @@ fn __action1326< __action847( mode, __0, - __temp0, __1, __2, + __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1327< +fn __action1391< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), -) -> ast::Stmt + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), +) -> ast::Expr { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -60547,16 +63975,16 @@ fn __action1327< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1328< +fn __action1392< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), ) -> ast::Expr { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -60572,7 +64000,30 @@ fn __action1328< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1329< +fn __action1393< +>( + mode: Mode, + __0: (TextSize, ast::Constant, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action850( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1394< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -60581,13 +64032,13 @@ fn __action1329< { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action850( + __action851( mode, __0, __1, @@ -60597,39 +64048,17 @@ fn __action1329< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1330< +fn __action1395< >( mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action851( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1331< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr + __2: (TextSize, token::Tok, TextSize), +) -> ast::Decorator { let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __end0 = __2.0; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -60640,21 +64069,22 @@ fn __action1331< __0, __1, __temp0, + __2, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1332< +fn __action1396< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), +) -> ast::Stmt { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -60670,23 +64100,71 @@ fn __action1332< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1333< +fn __action1397< >( mode: Mode, - __0: (TextSize, ast::ParameterWithDefault, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::ParameterWithDefault + __0: (TextSize, String, TextSize), +) -> ast::Identifier { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action470( + __action854( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1398< +>( + mode: Mode, + __0: (TextSize, String, TextSize), + __1: (TextSize, alloc::vec::Vec<(token::Tok, ast::Identifier)>, TextSize), +) -> ast::Identifier +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action855( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1399< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Parameter +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1167( mode, __0, __1, @@ -60697,23 +64175,46 @@ fn __action1333< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1334< +fn __action1400< >( mode: Mode, - __0: (TextSize, ast::ParameterWithDefault, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::ParameterWithDefault + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Parameter { - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action459( + __action1168( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1401< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action861( mode, __0, __1, @@ -60724,27 +64225,1290 @@ fn __action1334< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1335< +fn __action1402< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action862( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1403< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action863( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1404< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Stmt +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action864( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1405< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action865( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1406< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, core::option::Option, TextSize), +) -> ast::Stmt +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action866( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1407< +>( + mode: Mode, + __0: (TextSize, ast::UnaryOp, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action867( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1408< +>( + mode: Mode, + __0: (TextSize, ast::UnaryOp, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action868( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1409< +>( + mode: Mode, + __0: (TextSize, ast::UnaryOp, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action869( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1410< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action870( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1411< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action871( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1412< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), +) -> ast::Stmt +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action872( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1413< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action873( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1414< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, core::option::Option>, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action878( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1415< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action879( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1416< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action880( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1417< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action881( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1418< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action882( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1419< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action883( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1420< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action884( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1421< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action885( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1422< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), +) -> ast::Stmt +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action886( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1423< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action887( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1424< +>( + mode: Mode, + __0: (TextSize, String, TextSize), +) -> ast::Identifier +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action888( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1425< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> ast::Alias +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1183( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1426< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Alias +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1184( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1427< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> ast::Alias +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1185( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1428< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Alias +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1186( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1429< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), +) -> Vec +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action892( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1430< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action893( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1431< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action894( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1432< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> Vec +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action895( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1433< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), +) -> ast::Stmt +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action896( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1434< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (Option, Option), TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Vec, TextSize), +) -> ast::Stmt +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action897( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1435< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), +) -> Result> +{ + let __start0 = __1.2; + let __end0 = __2.0; + let __start1 = __3.2; + let __end1 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + let __temp1 = __action395( + mode, + &__start1, + &__end1, + ); + let __temp1 = (__start1, __temp1, __end1); + __action898( + mode, + __0, + __1, + __temp0, + __2, + __3, + __temp1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1436< +>( + mode: Mode, + __0: (TextSize, (MagicKind, String), TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action899( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1437< +>( + mode: Mode, + __0: (TextSize, (MagicKind, String), TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action900( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1438< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action901( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1439< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action902( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1440< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action903( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1441< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action904( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1442< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action905( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1443< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action906( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1444< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action907( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1445< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action908( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1446< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action909( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1447< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action911( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1448< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action912( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1449< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action913( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1450< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, token::Tok, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), +) -> ast::Pattern +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action914( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1451< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action915( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1452< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Identifier, TextSize), + __5: (TextSize, token::Tok, TextSize), __6: (TextSize, token::Tok, TextSize), -) -> Result> +) -> ast::Pattern { let __start0 = __6.2; let __end0 = __6.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action975( + __action916( mode, __0, __1, @@ -60759,26 +65523,26 @@ fn __action1335< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1336< +fn __action1453< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(ast::Expr, ast::Pattern)>, TextSize), __2: (TextSize, token::Tok, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), + __4: (TextSize, ast::Identifier, TextSize), __5: (TextSize, token::Tok, TextSize), -) -> Result> +) -> ast::Pattern { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action976( + __action917( mode, __0, __1, @@ -60792,7 +65556,381 @@ fn __action1336< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1337< +fn __action1454< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action919( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1455< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action920( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1456< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action921( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1457< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action926( + mode, + __0, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1458< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), +) -> ast::Stmt +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action927( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1459< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action928( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1460< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action929( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1461< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), +) -> ast::Pattern +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action930( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1462< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action931( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1463< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action932( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1464< +>( + mode: Mode, + __0: (TextSize, ast::ParameterWithDefault, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::ParameterWithDefault +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action477( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1465< +>( + mode: Mode, + __0: (TextSize, ast::ParameterWithDefault, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::ParameterWithDefault +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action466( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1466< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1058( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1467< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1059( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1468< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -60807,13 +65945,13 @@ fn __action1337< { let __start0 = __7.2; let __end0 = __7.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action977( + __action1060( mode, __0, __1, @@ -60829,7 +65967,7 @@ fn __action1337< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1338< +fn __action1469< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -60843,13 +65981,13 @@ fn __action1338< { let __start0 = __6.2; let __end0 = __6.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action978( + __action1061( mode, __0, __1, @@ -60864,7 +66002,7 @@ fn __action1338< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1339< +fn __action1470< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -60876,13 +66014,13 @@ fn __action1339< { let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action979( + __action1062( mode, __0, __1, @@ -60895,7 +66033,7 @@ fn __action1339< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1340< +fn __action1471< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -60906,13 +66044,13 @@ fn __action1340< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action980( + __action1063( mode, __0, __1, @@ -60924,7 +66062,7 @@ fn __action1340< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1341< +fn __action1472< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -60937,13 +66075,13 @@ fn __action1341< { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action981( + __action1064( mode, __0, __1, @@ -60957,7 +66095,7 @@ fn __action1341< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1342< +fn __action1473< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -60969,13 +66107,13 @@ fn __action1342< { let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action982( + __action1065( mode, __0, __1, @@ -60988,7 +66126,7 @@ fn __action1342< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1343< +fn __action1474< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -60997,13 +66135,13 @@ fn __action1343< { let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action983( + __action1066( mode, __0, __1, @@ -61013,7 +66151,7 @@ fn __action1343< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1344< +fn __action1475< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61026,13 +66164,13 @@ fn __action1344< { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action984( + __action1067( mode, __0, __1, @@ -61046,7 +66184,7 @@ fn __action1344< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1345< +fn __action1476< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61058,13 +66196,13 @@ fn __action1345< { let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action985( + __action1068( mode, __0, __1, @@ -61077,7 +66215,7 @@ fn __action1345< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1346< +fn __action1477< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61091,13 +66229,13 @@ fn __action1346< { let __start0 = __6.2; let __end0 = __6.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action986( + __action1069( mode, __0, __1, @@ -61112,7 +66250,7 @@ fn __action1346< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1347< +fn __action1478< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61125,13 +66263,13 @@ fn __action1347< { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action987( + __action1070( mode, __0, __1, @@ -61145,7 +66283,7 @@ fn __action1347< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1348< +fn __action1479< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61156,13 +66294,13 @@ fn __action1348< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action988( + __action1071( mode, __0, __1, @@ -61174,7 +66312,7 @@ fn __action1348< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1349< +fn __action1480< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61184,13 +66322,13 @@ fn __action1349< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action989( + __action1072( mode, __0, __1, @@ -61201,7 +66339,7 @@ fn __action1349< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1350< +fn __action1481< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61213,13 +66351,13 @@ fn __action1350< { let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action990( + __action1073( mode, __0, __1, @@ -61232,7 +66370,7 @@ fn __action1350< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1351< +fn __action1482< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61243,13 +66381,13 @@ fn __action1351< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action991( + __action1074( mode, __0, __1, @@ -61261,7 +66399,7 @@ fn __action1351< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1352< +fn __action1483< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61269,13 +66407,13 @@ fn __action1352< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action992( + __action1075( mode, __0, __temp0, @@ -61284,7 +66422,7 @@ fn __action1352< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1353< +fn __action1484< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61295,13 +66433,13 @@ fn __action1353< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action856( + __action935( mode, __0, __1, @@ -61313,7 +66451,7 @@ fn __action1353< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1354< +fn __action1485< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -61323,13 +66461,13 @@ fn __action1354< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action857( + __action936( mode, __0, __1, @@ -61340,7 +66478,7 @@ fn __action1354< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1355< +fn __action1486< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -61352,13 +66490,13 @@ fn __action1355< { let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action951( + __action1034( mode, __0, __1, @@ -61371,7 +66509,7 @@ fn __action1355< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1356< +fn __action1487< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -61382,475 +66520,7 @@ fn __action1356< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action952( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1357< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action953( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1358< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action954( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1359< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action955( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1360< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action956( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1361< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action957( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1362< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action958( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1363< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action959( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1364< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action960( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1365< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action961( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1366< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action962( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1367< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), -) -> Result> -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action963( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1368< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action964( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1369< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action965( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1370< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action966( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1371< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Parameters -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action860( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1372< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action861( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1373< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -61862,21 +66532,18 @@ fn __action1373< __1, __2, __3, - __4, - __5, - __6, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1374< +fn __action1488< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, Option>, TextSize), __5: (TextSize, token::Tok, TextSize), @@ -61884,7 +66551,7 @@ fn __action1374< { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -61904,22 +66571,19 @@ fn __action1374< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1375< +fn __action1489< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), - __7: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __7.2; - let __end0 = __7.2; - let __temp0 = __action388( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -61932,30 +66596,23 @@ fn __action1375< __2, __3, __4, - __5, - __6, - __7, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1376< +fn __action1490< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -61966,29 +66623,22 @@ fn __action1376< __0, __1, __2, - __3, - __4, - __5, - __6, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1377< +fn __action1491< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -61998,27 +66648,24 @@ fn __action1377< mode, __0, __1, - __2, - __3, - __4, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1378< +fn __action1492< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), __3: (TextSize, token::Tok, TextSize), ) -> Result> { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, @@ -62036,20 +66683,17 @@ fn __action1378< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1379< +fn __action1493< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -62060,28 +66704,24 @@ fn __action1379< __0, __1, __2, - __3, - __4, - __5, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1380< +fn __action1494< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), ) -> Result> { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -62093,23 +66733,23 @@ fn __action1380< __1, __2, __3, - __4, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1381< +fn __action1495< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), ) -> Result> { - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -62119,26 +66759,26 @@ fn __action1381< mode, __0, __1, + __2, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1382< +fn __action1496< >( mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), ) -> Result> { - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, &__start0, &__end0, @@ -62151,14 +66791,225 @@ fn __action1382< __2, __3, __4, - __5, __temp0, ) } #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1383< +fn __action1497< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1045( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1498< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), +) -> Result> +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1046( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1499< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1047( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1500< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1048( + mode, + __0, + __1, + __2, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1501< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1049( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1502< +>( + mode: Mode, + __0: (TextSize, Option>, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Parameters +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action939( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1503< +>( + mode: Mode, + __0: (TextSize, Option>, TextSize), +) -> ast::Parameters +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action940( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1504< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1118( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1505< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -62166,17 +67017,122 @@ fn __action1383< __2: (TextSize, token::Tok, TextSize), __3: (TextSize, token::Tok, TextSize), __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1045( + __action1119( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1506< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __7.2; + let __end0 = __7.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1120( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1507< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1121( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1508< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1122( mode, __0, __1, @@ -62189,7 +67145,189 @@ fn __action1383< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1384< +fn __action1509< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1123( + mode, + __0, + __1, + __2, + __3, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1510< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1124( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1511< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1125( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1512< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1126( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1513< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1127( + mode, + __0, + __1, + __2, + __3, + __4, + __5, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1514< +>( + mode: Mode, + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1128( + mode, + __0, + __1, + __2, + __3, + __4, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1515< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -62203,13 +67341,13 @@ fn __action1384< { let __start0 = __6.2; let __end0 = __6.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1046( + __action1129( mode, __0, __1, @@ -62224,7 +67362,7 @@ fn __action1384< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1385< +fn __action1516< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -62237,13 +67375,13 @@ fn __action1385< { let __start0 = __5.2; let __end0 = __5.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1047( + __action1130( mode, __0, __1, @@ -62257,7 +67395,7 @@ fn __action1385< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1386< +fn __action1517< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -62268,13 +67406,13 @@ fn __action1386< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1048( + __action1131( mode, __0, __1, @@ -62286,7 +67424,7 @@ fn __action1386< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1387< +fn __action1518< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -62296,13 +67434,13 @@ fn __action1387< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1049( + __action1132( mode, __0, __1, @@ -62313,7 +67451,7 @@ fn __action1387< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1388< +fn __action1519< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -62325,13 +67463,13 @@ fn __action1388< { let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1050( + __action1133( mode, __0, __1, @@ -62344,7 +67482,7 @@ fn __action1388< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1389< +fn __action1520< >( mode: Mode, __0: (TextSize, (Vec, Vec), TextSize), @@ -62355,13 +67493,13 @@ fn __action1389< { let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action388( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1051( + __action1134( mode, __0, __1, @@ -62371,3531 +67509,26 @@ fn __action1389< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1390< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1052( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1391< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action864( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1392< ->( - mode: Mode, - __0: (TextSize, (Vec, Vec), TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action865( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1393< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1011( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1394< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1012( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1395< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1013( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1396< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1014( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1397< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1015( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1398< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1016( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1399< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1017( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1400< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1018( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1401< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1019( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1402< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1020( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1403< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1021( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1404< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, Option>, TextSize), -) -> Result> -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1022( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1405< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), -) -> Result> -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1023( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1406< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1024( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1407< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1025( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1408< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1026( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1409< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Parameters -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action868( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1410< ->( - mode: Mode, - __0: (TextSize, Option>, TextSize), -) -> ast::Parameters -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action869( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1411< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action882( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1412< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action883( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1413< ->( - mode: Mode, - __0: (TextSize, ast::Pattern, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action884( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1414< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action885( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1415< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action886( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1416< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action887( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1417< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action888( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1418< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action889( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1419< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1120( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1420< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1121( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1421< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action891( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1422< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action892( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1423< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action893( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1424< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Pattern, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action894( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1425< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Pattern, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action895( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1426< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action896( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1427< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action897( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1428< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action898( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1429< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Comprehension -{ - let __start0 = __5.2; - let __end0 = __5.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action899( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1430< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Comprehension -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action900( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1431< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action902( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1432< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), -) -> ast::Pattern -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action903( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1433< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Parameter -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1087( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1434< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Parameter -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1088( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1435< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Parameter -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action905( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1436< ->( - mode: Mode, - __0: (TextSize, core::option::Option, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, core::option::Option>, TextSize), -) -> ast::Expr -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action906( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1437< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action907( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1438< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action908( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1439< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action909( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1440< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> ast::Expr -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action910( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1441< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action911( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1442< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, ast::Operator, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action912( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1443< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action913( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1444< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action914( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1445< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Suite, TextSize), -) -> ast::Mod -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action915( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1446< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> ast::Mod -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1091( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1447< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Mod -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1092( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1448< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __9.2; - let __end0 = __9.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1111( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, - __8, - __9, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1449< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1112( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1450< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1113( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1451< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1114( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1452< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __9.2; - let __end0 = __9.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1115( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, - __8, - __9, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1453< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1116( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1454< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __6.2; - let __end0 = __6.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1117( - mode, - __0, - __1, - __2, - __3, - __4, - __5, - __6, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1455< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Suite, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1118( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1456< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::Expr -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action920( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1457< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.2; - let __end0 = __4.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action921( - mode, - __0, - __1, - __2, - __3, - __4, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1458< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::TypeParam -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1082( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1459< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::TypeParam -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1083( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1460< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), -) -> ast::TypeParam -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action923( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1461< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), -) -> ast::TypeParam -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action924( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1462< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::TypeParams -{ - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action925( - mode, - __0, - __1, - __2, - __3, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1463< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::TypeParams -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action926( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1464< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::ParameterWithDefault -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1084( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1465< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::ParameterWithDefault -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1085( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1466< ->( - mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> ast::ParameterWithDefault -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action928( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1467< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action929( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1468< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::WithItem -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action931( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1469< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::WithItem -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action932( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1470< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::WithItem -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action933( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1471< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::WithItem -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action934( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1472< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::WithItem -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action935( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1473< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action936( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1474< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action939( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1475< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action940( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1476< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, core::option::Option, TextSize), -) -> ast::Expr -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action941( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1477< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Expr -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action388( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action942( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1478< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action1473( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action302( - mode, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1479< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1473( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action643( - mode, - __0, - __temp0, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1480< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1473( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action644( - mode, - __0, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1481< ->( - mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> core::option::Option> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action1478( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action300( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1482< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::WithItem, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1481( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1068( - mode, - __0, - __temp0, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1483< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::WithItem, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action301( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1068( - mode, - __0, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1484< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::WithItem, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1481( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1069( - mode, - __0, - __temp0, - __3, - __4, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1485< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::WithItem, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action301( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1069( - mode, - __0, - __temp0, - __1, - __2, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1486< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::WithItem, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1481( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1070( - mode, - __0, - __temp0, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1487< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::WithItem, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action301( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1070( - mode, - __0, - __temp0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1488< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::WithItem, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1481( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1071( - mode, - __0, - __temp0, - __3, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1489< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::WithItem, TextSize), - __2: (TextSize, alloc::vec::Vec, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action301( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1071( - mode, - __0, - __temp0, - __1, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1490< ->( - mode: Mode, - __0: (TextSize, (String, StringKind, bool), TextSize), -) -> alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)> -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action1180( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action330( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1491< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), - __1: (TextSize, (String, StringKind, bool), TextSize), -) -> alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1180( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action331( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1492< ->( - mode: Mode, - __0: (TextSize, ast::CmpOp, TextSize), - __1: (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> -{ - let __start0 = __0.0; - let __end0 = __1.2; - let __temp0 = __action489( - mode, - __0, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action487( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1493< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), - __1: (TextSize, ast::CmpOp, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action489( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action488( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1494< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> core::option::Option -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action343( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action341( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1495< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Suite, TextSize), -) -> ast::MatchCase -{ - let __start0 = __2.0; - let __end0 = __2.2; - let __temp0 = __action1494( - mode, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action839( - mode, - __0, - __1, - __temp0, - __3, - __4, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1496< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Suite, TextSize), -) -> ast::MatchCase -{ - let __start0 = __1.2; - let __end0 = __2.0; - let __temp0 = __action342( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action839( - mode, - __0, - __1, - __temp0, - __2, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1497< ->( - mode: Mode, - __0: (TextSize, ast::Parameters, TextSize), -) -> core::option::Option -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action276( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action274( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1498< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameters, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1497( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1411( - mode, - __0, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1499< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action275( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1411( - mode, - __0, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1500< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, ast::Arguments, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __4.0; - let __end0 = __4.2; - let __temp0 = __action266( - mode, - __4, - ); - let __temp0 = (__start0, __temp0, __end0); - __action757( - mode, - __0, - __1, - __2, - __3, - __temp0, - __5, - __6, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1501< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.2; - let __end0 = __4.0; - let __temp0 = __action267( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action757( - mode, - __0, - __1, - __2, - __3, - __temp0, - __4, - __5, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1502< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action378( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1275( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1503< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Stmt -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action379( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1275( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1504< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __3.0; - let __end0 = __3.2; - let __temp0 = __action373( - mode, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1277( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1505< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), -) -> ast::Stmt -{ - let __start0 = __2.2; - let __end0 = __2.2; - let __temp0 = __action374( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1277( - mode, - __0, - __1, - __2, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1506< ->( - mode: Mode, - __0: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), -) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action437( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1135( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1507< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = *__lookbehind; - let __end0 = *__lookahead; - let __temp0 = __action438( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1135( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1508< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - __1: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), -) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action437( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1136( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1509< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), -) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action438( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1136( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1510< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1506( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1186( - mode, - __0, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1511< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action1507( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1186( - mode, - __0, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1512< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - __2: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1508( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1186( - mode, - __0, - __temp0, - __3, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1513< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1509( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1186( - mode, - __0, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1514< ->( - mode: Mode, - __0: (TextSize, ast::Pattern, TextSize), -) -> Vec -{ - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action399( - mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1158( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1515< ->( - mode: Mode, - __lookbehind: &TextSize, - __lookahead: &TextSize, -) -> Vec -{ - let __start0 = *__lookbehind; - let __end0 = *__lookahead; - let __temp0 = __action400( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1158( - mode, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1516< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Pattern, TextSize), -) -> Vec -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action399( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1159( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1517< ->( - mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), -) -> Vec -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action400( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1159( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1518< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Pattern, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1514( - mode, - __1, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1426( - mode, - __0, - __temp0, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1519< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action1515( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1426( - mode, - __0, - __temp0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1520< ->( - mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, ast::Pattern, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> ast::Pattern -{ - let __start0 = __1.0; - let __end0 = __2.2; - let __temp0 = __action1516( - mode, - __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1426( - mode, - __0, - __temp0, - __3, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1521< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Pattern + __0: (TextSize, (Vec, Vec), TextSize), +) -> Result> { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action1517( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __1, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1426( + __action1135( mode, __0, __temp0, - __2, ) } @@ -65904,20 +67537,26 @@ fn __action1521< fn __action1522< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, Vec, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action235( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, - __1, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1284( + __action943( mode, __0, + __1, + __2, + __3, __temp0, ) } @@ -65927,20 +67566,24 @@ fn __action1522< fn __action1523< >( mode: Mode, - __0: (TextSize, ast::Expr, TextSize), -) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) + __0: (TextSize, (Vec, Vec), TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), +) -> Result> { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action236( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1284( + __action944( mode, __0, + __1, + __2, __temp0, ) } @@ -65951,21 +67594,21 @@ fn __action1524< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), -) -> ast::Comprehension + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> { let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action238( + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1429( + __action1094( mode, __0, __1, @@ -65983,26 +67626,24 @@ fn __action1525< mode: Mode, __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Expr, TextSize), + __2: (TextSize, Option>, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Expr, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Comprehension +) -> Result> { - let __start0 = __5.0; - let __end0 = __5.2; - let __temp0 = __action239( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, - __5, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1429( + __action1095( mode, __0, __1, __2, __3, - __4, __temp0, ) } @@ -66013,25 +67654,29 @@ fn __action1526< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), -) -> ast::Comprehension + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __3.2; - let __end0 = __3.2; - let __temp0 = __action238( + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1430( + __action1096( mode, __0, __1, __2, __3, + __4, + __5, __temp0, ) } @@ -66042,25 +67687,27 @@ fn __action1527< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Expr, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), -) -> ast::Comprehension + __3: (TextSize, Option>, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __4.0; + let __start0 = __4.2; let __end0 = __4.2; - let __temp0 = __action239( + let __temp0 = __action395( mode, - __4, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1430( + __action1097( mode, __0, __1, __2, __3, + __4, __temp0, ) } @@ -66071,30 +67718,24 @@ fn __action1528< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, ast::Arguments, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action286( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1500( + __action1098( mode, - __temp0, __0, __1, __2, - __3, - __4, - __5, + __temp0, ) } @@ -66103,31 +67744,23 @@ fn __action1528< fn __action1529< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, ast::Arguments, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action287( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1500( + __action1099( mode, - __temp0, + __0, __1, - __2, - __3, - __4, - __5, - __6, + __temp0, ) } @@ -66137,28 +67770,26 @@ fn __action1530< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), - __2: (TextSize, core::option::Option, TextSize), + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action286( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1501( + __action1100( mode, - __temp0, __0, __1, __2, __3, - __4, + __temp0, ) } @@ -66167,29 +67798,25 @@ fn __action1530< fn __action1531< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action287( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1501( + __action1101( mode, - __temp0, + __0, __1, __2, - __3, - __4, - __5, + __temp0, ) } @@ -66199,36 +67826,26 @@ fn __action1532< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, ast::Parameters, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Expr, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, Option>, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action286( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1073( + __action1102( mode, - __temp0, __0, __1, __2, __3, - __4, - __5, - __6, - __7, - __8, + __temp0, ) } @@ -66237,37 +67854,25 @@ fn __action1532< fn __action1533< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Identifier, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, ast::Parameters, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, ast::Expr, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __2: (TextSize, Option>, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action287( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1073( + __action1103( mode, - __temp0, + __0, __1, __2, - __3, - __4, - __5, - __6, - __7, - __8, - __9, + __temp0, ) } @@ -66277,32 +67882,28 @@ fn __action1534< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, ast::Parameters, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action286( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1074( + __action1104( mode, - __temp0, __0, __1, __2, __3, __4, - __5, - __6, + __temp0, ) } @@ -66311,33 +67912,27 @@ fn __action1534< fn __action1535< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Identifier, TextSize), - __4: (TextSize, core::option::Option, TextSize), - __5: (TextSize, ast::Parameters, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __3: (TextSize, Option>, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action287( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1074( + __action1105( mode, - __temp0, + __0, __1, __2, __3, - __4, - __5, - __6, - __7, + __temp0, ) } @@ -66347,34 +67942,22 @@ fn __action1536< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, ast::Parameters, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Expr, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __1: (TextSize, ast::Parameter, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action286( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1075( + __action1106( mode, - __temp0, __0, __1, - __2, - __3, - __4, - __5, - __6, - __7, + __temp0, ) } @@ -66383,35 +67966,21 @@ fn __action1536< fn __action1537< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, ast::Parameters, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Expr, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __0: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.0; + let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action287( + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1075( + __action1107( mode, + __0, __temp0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, - __8, ) } @@ -66421,30 +67990,24 @@ fn __action1538< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Identifier, TextSize), - __2: (TextSize, core::option::Option, TextSize), - __3: (TextSize, ast::Parameters, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __1: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action286( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1076( + __action1108( mode, - __temp0, __0, __1, __2, - __3, - __4, - __5, + __temp0, ) } @@ -66453,31 +68016,23 @@ fn __action1538< fn __action1539< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, core::option::Option, TextSize), - __4: (TextSize, ast::Parameters, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Suite, TextSize), -) -> ast::Stmt + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action287( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1076( + __action1109( mode, - __temp0, + __0, __1, - __2, - __3, - __4, - __5, - __6, + __temp0, ) } @@ -66486,23 +68041,23 @@ fn __action1539< fn __action1540< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __0: (TextSize, Option>, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Parameters { - let __start0 = __1.0; + let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action539( + let __temp0 = __action395( mode, - __1, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1209( + __action947( mode, __0, + __1, __temp0, - __2, ) } @@ -66511,23 +68066,21 @@ fn __action1540< fn __action1541< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __0: (TextSize, Option>, TextSize), +) -> ast::Parameters { let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action540( + let __end0 = __0.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1209( + __action948( mode, __0, __temp0, - __1, ) } @@ -66537,22 +68090,24 @@ fn __action1542< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), + __1: (TextSize, core::option::Option, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr +) -> Result> { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action539( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __1, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1232( + __action961( mode, __0, - __temp0, + __1, __2, + __temp0, ) } @@ -66562,22 +68117,20 @@ fn __action1543< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr +) -> ast::Stmt { let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action540( + let __end0 = __0.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1232( + __action962( mode, __0, __temp0, - __1, ) } @@ -66586,20 +68139,22 @@ fn __action1543< fn __action1544< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, ast::Parameter, TextSize), -) -> Option> + __0: (TextSize, ast::Pattern, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __1.0; + let __start0 = __1.2; let __end0 = __1.2; - let __temp0 = __action473( + let __temp0 = __action395( mode, - __1, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action411( + __action963( mode, __0, + __1, __temp0, ) } @@ -66609,20 +68164,22 @@ fn __action1544< fn __action1545< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), -) -> Option> + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action474( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action411( + __action964( mode, __0, + __1, __temp0, ) } @@ -66632,22 +68189,20 @@ fn __action1545< fn __action1546< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> Vec + __0: (TextSize, Vec, TextSize), +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action1294( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action365( + __action965( mode, + __0, __temp0, ) } @@ -66657,18 +68212,24 @@ fn __action1546< fn __action1547< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> Vec + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action1295( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action365( + __action966( mode, + __0, + __1, + __2, __temp0, ) } @@ -66678,26 +68239,24 @@ fn __action1547< fn __action1548< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Identifier, TextSize), -) -> Vec + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __2.0; - let __end0 = __4.2; - let __temp0 = __action1294( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __2, - __3, - __4, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action366( + __action967( mode, __0, __1, + __2, __temp0, ) } @@ -66707,22 +68266,24 @@ fn __action1548< fn __action1549< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> Vec + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __2.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action1295( + let __temp0 = __action395( mode, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action366( + __action968( mode, __0, __1, + __2, __temp0, ) } @@ -66732,22 +68293,20 @@ fn __action1549< fn __action1550< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> Vec + __0: (TextSize, token::Tok, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action1296( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action358( + __action969( mode, + __0, __temp0, ) } @@ -66757,18 +68316,26 @@ fn __action1550< fn __action1551< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> Vec + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action1297( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action358( + __action1209( mode, + __0, + __1, + __2, + __3, __temp0, ) } @@ -66778,23 +68345,19 @@ fn __action1551< fn __action1552< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, ast::Identifier, TextSize), -) -> Vec + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { - let __start0 = __2.0; - let __end0 = __4.2; - let __temp0 = __action1296( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, - __2, - __3, - __4, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action359( + __action1210( mode, __0, __1, @@ -66807,22 +68370,24 @@ fn __action1552< fn __action1553< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, ast::Identifier, TextSize), -) -> Vec + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Pattern, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __2.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action1297( + let __temp0 = __action395( mode, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action359( + __action971( mode, __0, __1, + __2, __temp0, ) } @@ -66832,21 +68397,23 @@ fn __action1553< fn __action1554< >( mode: Mode, - __0: (TextSize, ast::Identifier, TextSize), -) -> (Option, Option) + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action363( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action61( + __action972( mode, - __temp0, __0, + __1, + __temp0, ) } @@ -66855,21 +68422,27 @@ fn __action1554< fn __action1555< >( mode: Mode, - __0: (TextSize, alloc::vec::Vec, TextSize), - __1: (TextSize, ast::Identifier, TextSize), -) -> (Option, Option) + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Pattern, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action364( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action61( + __action973( mode, - __temp0, + __0, __1, + __2, + __3, + __temp0, ) } @@ -66879,22 +68452,28 @@ fn __action1556< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Pattern, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action547( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, - __1, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1194( + __action974( mode, __0, - __temp0, + __1, __2, + __3, + __4, + __temp0, ) } @@ -66904,22 +68483,26 @@ fn __action1557< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> ast::Expr + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Pattern, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action548( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1194( + __action975( mode, __0, - __temp0, __1, + __2, + __3, + __temp0, ) } @@ -66929,22 +68512,24 @@ fn __action1558< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, Vec, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> ast::Expr +) -> ast::Pattern { - let __start0 = __1.0; - let __end0 = __1.2; - let __temp0 = __action547( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __1, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1219( + __action976( mode, __0, - __temp0, + __1, __2, + __temp0, ) } @@ -66953,23 +68538,25 @@ fn __action1558< fn __action1559< >( mode: Mode, - __0: (TextSize, token::Tok, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), ) -> ast::Expr { - let __start0 = __0.2; - let __end0 = __1.0; - let __temp0 = __action548( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1219( + __action977( mode, __0, - __temp0, __1, + __2, + __temp0, ) } @@ -66978,31 +68565,25 @@ fn __action1559< fn __action1560< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1335( + __action978( mode, - __temp0, + __0, __1, __2, - __3, - __4, - __5, - __6, + __temp0, ) } @@ -67011,35 +68592,25 @@ fn __action1560< fn __action1561< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action675( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action979( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1335( - mode, __temp0, - __3, - __4, - __5, - __6, - __7, - __8, ) } @@ -67048,37 +68619,31 @@ fn __action1561< fn __action1562< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), - __9: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Comprehension { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __5.2; + let __end0 = __5.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action980( mode, __0, __1, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1335( - mode, - __temp0, __4, __5, - __6, - __7, - __8, - __9, + __temp0, ) } @@ -67087,29 +68652,29 @@ fn __action1562< fn __action1563< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Comprehension { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1336( + __action981( mode, - __temp0, + __0, __1, __2, __3, __4, - __5, + __temp0, ) } @@ -67118,33 +68683,23 @@ fn __action1563< fn __action1564< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action983( mode, __0, __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1336( - mode, __temp0, - __3, - __4, - __5, - __6, - __7, ) } @@ -67153,35 +68708,23 @@ fn __action1564< fn __action1565< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action984( mode, __0, __1, - __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1336( - mode, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -67190,33 +68733,25 @@ fn __action1565< fn __action1566< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Identifier, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Parameter { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1337( + __action1174( mode, - __temp0, + __0, __1, __2, - __3, - __4, - __5, - __6, - __7, + __temp0, ) } @@ -67225,37 +68760,21 @@ fn __action1566< fn __action1567< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), - __9: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Parameter { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1337( + __action1175( mode, + __0, __temp0, - __3, - __4, - __5, - __6, - __7, - __8, - __9, ) } @@ -67264,39 +68783,21 @@ fn __action1567< fn __action1568< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, Option>, TextSize), - __10: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Parameter { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1337( + __action986( mode, + __0, __temp0, - __4, - __5, - __6, - __7, - __8, - __9, - __10, ) } @@ -67305,31 +68806,27 @@ fn __action1568< fn __action1569< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, core::option::Option, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, core::option::Option>, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1338( + __action987( mode, - __temp0, + __0, __1, __2, __3, - __4, - __5, - __6, + __temp0, ) } @@ -67338,35 +68835,21 @@ fn __action1569< fn __action1570< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1338( + __action988( mode, + __0, __temp0, - __3, - __4, - __5, - __6, - __7, - __8, ) } @@ -67375,37 +68858,23 @@ fn __action1570< fn __action1571< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), - __9: (TextSize, token::Tok, TextSize), -) -> Result> +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action989( mode, __0, __1, - __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1338( - mode, __temp0, - __4, - __5, - __6, - __7, - __8, - __9, ) } @@ -67414,27 +68883,23 @@ fn __action1571< fn __action1572< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, Vec, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1339( + __action990( mode, - __temp0, + __0, __1, - __2, - __3, - __4, + __temp0, ) } @@ -67443,31 +68908,21 @@ fn __action1572< fn __action1573< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, Vec, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1339( + __action991( mode, + __0, __temp0, - __3, - __4, - __5, - __6, ) } @@ -67476,33 +68931,25 @@ fn __action1573< fn __action1574< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action992( mode, __0, __1, __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1339( - mode, __temp0, - __4, - __5, - __6, - __7, ) } @@ -67511,25 +68958,25 @@ fn __action1574< fn __action1575< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1340( + __action993( mode, - __temp0, + __0, __1, __2, - __3, + __temp0, ) } @@ -67538,29 +68985,25 @@ fn __action1575< fn __action1576< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, ast::Operator, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action675( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action994( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1340( - mode, __temp0, - __3, - __4, - __5, ) } @@ -67569,31 +69012,29 @@ fn __action1576< fn __action1577< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action995( mode, __0, __1, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1340( - mode, - __temp0, __4, - __5, - __6, + __temp0, ) } @@ -67602,29 +69043,29 @@ fn __action1577< fn __action1578< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1341( + __action996( mode, - __temp0, + __0, __1, __2, __3, __4, - __5, + __temp0, ) } @@ -67633,33 +69074,23 @@ fn __action1578< fn __action1579< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Suite, TextSize), +) -> ast::Mod { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action997( mode, __0, __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1341( - mode, __temp0, - __3, - __4, - __5, - __6, - __7, ) } @@ -67668,35 +69099,23 @@ fn __action1579< fn __action1580< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> ast::Mod { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1180( mode, __0, __1, - __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1341( - mode, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -67705,27 +69124,25 @@ fn __action1580< fn __action1581< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Mod { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1342( + __action1181( mode, - __temp0, + __0, __1, __2, - __3, - __4, + __temp0, ) } @@ -67734,31 +69151,39 @@ fn __action1581< fn __action1582< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __9.2; + let __end0 = __9.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1200( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1342( - mode, - __temp0, __3, __4, __5, __6, + __7, + __8, + __9, + __temp0, ) } @@ -67767,33 +69192,33 @@ fn __action1582< fn __action1583< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), __4: (TextSize, token::Tok, TextSize), __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1201( mode, __0, __1, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1342( - mode, - __temp0, __4, __5, __6, - __7, + __temp0, ) } @@ -67802,21 +69227,33 @@ fn __action1583< fn __action1584< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1343( + __action1202( mode, - __temp0, + __0, __1, + __2, + __3, + __4, + __5, + __6, + __temp0, ) } @@ -67825,25 +69262,27 @@ fn __action1584< fn __action1585< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1203( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1343( - mode, - __temp0, __3, + __temp0, ) } @@ -67852,27 +69291,39 @@ fn __action1585< fn __action1586< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), __4: (TextSize, token::Tok, TextSize), -) -> Result> + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __9.2; + let __end0 = __9.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1204( mode, __0, __1, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1343( - mode, - __temp0, __4, + __5, + __6, + __7, + __8, + __9, + __temp0, ) } @@ -67881,29 +69332,33 @@ fn __action1586< fn __action1587< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result> + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1344( + __action1205( mode, - __temp0, + __0, __1, __2, __3, __4, __5, + __6, + __temp0, ) } @@ -67912,33 +69367,33 @@ fn __action1587< fn __action1588< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), -) -> Result> + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __6.2; + let __end0 = __6.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1206( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1344( - mode, - __temp0, __3, __4, __5, __6, - __7, + __temp0, ) } @@ -67947,35 +69402,27 @@ fn __action1588< fn __action1589< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), -) -> Result> + __2: (TextSize, ast::Suite, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; + let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action676( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1207( mode, __0, __1, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1344( - mode, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -67984,27 +69431,21 @@ fn __action1589< fn __action1590< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::Expr { - let __start0 = __0.0; + let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action416( + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1345( + __action1002( mode, + __0, __temp0, - __1, - __2, - __3, - __4, ) } @@ -68013,31 +69454,29 @@ fn __action1590< fn __action1591< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), + __2: (TextSize, core::option::Option, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), -) -> Result> + __4: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1003( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1345( - mode, - __temp0, __3, __4, - __5, - __6, + __temp0, ) } @@ -68046,33 +69485,25 @@ fn __action1591< fn __action1592< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Identifier, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::TypeParam { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1169( mode, __0, __1, __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1345( - mode, __temp0, - __4, - __5, - __6, - __7, ) } @@ -68081,31 +69512,21 @@ fn __action1592< fn __action1593< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::TypeParam { - let __start0 = __0.0; + let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action416( + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1346( + __action1170( mode, + __0, __temp0, - __1, - __2, - __3, - __4, - __5, - __6, ) } @@ -68114,35 +69535,23 @@ fn __action1593< fn __action1594< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), +) -> ast::TypeParam { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1005( mode, __0, __1, - __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1346( - mode, __temp0, - __3, - __4, - __5, - __6, - __7, - __8, ) } @@ -68151,37 +69560,23 @@ fn __action1594< fn __action1595< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), +) -> ast::TypeParam { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1006( mode, __0, __1, - __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1346( - mode, __temp0, - __4, - __5, - __6, - __7, - __8, - __9, ) } @@ -68190,29 +69585,27 @@ fn __action1595< fn __action1596< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result> + __3: (TextSize, token::Tok, TextSize), +) -> ast::TypeParams { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __3.2; + let __end0 = __3.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1347( + __action1007( mode, - __temp0, + __0, __1, __2, __3, - __4, - __5, + __temp0, ) } @@ -68221,33 +69614,25 @@ fn __action1596< fn __action1597< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), -) -> Result> +) -> ast::TypeParams { - let __start0 = __0.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action675( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1008( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1347( - mode, __temp0, - __3, - __4, - __5, - __6, - __7, ) } @@ -68256,35 +69641,25 @@ fn __action1597< fn __action1598< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Identifier, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::ParameterWithDefault { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1171( mode, __0, __1, __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1347( - mode, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -68293,25 +69668,21 @@ fn __action1598< fn __action1599< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), -) -> Result> + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::ParameterWithDefault { - let __start0 = __0.0; + let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action416( + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1348( + __action1172( mode, + __0, __temp0, - __1, - __2, - __3, ) } @@ -68320,29 +69691,21 @@ fn __action1599< fn __action1600< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), -) -> Result> + __0: (TextSize, ast::Identifier, TextSize), +) -> ast::ParameterWithDefault { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1348( + __action1010( mode, + __0, __temp0, - __3, - __4, - __5, ) } @@ -68351,31 +69714,21 @@ fn __action1600< fn __action1601< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1348( + __action1011( mode, + __0, __temp0, - __4, - __5, - __6, ) } @@ -68384,23 +69737,21 @@ fn __action1601< fn __action1602< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), +) -> ast::WithItem { - let __start0 = __0.0; + let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action416( + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1349( + __action1013( mode, + __0, __temp0, - __1, - __2, ) } @@ -68409,27 +69760,25 @@ fn __action1602< fn __action1603< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::WithItem { - let __start0 = __0.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action675( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1014( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1349( - mode, __temp0, - __3, - __4, ) } @@ -68438,29 +69787,25 @@ fn __action1603< fn __action1604< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::WithItem { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1015( mode, __0, __1, __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1349( - mode, __temp0, - __4, - __5, ) } @@ -68469,27 +69814,21 @@ fn __action1604< fn __action1605< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), +) -> ast::WithItem { - let __start0 = __0.0; + let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action416( + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1350( + __action1016( mode, + __0, __temp0, - __1, - __2, - __3, - __4, ) } @@ -68498,31 +69837,25 @@ fn __action1605< fn __action1606< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::WithItem { - let __start0 = __0.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action675( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1017( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1350( - mode, __temp0, - __3, - __4, - __5, - __6, ) } @@ -68531,33 +69864,21 @@ fn __action1606< fn __action1607< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> + __0: (TextSize, Vec, TextSize), +) -> Vec { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1350( + __action1018( mode, + __0, __temp0, - __4, - __5, - __6, - __7, ) } @@ -68566,25 +69887,25 @@ fn __action1607< fn __action1608< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1351( + __action1021( mode, - __temp0, + __0, __1, __2, - __3, + __temp0, ) } @@ -68593,29 +69914,25 @@ fn __action1608< fn __action1609< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action675( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1022( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1351( - mode, __temp0, - __3, - __4, - __5, ) } @@ -68624,31 +69941,25 @@ fn __action1609< fn __action1610< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1023( mode, __0, __1, __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1351( - mode, __temp0, - __4, - __5, - __6, ) } @@ -68657,18 +69968,22 @@ fn __action1610< fn __action1611< >( mode: Mode, - __0: (TextSize, Vec, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, core::option::Option, TextSize), +) -> ast::Expr { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1352( + __action1024( mode, + __0, + __1, __temp0, ) } @@ -68678,22 +69993,24 @@ fn __action1611< fn __action1612< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Expr { - let __start0 = __0.0; + let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action675( + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1025( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1352( - mode, __temp0, ) } @@ -68703,25 +70020,21 @@ fn __action1612< fn __action1613< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, Vec, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> +) -> Vec { let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __end0 = __0.2; + let __temp0 = __action1607( mode, __0, - __1, - __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1352( + __action304( mode, __temp0, + __1, ) } @@ -68730,23 +70043,23 @@ fn __action1613< fn __action1614< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), __3: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1607( mode, - __0, + __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1353( + __action693( mode, + __0, __temp0, - __1, __2, __3, ) @@ -68757,29 +70070,23 @@ fn __action1614< fn __action1615< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1607( mode, - __0, __1, - __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1353( + __action694( mode, + __0, __temp0, - __3, - __4, - __5, + __2, ) } @@ -68788,31 +70095,21 @@ fn __action1615< fn __action1616< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, Vec, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> +) -> core::option::Option> { let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __end0 = __1.2; + let __temp0 = __action1613( mode, __0, __1, - __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1353( + __action302( mode, __temp0, - __4, - __5, - __6, ) } @@ -68821,23 +70118,29 @@ fn __action1616< fn __action1617< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::WithItem, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Vec { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action416( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1616( mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1354( - mode, - __temp0, __1, __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1155( + mode, + __0, + __temp0, + __3, + __4, + __5, ) } @@ -68846,27 +70149,27 @@ fn __action1617< fn __action1618< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::WithItem, TextSize), __2: (TextSize, token::Tok, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action675( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action303( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1354( + __action1155( mode, + __0, __temp0, + __1, + __2, __3, - __4, ) } @@ -68875,29 +70178,31 @@ fn __action1618< fn __action1619< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result> + __3: (TextSize, ast::WithItem, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Vec { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action676( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1616( mode, - __0, __1, __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1354( + __action1156( mode, + __0, __temp0, + __3, __4, __5, + __6, ) } @@ -68906,31 +70211,29 @@ fn __action1619< fn __action1620< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::WithItem, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), + __3: (TextSize, token::Tok, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action303( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1373( + __action1156( mode, + __0, __temp0, __1, __2, __3, __4, - __5, - __6, ) } @@ -68939,35 +70242,27 @@ fn __action1620< fn __action1621< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::WithItem, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; + let __start0 = __1.0; let __end0 = __2.2; - let __temp0 = __action683( + let __temp0 = __action1616( mode, - __0, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1373( + __action1157( mode, + __0, __temp0, __3, __4, - __5, - __6, - __7, - __8, ) } @@ -68976,37 +70271,25 @@ fn __action1621< fn __action1622< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::WithItem, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), - __9: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action303( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1373( + __action1157( mode, + __0, __temp0, - __4, - __5, - __6, - __7, - __8, - __9, + __1, + __2, ) } @@ -69015,26 +70298,26 @@ fn __action1622< fn __action1623< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), + __3: (TextSize, ast::WithItem, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), __5: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1616( mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1374( - mode, - __temp0, __1, __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1158( + mode, + __0, + __temp0, __3, __4, __5, @@ -69046,33 +70329,27 @@ fn __action1623< fn __action1624< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::WithItem, TextSize), + __2: (TextSize, alloc::vec::Vec, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Vec { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action303( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1374( + __action1158( mode, + __0, __temp0, + __1, + __2, __3, - __4, - __5, - __6, - __7, ) } @@ -69081,35 +70358,19 @@ fn __action1624< fn __action1625< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, (String, StringKind, bool), TextSize), +) -> alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)> { let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __end0 = __0.2; + let __temp0 = __action1277( mode, __0, - __1, - __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1374( + __action332( mode, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -69118,33 +70379,21 @@ fn __action1625< fn __action1626< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)>, TextSize), + __1: (TextSize, (String, StringKind, bool), TextSize), +) -> alloc::vec::Vec<(TextSize, (String, StringKind, bool), TextSize)> { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1277( mode, - __0, + __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1375( + __action333( mode, + __0, __temp0, - __1, - __2, - __3, - __4, - __5, - __6, - __7, ) } @@ -69153,37 +70402,21 @@ fn __action1626< fn __action1627< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), - __9: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::CmpOp, TextSize), + __1: (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> { let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __end0 = __1.2; + let __temp0 = __action502( mode, __0, __1, - __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1375( + __action500( mode, __temp0, - __3, - __4, - __5, - __6, - __7, - __8, - __9, ) } @@ -69192,39 +70425,23 @@ fn __action1627< fn __action1628< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, Option>, TextSize), - __10: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, alloc::vec::Vec<(ast::CmpOp, ast::Expr)>, TextSize), + __1: (TextSize, ast::CmpOp, TextSize), + __2: (TextSize, ast::Expr, TextSize), +) -> alloc::vec::Vec<(ast::CmpOp, ast::Expr)> { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action502( mode, - __0, __1, __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1375( + __action501( mode, + __0, __temp0, - __4, - __5, - __6, - __7, - __8, - __9, - __10, ) } @@ -69233,31 +70450,19 @@ fn __action1628< fn __action1629< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), +) -> core::option::Option { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action345( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1376( + __action343( mode, __temp0, - __1, - __2, - __3, - __4, - __5, - __6, ) } @@ -69266,35 +70471,27 @@ fn __action1629< fn __action1630< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Pattern, TextSize), + __2: (TextSize, ast::Expr, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> + __4: (TextSize, ast::Suite, TextSize), +) -> ast::MatchCase { - let __start0 = __0.0; + let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action683( + let __temp0 = __action1629( mode, - __0, - __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1376( + __action918( mode, + __0, + __1, __temp0, __3, __4, - __5, - __6, - __7, - __8, ) } @@ -69303,37 +70500,27 @@ fn __action1630< fn __action1631< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Pattern, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), - __9: (TextSize, token::Tok, TextSize), -) -> Result> + __3: (TextSize, ast::Suite, TextSize), +) -> ast::MatchCase { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __1.2; + let __end0 = __2.0; + let __temp0 = __action344( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action918( mode, __0, __1, + __temp0, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1376( - mode, - __temp0, - __4, - __5, - __6, - __7, - __8, - __9, ) } @@ -69342,27 +70529,19 @@ fn __action1631< fn __action1632< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Parameters, TextSize), +) -> core::option::Option { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action278( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1377( + __action276( mode, __temp0, - __1, - __2, - __3, - __4, ) } @@ -69371,31 +70550,23 @@ fn __action1632< fn __action1633< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameters, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1632( mode, - __0, __1, - __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1377( + __action1542( mode, + __0, __temp0, - __3, - __4, - __5, - __6, + __2, ) } @@ -69404,33 +70575,23 @@ fn __action1633< fn __action1634< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, token::Tok, TextSize), ) -> Result> { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action277( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1377( + __action1542( mode, + __0, __temp0, - __4, - __5, - __6, - __7, + __1, ) } @@ -69439,25 +70600,31 @@ fn __action1634< fn __action1635< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, ast::Arguments, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action268( mode, - __0, + __4, ); let __temp0 = (__start0, __temp0, __end0); - __action1378( + __action833( mode, - __temp0, + __0, __1, __2, __3, + __temp0, + __5, + __6, ) } @@ -69466,27 +70633,29 @@ fn __action1635< fn __action1636< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> + __5: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __3.2; + let __end0 = __4.0; + let __temp0 = __action269( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action833( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1378( - mode, - __temp0, __3, + __temp0, __4, __5, ) @@ -69497,31 +70666,21 @@ fn __action1636< fn __action1637< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action385( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1378( + __action1404( mode, + __0, __temp0, - __4, - __5, - __6, ) } @@ -69530,29 +70689,21 @@ fn __action1637< fn __action1638< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action386( mode, - __0, + __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1379( + __action1404( mode, + __0, __temp0, - __1, - __2, - __3, - __4, - __5, ) } @@ -69561,33 +70712,25 @@ fn __action1638< fn __action1639< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __3.0; + let __end0 = __3.2; + let __temp0 = __action380( + mode, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1406( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1379( - mode, __temp0, - __3, - __4, - __5, - __6, - __7, ) } @@ -69596,35 +70739,25 @@ fn __action1639< fn __action1640< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, ast::Expr, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), - __8: (TextSize, token::Tok, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), +) -> ast::Stmt { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __2.2; + let __end0 = __2.2; + let __temp0 = __action381( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1406( mode, __0, __1, __2, - __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1379( - mode, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -69633,27 +70766,19 @@ fn __action1640< fn __action1641< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), +) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action446( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1380( + __action1224( mode, __temp0, - __1, - __2, - __3, - __4, ) } @@ -69662,31 +70787,21 @@ fn __action1641< fn __action1642< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), -) -> Result> + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = *__lookbehind; + let __end0 = *__lookahead; + let __temp0 = __action447( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1380( + __action1224( mode, __temp0, - __3, - __4, - __5, - __6, ) } @@ -69695,33 +70810,21 @@ fn __action1642< fn __action1643< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), + __1: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), +) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action446( mode, - __0, __1, - __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1380( + __action1225( mode, + __0, __temp0, - __4, - __5, - __6, - __7, ) } @@ -69730,21 +70833,21 @@ fn __action1643< fn __action1644< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), -) -> Result> + __0: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), +) -> Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)> { - let __start0 = __0.0; + let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action447( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1381( + __action1225( mode, + __0, __temp0, - __1, ) } @@ -69753,25 +70856,23 @@ fn __action1644< fn __action1645< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Result> { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1641( mode, - __0, __1, - __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1381( + __action1284( mode, + __0, __temp0, - __3, + __2, ) } @@ -69780,27 +70881,23 @@ fn __action1645< fn __action1646< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), -) -> Result> +) -> Result> { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action1642( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1381( + __action1284( mode, + __0, __temp0, - __4, + __1, ) } @@ -69809,29 +70906,25 @@ fn __action1646< fn __action1647< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), + __2: (TextSize, (Option<(TextSize, TextSize, Option)>, ast::Expr), TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1643( mode, - __0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1382( - mode, - __temp0, __1, __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1284( + mode, + __0, + __temp0, __3, - __4, - __5, ) } @@ -69840,33 +70933,23 @@ fn __action1647< fn __action1648< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec<(Option<(TextSize, TextSize, Option)>, ast::Expr)>, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), -) -> Result> +) -> Result> { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1644( mode, - __0, __1, - __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1382( + __action1284( mode, + __0, __temp0, - __3, - __4, - __5, - __6, - __7, + __2, ) } @@ -69875,35 +70958,19 @@ fn __action1648< fn __action1649< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, ast::Pattern, TextSize), +) -> Vec { let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __end0 = __0.2; + let __temp0 = __action408( mode, __0, - __1, - __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1382( + __action1255( mode, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -69912,27 +70979,21 @@ fn __action1649< fn __action1650< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, Option>, TextSize), -) -> Result> + __lookbehind: &TextSize, + __lookahead: &TextSize, +) -> Vec { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = *__lookbehind; + let __end0 = *__lookahead; + let __temp0 = __action409( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1383( + __action1255( mode, __temp0, - __1, - __2, - __3, - __4, ) } @@ -69941,31 +71002,21 @@ fn __action1650< fn __action1651< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Pattern, TextSize), +) -> Vec { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action408( mode, - __0, __1, - __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1383( + __action1256( mode, + __0, __temp0, - __3, - __4, - __5, - __6, ) } @@ -69974,33 +71025,21 @@ fn __action1651< fn __action1652< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, alloc::vec::Vec, TextSize), +) -> Vec { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action409( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1383( + __action1256( mode, + __0, __temp0, - __4, - __5, - __6, - __7, ) } @@ -70009,31 +71048,23 @@ fn __action1652< fn __action1653< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Pattern, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, Option>, TextSize), -) -> Result> +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1649( mode, - __0, + __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1384( + __action1558( mode, + __0, __temp0, - __1, __2, - __3, - __4, - __5, - __6, ) } @@ -70042,35 +71073,23 @@ fn __action1653< fn __action1654< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), -) -> Result> +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action1650( mode, - __0, - __1, - __2, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1384( + __action1558( mode, + __0, __temp0, - __3, - __4, - __5, - __6, - __7, - __8, + __1, ) } @@ -70079,37 +71098,25 @@ fn __action1654< fn __action1655< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), - __7: (TextSize, alloc::vec::Vec, TextSize), - __8: (TextSize, token::Tok, TextSize), - __9: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, ast::Pattern, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __1.0; + let __end0 = __2.2; + let __temp0 = __action1651( mode, - __0, __1, __2, - __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1384( + __action1558( mode, + __0, __temp0, - __4, - __5, - __6, - __7, - __8, - __9, + __3, ) } @@ -70118,29 +71125,23 @@ fn __action1655< fn __action1656< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, Option>, TextSize), -) -> Result> +) -> ast::Pattern { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action1652( mode, - __0, + __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1385( + __action1558( mode, + __0, __temp0, - __1, __2, - __3, - __4, - __5, ) } @@ -70149,33 +71150,21 @@ fn __action1656< fn __action1657< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, alloc::vec::Vec, TextSize), - __6: (TextSize, token::Tok, TextSize), - __7: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, Vec, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action237( mode, - __0, __1, - __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1385( + __action1414( mode, + __0, __temp0, - __3, - __4, - __5, - __6, - __7, ) } @@ -70184,35 +71173,21 @@ fn __action1657< fn __action1658< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, alloc::vec::Vec, TextSize), - __7: (TextSize, token::Tok, TextSize), - __8: (TextSize, Option>, TextSize), -) -> Result> + __0: (TextSize, ast::Expr, TextSize), +) -> (Option<(TextSize, TextSize, Option)>, ast::Expr) { - let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action238( mode, - __0, - __1, - __2, - __3, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1385( + __action1414( mode, + __0, __temp0, - __4, - __5, - __6, - __7, - __8, ) } @@ -70221,25 +71196,29 @@ fn __action1658< fn __action1659< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), -) -> Result> + __2: (TextSize, ast::Expr, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Expr, TextSize), +) -> ast::Comprehension { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __4.2; + let __end0 = __4.2; + let __temp0 = __action240( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1386( + __action1562( mode, - __temp0, + __0, __1, __2, __3, + __4, + __temp0, ) } @@ -70248,29 +71227,29 @@ fn __action1659< fn __action1660< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, token::Tok, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Expr, TextSize), __3: (TextSize, token::Tok, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, ast::Parameter, TextSize), -) -> Result> + __4: (TextSize, ast::Expr, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Comprehension { - let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __start0 = __5.0; + let __end0 = __5.2; + let __temp0 = __action241( + mode, + __5, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1562( mode, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1386( - mode, - __temp0, __3, __4, - __5, + __temp0, ) } @@ -70279,31 +71258,27 @@ fn __action1660< fn __action1661< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), - __5: (TextSize, token::Tok, TextSize), - __6: (TextSize, ast::Parameter, TextSize), -) -> Result> + __3: (TextSize, ast::Expr, TextSize), +) -> ast::Comprehension { - let __start0 = __0.0; + let __start0 = __3.2; let __end0 = __3.2; - let __temp0 = __action684( + let __temp0 = __action240( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1563( mode, __0, __1, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1386( - mode, __temp0, - __4, - __5, - __6, ) } @@ -70312,23 +71287,27 @@ fn __action1661< fn __action1662< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Expr, TextSize), __2: (TextSize, token::Tok, TextSize), -) -> Result> + __3: (TextSize, ast::Expr, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), +) -> ast::Comprehension { - let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __start0 = __4.0; + let __end0 = __4.2; + let __temp0 = __action241( mode, - __0, + __4, ); let __temp0 = (__start0, __temp0, __end0); - __action1387( + __action1563( mode, - __temp0, + __0, __1, __2, + __3, + __temp0, ) } @@ -70337,27 +71316,31 @@ fn __action1662< fn __action1663< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, token::Tok, TextSize), + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, ast::Arguments, TextSize), __4: (TextSize, token::Tok, TextSize), -) -> Result> + __5: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { let __start0 = __0.0; - let __end0 = __2.2; - let __temp0 = __action683( + let __end0 = __0.0; + let __temp0 = __action288( mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1635( + mode, + __temp0, __0, __1, __2, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1387( - mode, - __temp0, __3, __4, + __5, ) } @@ -70366,29 +71349,31 @@ fn __action1663< fn __action1664< >( mode: Mode, - __0: (TextSize, Vec, TextSize), + __0: (TextSize, alloc::vec::Vec, TextSize), __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, alloc::vec::Vec, TextSize), - __4: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, ast::Arguments, TextSize), __5: (TextSize, token::Tok, TextSize), -) -> Result> + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { let __start0 = __0.0; - let __end0 = __3.2; - let __temp0 = __action684( + let __end0 = __0.2; + let __temp0 = __action289( mode, __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1635( + mode, + __temp0, __1, __2, __3, - ); - let __temp0 = (__start0, __temp0, __end0); - __action1387( - mode, - __temp0, __4, __5, + __6, ) } @@ -70397,23 +71382,25 @@ fn __action1664< fn __action1665< >( mode: Mode, - __0: (TextSize, Vec, TextSize), - __1: (TextSize, token::Tok, TextSize), - __2: (TextSize, token::Tok, TextSize), - __3: (TextSize, ast::Parameter, TextSize), - __4: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt { let __start0 = __0.0; - let __end0 = __0.2; - let __temp0 = __action424( + let __end0 = __0.0; + let __temp0 = __action288( mode, - __0, + &__start0, + &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1388( + __action1636( mode, __temp0, + __0, __1, __2, __3, @@ -70424,6 +71411,1164 @@ fn __action1665< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1666< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action289( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1636( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1667< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, ast::Parameters, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Expr, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action288( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1160( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1668< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, ast::Parameters, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, ast::Expr, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action289( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1160( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1669< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, ast::Parameters, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action288( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1161( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1670< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Identifier, TextSize), + __4: (TextSize, core::option::Option, TextSize), + __5: (TextSize, ast::Parameters, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action289( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1161( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1671< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, ast::Parameters, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Expr, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action288( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1162( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1672< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, ast::Parameters, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Expr, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action289( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1162( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1673< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Identifier, TextSize), + __2: (TextSize, core::option::Option, TextSize), + __3: (TextSize, ast::Parameters, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action288( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1163( + mode, + __temp0, + __0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1674< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, core::option::Option, TextSize), + __4: (TextSize, ast::Parameters, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Suite, TextSize), +) -> ast::Stmt +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action289( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1163( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1675< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action583( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1308( + mode, + __0, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1676< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action584( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1308( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1677< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action583( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1333( + mode, + __0, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1678< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action584( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1333( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1679< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec<(Option>, ast::Expr)>, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action583( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1356( + mode, + __0, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1680< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action584( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1356( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1681< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, ast::Parameter, TextSize), +) -> Option> +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action480( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action420( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1682< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), +) -> Option> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action481( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action420( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1683< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1425( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action372( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1684< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action1426( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action372( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1685< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __2.0; + let __end0 = __4.2; + let __temp0 = __action1425( + mode, + __2, + __3, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action373( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1686< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action1426( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action373( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1687< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action1427( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action365( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1688< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action1428( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action365( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1689< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __2.0; + let __end0 = __4.2; + let __temp0 = __action1427( + mode, + __2, + __3, + __4, + ); + let __temp0 = (__start0, __temp0, __end0); + __action366( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1690< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, ast::Identifier, TextSize), +) -> Vec +{ + let __start0 = __2.0; + let __end0 = __2.2; + let __temp0 = __action1428( + mode, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action366( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1691< +>( + mode: Mode, + __0: (TextSize, ast::Identifier, TextSize), +) -> (Option, Option) +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action370( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action62( + mode, + __temp0, + __0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1692< +>( + mode: Mode, + __0: (TextSize, alloc::vec::Vec, TextSize), + __1: (TextSize, ast::Identifier, TextSize), +) -> (Option, Option) +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action371( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action62( + mode, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1693< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action591( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1293( + mode, + __0, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1694< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action592( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1293( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1695< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action591( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1318( + mode, + __0, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1696< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action592( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1318( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1697< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, Vec, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __1.0; + let __end0 = __1.2; + let __temp0 = __action591( + mode, + __1, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1343( + mode, + __0, + __temp0, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1698< +>( + mode: Mode, + __0: (TextSize, token::Tok, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> ast::Expr +{ + let __start0 = __0.2; + let __end0 = __1.0; + let __temp0 = __action592( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1343( + mode, + __0, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1699< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1466( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1700< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1466( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1701< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), + __9: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1466( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1702< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1467( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1703< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1467( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1704< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1467( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1705< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1468( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1706< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70433,18 +72578,236 @@ fn __action1666< __4: (TextSize, token::Tok, TextSize), __5: (TextSize, ast::Parameter, TextSize), __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), + __9: (TextSize, token::Tok, TextSize), ) -> Result> { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action683( + let __temp0 = __action725( mode, __0, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1388( + __action1468( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1707< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, Option>, TextSize), + __10: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1468( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + __10, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1708< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1469( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1709< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1469( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1710< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), + __9: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1469( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1711< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1470( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1712< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1470( mode, __temp0, __3, @@ -70456,7 +72819,1062 @@ fn __action1666< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1667< +fn __action1713< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1470( + mode, + __temp0, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1714< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1471( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1715< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1471( + mode, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1716< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1471( + mode, + __temp0, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1717< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1472( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1718< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1472( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1719< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1472( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1720< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1473( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1721< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1473( + mode, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1722< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1473( + mode, + __temp0, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1723< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1474( + mode, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1724< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1474( + mode, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1725< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1474( + mode, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1726< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1475( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1727< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1475( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1728< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1475( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1729< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1476( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1730< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1476( + mode, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1731< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1476( + mode, + __temp0, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1732< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1477( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1733< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1477( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1734< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1477( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1735< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1478( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1736< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1478( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1737< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1478( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1738< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1479( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1739< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1479( + mode, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1740< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1479( + mode, + __temp0, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1741< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1480( + mode, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1742< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1480( + mode, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1743< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action726( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1480( + mode, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1744< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action425( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1481( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1745< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action725( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1481( + mode, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1746< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70471,7 +73889,7 @@ fn __action1667< { let __start0 = __0.0; let __end0 = __3.2; - let __temp0 = __action684( + let __temp0 = __action726( mode, __0, __1, @@ -70479,7 +73897,7 @@ fn __action1667< __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1388( + __action1481( mode, __temp0, __4, @@ -70491,7 +73909,7 @@ fn __action1667< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1668< +fn __action1747< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70502,12 +73920,12 @@ fn __action1668< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action425( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1389( + __action1482( mode, __temp0, __1, @@ -70518,7 +73936,7 @@ fn __action1668< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1669< +fn __action1748< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70531,14 +73949,14 @@ fn __action1669< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action683( + let __temp0 = __action725( mode, __0, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1389( + __action1482( mode, __temp0, __3, @@ -70549,7 +73967,7 @@ fn __action1669< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1670< +fn __action1749< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70563,7 +73981,7 @@ fn __action1670< { let __start0 = __0.0; let __end0 = __3.2; - let __temp0 = __action684( + let __temp0 = __action726( mode, __0, __1, @@ -70571,7 +73989,7 @@ fn __action1670< __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1389( + __action1482( mode, __temp0, __4, @@ -70582,7 +74000,7 @@ fn __action1670< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1671< +fn __action1750< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70590,12 +74008,12 @@ fn __action1671< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action425( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1390( + __action1483( mode, __temp0, ) @@ -70603,7 +74021,7 @@ fn __action1671< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1672< +fn __action1751< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70613,14 +74031,14 @@ fn __action1672< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action683( + let __temp0 = __action725( mode, __0, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1390( + __action1483( mode, __temp0, ) @@ -70628,7 +74046,7 @@ fn __action1672< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1673< +fn __action1752< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70639,7 +74057,7 @@ fn __action1673< { let __start0 = __0.0; let __end0 = __3.2; - let __temp0 = __action684( + let __temp0 = __action726( mode, __0, __1, @@ -70647,7 +74065,7 @@ fn __action1673< __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1390( + __action1483( mode, __temp0, ) @@ -70655,7 +74073,7 @@ fn __action1673< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1674< +fn __action1753< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70666,12 +74084,12 @@ fn __action1674< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action425( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1391( + __action1484( mode, __temp0, __1, @@ -70682,7 +74100,7 @@ fn __action1674< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1675< +fn __action1754< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70695,14 +74113,14 @@ fn __action1675< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action683( + let __temp0 = __action725( mode, __0, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1391( + __action1484( mode, __temp0, __3, @@ -70713,7 +74131,7 @@ fn __action1675< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1676< +fn __action1755< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70727,7 +74145,7 @@ fn __action1676< { let __start0 = __0.0; let __end0 = __3.2; - let __temp0 = __action684( + let __temp0 = __action726( mode, __0, __1, @@ -70735,7 +74153,7 @@ fn __action1676< __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1391( + __action1484( mode, __temp0, __4, @@ -70746,7 +74164,7 @@ fn __action1676< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1677< +fn __action1756< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70756,12 +74174,12 @@ fn __action1677< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action424( + let __temp0 = __action425( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1392( + __action1485( mode, __temp0, __1, @@ -70771,7 +74189,7 @@ fn __action1677< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1678< +fn __action1757< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70783,14 +74201,14 @@ fn __action1678< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action683( + let __temp0 = __action725( mode, __0, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1392( + __action1485( mode, __temp0, __3, @@ -70800,7 +74218,7 @@ fn __action1678< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1679< +fn __action1758< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -70813,7 +74231,7 @@ fn __action1679< { let __start0 = __0.0; let __end0 = __3.2; - let __temp0 = __action684( + let __temp0 = __action726( mode, __0, __1, @@ -70821,7 +74239,7 @@ fn __action1679< __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1392( + __action1485( mode, __temp0, __4, @@ -70831,7 +74249,1935 @@ fn __action1679< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1680< +fn __action1759< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1504( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1760< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1504( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1761< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), + __9: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1504( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1762< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1505( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1763< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1505( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1764< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1505( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1765< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1506( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1766< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), + __9: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1506( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1767< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, Option>, TextSize), + __10: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1506( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + __10, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1768< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1507( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1769< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1507( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1770< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), + __9: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1507( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1771< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1508( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1772< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1508( + mode, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1773< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1508( + mode, + __temp0, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1774< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1509( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1775< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1509( + mode, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1776< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1509( + mode, + __temp0, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1777< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1510( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1778< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1510( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1779< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), + __8: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1510( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1780< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1511( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1781< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1511( + mode, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1782< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1511( + mode, + __temp0, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1783< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1512( + mode, + __temp0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1784< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1512( + mode, + __temp0, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1785< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1512( + mode, + __temp0, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1786< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1513( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1787< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1513( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1788< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1513( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1789< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1514( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1790< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1514( + mode, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1791< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1514( + mode, + __temp0, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1792< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1515( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1793< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1515( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1794< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), + __8: (TextSize, token::Tok, TextSize), + __9: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1515( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + __9, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1795< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1516( + mode, + __temp0, + __1, + __2, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1796< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), + __6: (TextSize, token::Tok, TextSize), + __7: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1516( + mode, + __temp0, + __3, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1797< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), + __7: (TextSize, token::Tok, TextSize), + __8: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1516( + mode, + __temp0, + __4, + __5, + __6, + __7, + __8, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1798< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1517( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1799< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1517( + mode, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1800< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1517( + mode, + __temp0, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1801< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1518( + mode, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1802< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1518( + mode, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1803< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1518( + mode, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1804< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, ast::Parameter, TextSize), + __4: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1519( + mode, + __temp0, + __1, + __2, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1805< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, ast::Parameter, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1519( + mode, + __temp0, + __3, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1806< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, ast::Parameter, TextSize), + __7: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1519( + mode, + __temp0, + __4, + __5, + __6, + __7, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1807< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1520( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1808< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1520( + mode, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1809< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, token::Tok, TextSize), + __6: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1520( + mode, + __temp0, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1810< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1521( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1811< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1521( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1812< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1521( + mode, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1813< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), + __3: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1522( + mode, + __temp0, + __1, + __2, + __3, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1814< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), + __5: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1522( + mode, + __temp0, + __3, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1815< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), + __6: (TextSize, token::Tok, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1522( + mode, + __temp0, + __4, + __5, + __6, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1816< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.2; + let __temp0 = __action433( + mode, + __0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1523( + mode, + __temp0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1817< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, token::Tok, TextSize), + __4: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __2.2; + let __temp0 = __action733( + mode, + __0, + __1, + __2, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1523( + mode, + __temp0, + __3, + __4, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1818< +>( + mode: Mode, + __0: (TextSize, Vec, TextSize), + __1: (TextSize, token::Tok, TextSize), + __2: (TextSize, token::Tok, TextSize), + __3: (TextSize, alloc::vec::Vec, TextSize), + __4: (TextSize, token::Tok, TextSize), + __5: (TextSize, Option>, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __3.2; + let __temp0 = __action734( + mode, + __0, + __1, + __2, + __3, + ); + let __temp0 = (__start0, __temp0, __end0); + __action1523( + mode, + __temp0, + __4, + __5, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1819< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -70842,12 +76188,12 @@ fn __action1680< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action258( + let __temp0 = __action260( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1304( + __action1435( mode, __0, __temp0, @@ -70858,7 +76204,7 @@ fn __action1680< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1681< +fn __action1820< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -70868,13 +76214,13 @@ fn __action1681< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action259( + let __temp0 = __action261( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1304( + __action1435( mode, __0, __temp0, @@ -70885,7 +76231,7 @@ fn __action1681< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1682< +fn __action1821< >( mode: Mode, __0: (TextSize, core::option::Option, TextSize), @@ -70896,12 +76242,12 @@ fn __action1682< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action254( + let __temp0 = __action256( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1436( + __action1569( mode, __0, __1, @@ -70912,7 +76258,7 @@ fn __action1682< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1683< +fn __action1822< >( mode: Mode, __0: (TextSize, core::option::Option, TextSize), @@ -70922,13 +76268,13 @@ fn __action1683< { let __start0 = __2.2; let __end0 = __2.2; - let __temp0 = __action255( + let __temp0 = __action257( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1436( + __action1569( mode, __0, __1, @@ -70939,7 +76285,7 @@ fn __action1683< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1684< +fn __action1823< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -70950,12 +76296,12 @@ fn __action1684< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action303( + let __temp0 = __action305( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action781( + __action857( mode, __0, __temp0, @@ -70966,7 +76312,7 @@ fn __action1684< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1685< +fn __action1824< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -70976,13 +76322,13 @@ fn __action1685< { let __start0 = __0.2; let __end0 = __1.0; - let __temp0 = __action304( + let __temp0 = __action306( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action781( + __action857( mode, __0, __temp0, @@ -70993,7 +76339,7 @@ fn __action1685< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1686< +fn __action1825< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71002,12 +76348,12 @@ fn __action1686< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action303( + let __temp0 = __action305( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action901( + __action982( mode, __0, __temp0, @@ -71016,7 +76362,7 @@ fn __action1686< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1687< +fn __action1826< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71024,13 +76370,13 @@ fn __action1687< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action304( + let __temp0 = __action306( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action901( + __action982( mode, __0, __temp0, @@ -71039,7 +76385,7 @@ fn __action1687< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1688< +fn __action1827< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71052,17 +76398,17 @@ fn __action1688< let __end0 = __0.2; let __start1 = __2.0; let __end1 = __2.2; - let __temp0 = __action303( + let __temp0 = __action305( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action303( + let __temp1 = __action305( mode, __2, ); let __temp1 = (__start1, __temp1, __end1); - __action1682( + __action1821( mode, __temp0, __1, @@ -71073,7 +76419,7 @@ fn __action1688< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1689< +fn __action1828< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71085,18 +76431,18 @@ fn __action1689< let __end0 = __0.2; let __start1 = __1.2; let __end1 = __2.0; - let __temp0 = __action303( + let __temp0 = __action305( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action304( + let __temp1 = __action306( mode, &__start1, &__end1, ); let __temp1 = (__start1, __temp1, __end1); - __action1682( + __action1821( mode, __temp0, __1, @@ -71107,7 +76453,7 @@ fn __action1689< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1690< +fn __action1829< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71119,18 +76465,18 @@ fn __action1690< let __end0 = __0.0; let __start1 = __1.0; let __end1 = __1.2; - let __temp0 = __action304( + let __temp0 = __action306( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action303( + let __temp1 = __action305( mode, __1, ); let __temp1 = (__start1, __temp1, __end1); - __action1682( + __action1821( mode, __temp0, __0, @@ -71141,7 +76487,7 @@ fn __action1690< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1691< +fn __action1830< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71152,19 +76498,19 @@ fn __action1691< let __end0 = __0.0; let __start1 = __0.2; let __end1 = __1.0; - let __temp0 = __action304( + let __temp0 = __action306( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action304( + let __temp1 = __action306( mode, &__start1, &__end1, ); let __temp1 = (__start1, __temp1, __end1); - __action1682( + __action1821( mode, __temp0, __0, @@ -71175,7 +76521,7 @@ fn __action1691< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1692< +fn __action1831< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71187,17 +76533,17 @@ fn __action1692< let __end0 = __0.2; let __start1 = __2.0; let __end1 = __2.2; - let __temp0 = __action303( + let __temp0 = __action305( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action303( + let __temp1 = __action305( mode, __2, ); let __temp1 = (__start1, __temp1, __end1); - __action1683( + __action1822( mode, __temp0, __1, @@ -71207,7 +76553,7 @@ fn __action1692< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1693< +fn __action1832< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71218,18 +76564,18 @@ fn __action1693< let __end0 = __0.2; let __start1 = __1.2; let __end1 = __1.2; - let __temp0 = __action303( + let __temp0 = __action305( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action304( + let __temp1 = __action306( mode, &__start1, &__end1, ); let __temp1 = (__start1, __temp1, __end1); - __action1683( + __action1822( mode, __temp0, __1, @@ -71239,7 +76585,7 @@ fn __action1693< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1694< +fn __action1833< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71250,18 +76596,18 @@ fn __action1694< let __end0 = __0.0; let __start1 = __1.0; let __end1 = __1.2; - let __temp0 = __action304( + let __temp0 = __action306( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action303( + let __temp1 = __action305( mode, __1, ); let __temp1 = (__start1, __temp1, __end1); - __action1683( + __action1822( mode, __temp0, __0, @@ -71271,7 +76617,7 @@ fn __action1694< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1695< +fn __action1834< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71281,19 +76627,19 @@ fn __action1695< let __end0 = __0.0; let __start1 = __0.2; let __end1 = __0.2; - let __temp0 = __action304( + let __temp0 = __action306( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - let __temp1 = __action304( + let __temp1 = __action306( mode, &__start1, &__end1, ); let __temp1 = (__start1, __temp1, __end1); - __action1683( + __action1822( mode, __temp0, __0, @@ -71303,7 +76649,7 @@ fn __action1695< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1696< +fn __action1835< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71320,12 +76666,12 @@ fn __action1696< { let __start0 = __4.0; let __end0 = __4.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __4, ); let __temp0 = (__start0, __temp0, __end0); - __action1099( + __action1188( mode, __0, __1, @@ -71342,7 +76688,7 @@ fn __action1696< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1697< +fn __action1836< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71356,12 +76702,12 @@ fn __action1697< { let __start0 = __4.0; let __end0 = __4.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __4, ); let __temp0 = (__start0, __temp0, __end0); - __action1100( + __action1189( mode, __0, __1, @@ -71375,7 +76721,7 @@ fn __action1697< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1698< +fn __action1837< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71391,12 +76737,12 @@ fn __action1698< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1101( + __action1190( mode, __0, __1, @@ -71412,7 +76758,7 @@ fn __action1698< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1699< +fn __action1838< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71425,12 +76771,12 @@ fn __action1699< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1102( + __action1191( mode, __0, __1, @@ -71443,7 +76789,7 @@ fn __action1699< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1700< +fn __action1839< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71451,12 +76797,12 @@ fn __action1700< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action371( + __action378( mode, __temp0, ) @@ -71464,7 +76810,7 @@ fn __action1700< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1701< +fn __action1840< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71472,12 +76818,12 @@ fn __action1701< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action30( + __action31( mode, __temp0, ) @@ -71485,7 +76831,7 @@ fn __action1701< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1702< +fn __action1841< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71493,12 +76839,12 @@ fn __action1702< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action32( + __action33( mode, __temp0, ) @@ -71506,7 +76852,7 @@ fn __action1702< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1703< +fn __action1842< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71515,12 +76861,12 @@ fn __action1703< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1446( + __action1580( mode, __0, __temp0, @@ -71529,7 +76875,7 @@ fn __action1703< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1704< +fn __action1843< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71539,12 +76885,12 @@ fn __action1704< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action220( + let __temp0 = __action222( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1447( + __action1581( mode, __0, __temp0, @@ -71554,7 +76900,7 @@ fn __action1704< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1705< +fn __action1844< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71563,12 +76909,12 @@ fn __action1705< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action1700( + let __temp0 = __action1839( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1282( + __action1412( mode, __0, __temp0, @@ -71577,7 +76923,7 @@ fn __action1705< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1706< +fn __action1845< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71585,13 +76931,13 @@ fn __action1706< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action372( + let __temp0 = __action379( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1282( + __action1412( mode, __0, __temp0, @@ -71600,7 +76946,7 @@ fn __action1706< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1707< +fn __action1846< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71609,12 +76955,12 @@ fn __action1707< { let __start0 = __1.0; let __end0 = __1.2; - let __temp0 = __action1700( + let __temp0 = __action1839( mode, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1476( + __action1611( mode, __0, __temp0, @@ -71623,7 +76969,7 @@ fn __action1707< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1708< +fn __action1847< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71631,13 +76977,13 @@ fn __action1708< { let __start0 = __0.2; let __end0 = __0.2; - let __temp0 = __action372( + let __temp0 = __action379( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1476( + __action1611( mode, __0, __temp0, @@ -71646,7 +76992,7 @@ fn __action1708< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1709< +fn __action1848< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71654,12 +77000,12 @@ fn __action1709< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action1702( + let __temp0 = __action1841( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1502( + __action1637( mode, __temp0, ) @@ -71667,7 +77013,7 @@ fn __action1709< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1710< +fn __action1849< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71676,12 +77022,12 @@ fn __action1710< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action1702( + let __temp0 = __action1841( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1503( + __action1638( mode, __temp0, __1, @@ -71690,7 +77036,7 @@ fn __action1710< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1711< +fn __action1850< >( mode: Mode, __0: (TextSize, ast::Expr, TextSize), @@ -71700,12 +77046,12 @@ fn __action1711< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action1702( + let __temp0 = __action1841( mode, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action1276( + __action1405( mode, __temp0, __1, @@ -71715,7 +77061,7 @@ fn __action1711< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1712< +fn __action1851< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71728,12 +77074,12 @@ fn __action1712< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1528( + __action1663( mode, __0, __1, @@ -71746,7 +77092,7 @@ fn __action1712< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1713< +fn __action1852< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71758,13 +77104,13 @@ fn __action1713< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1528( + __action1663( mode, __0, __1, @@ -71777,7 +77123,7 @@ fn __action1713< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1714< +fn __action1853< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -71791,12 +77137,12 @@ fn __action1714< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1529( + __action1664( mode, __0, __1, @@ -71810,7 +77156,7 @@ fn __action1714< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1715< +fn __action1854< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -71823,13 +77169,13 @@ fn __action1715< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1529( + __action1664( mode, __0, __1, @@ -71843,7 +77189,7 @@ fn __action1715< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1716< +fn __action1855< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71855,12 +77201,12 @@ fn __action1716< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1530( + __action1665( mode, __0, __1, @@ -71872,7 +77218,7 @@ fn __action1716< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1717< +fn __action1856< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71883,13 +77229,13 @@ fn __action1717< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1530( + __action1665( mode, __0, __1, @@ -71901,7 +77247,7 @@ fn __action1717< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1718< +fn __action1857< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -71914,12 +77260,12 @@ fn __action1718< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1531( + __action1666( mode, __0, __1, @@ -71932,7 +77278,7 @@ fn __action1718< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1719< +fn __action1858< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -71944,13 +77290,13 @@ fn __action1719< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1531( + __action1666( mode, __0, __1, @@ -71963,7 +77309,7 @@ fn __action1719< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1720< +fn __action1859< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -71979,12 +77325,12 @@ fn __action1720< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1532( + __action1667( mode, __0, __1, @@ -72000,7 +77346,7 @@ fn __action1720< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1721< +fn __action1860< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72015,13 +77361,13 @@ fn __action1721< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1532( + __action1667( mode, __0, __1, @@ -72037,7 +77383,7 @@ fn __action1721< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1722< +fn __action1861< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72054,12 +77400,12 @@ fn __action1722< { let __start0 = __4.0; let __end0 = __4.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __4, ); let __temp0 = (__start0, __temp0, __end0); - __action1533( + __action1668( mode, __0, __1, @@ -72076,7 +77422,7 @@ fn __action1722< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1723< +fn __action1862< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72092,13 +77438,13 @@ fn __action1723< { let __start0 = __3.2; let __end0 = __4.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1533( + __action1668( mode, __0, __1, @@ -72115,7 +77461,7 @@ fn __action1723< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1724< +fn __action1863< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72129,12 +77475,12 @@ fn __action1724< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1534( + __action1669( mode, __0, __1, @@ -72148,7 +77494,7 @@ fn __action1724< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1725< +fn __action1864< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72161,13 +77507,13 @@ fn __action1725< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1534( + __action1669( mode, __0, __1, @@ -72181,7 +77527,7 @@ fn __action1725< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1726< +fn __action1865< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72196,12 +77542,12 @@ fn __action1726< { let __start0 = __4.0; let __end0 = __4.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __4, ); let __temp0 = (__start0, __temp0, __end0); - __action1535( + __action1670( mode, __0, __1, @@ -72216,7 +77562,7 @@ fn __action1726< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1727< +fn __action1866< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72230,13 +77576,13 @@ fn __action1727< { let __start0 = __3.2; let __end0 = __4.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1535( + __action1670( mode, __0, __1, @@ -72251,7 +77597,7 @@ fn __action1727< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1728< +fn __action1867< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72266,12 +77612,12 @@ fn __action1728< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1536( + __action1671( mode, __0, __1, @@ -72286,7 +77632,7 @@ fn __action1728< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1729< +fn __action1868< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72300,13 +77646,13 @@ fn __action1729< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1536( + __action1671( mode, __0, __1, @@ -72321,7 +77667,7 @@ fn __action1729< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1730< +fn __action1869< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72337,12 +77683,12 @@ fn __action1730< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1537( + __action1672( mode, __0, __1, @@ -72358,7 +77704,7 @@ fn __action1730< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1731< +fn __action1870< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72373,13 +77719,13 @@ fn __action1731< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1537( + __action1672( mode, __0, __1, @@ -72395,7 +77741,7 @@ fn __action1731< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1732< +fn __action1871< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72408,12 +77754,12 @@ fn __action1732< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1538( + __action1673( mode, __0, __1, @@ -72426,7 +77772,7 @@ fn __action1732< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1733< +fn __action1872< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72438,13 +77784,13 @@ fn __action1733< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1538( + __action1673( mode, __0, __1, @@ -72457,7 +77803,7 @@ fn __action1733< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1734< +fn __action1873< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72471,12 +77817,12 @@ fn __action1734< { let __start0 = __3.0; let __end0 = __3.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __3, ); let __temp0 = (__start0, __temp0, __end0); - __action1539( + __action1674( mode, __0, __1, @@ -72490,7 +77836,7 @@ fn __action1734< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1735< +fn __action1874< >( mode: Mode, __0: (TextSize, alloc::vec::Vec, TextSize), @@ -72503,13 +77849,13 @@ fn __action1735< { let __start0 = __2.2; let __end0 = __3.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1539( + __action1674( mode, __0, __1, @@ -72523,7 +77869,7 @@ fn __action1735< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1736< +fn __action1875< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72535,12 +77881,12 @@ fn __action1736< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action284( + let __temp0 = __action286( mode, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action1457( + __action1591( mode, __0, __1, @@ -72552,7 +77898,7 @@ fn __action1736< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1737< +fn __action1876< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -72563,13 +77909,13 @@ fn __action1737< { let __start0 = __1.2; let __end0 = __2.0; - let __temp0 = __action285( + let __temp0 = __action287( mode, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1457( + __action1591( mode, __0, __1, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap index ba9adb4a07..4149f47aca 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap @@ -4,7 +4,7 @@ expression: parse_ast --- Module( ModModule { - range: 0..803, + range: 0..919, body: [ Expr( StmtExpr { @@ -346,6 +346,55 @@ Module( ), }, ), + LineMagic( + StmtLineMagic { + range: 828..832, + kind: Help, + value: "foo", + }, + ), + LineMagic( + StmtLineMagic { + range: 833..842, + kind: Help2, + value: "foo.bar", + }, + ), + LineMagic( + StmtLineMagic { + range: 843..855, + kind: Help, + value: "foo.bar.baz", + }, + ), + LineMagic( + StmtLineMagic { + range: 856..864, + kind: Help2, + value: "foo[0]", + }, + ), + LineMagic( + StmtLineMagic { + range: 865..875, + kind: Help, + value: "foo[0][1]", + }, + ), + LineMagic( + StmtLineMagic { + range: 876..895, + kind: Help2, + value: "foo.bar[0].baz[1]", + }, + ), + LineMagic( + StmtLineMagic { + range: 896..919, + kind: Help2, + value: "foo.bar[0].baz[2].egg", + }, + ), ], }, ) diff --git a/crates/ruff_python_parser/src/token.rs b/crates/ruff_python_parser/src/token.rs index 526081ac26..6a19cf1f37 100644 --- a/crates/ruff_python_parser/src/token.rs +++ b/crates/ruff_python_parser/src/token.rs @@ -64,6 +64,8 @@ pub enum Tok { /// Token value for a dedent. Dedent, EndOfFile, + /// Token value for a question mark `?`. This is only used in [`Mode::Jupyter`]. + Question, /// Token value for a left parenthesis `(`. Lpar, /// Token value for a right parenthesis `)`. @@ -240,6 +242,7 @@ impl fmt::Display for Tok { StartModule => f.write_str("StartProgram"), StartExpression => f.write_str("StartExpression"), EndOfFile => f.write_str("EOF"), + Question => f.write_str("'?'"), Lpar => f.write_str("'('"), Rpar => f.write_str("')'"), Lsqb => f.write_str("'['"), @@ -461,6 +464,8 @@ pub enum TokenKind { /// Token value for a dedent. Dedent, EndOfFile, + /// Token value for a question mark `?`. + Question, /// Token value for a left parenthesis `(`. Lpar, /// Token value for a right parenthesis `)`. @@ -783,6 +788,7 @@ impl TokenKind { Tok::Indent => TokenKind::Indent, Tok::Dedent => TokenKind::Dedent, Tok::EndOfFile => TokenKind::EndOfFile, + Tok::Question => TokenKind::Question, Tok::Lpar => TokenKind::Lpar, Tok::Rpar => TokenKind::Rpar, Tok::Lsqb => TokenKind::Lsqb, From a39dd76d95e575eb124dac81b16f11336ea62d57 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Wed, 9 Aug 2023 11:09:00 +0200 Subject: [PATCH 045/155] Add `enter` and `leave_node` methods to Preoder visitor (#6422) --- .../ruff_python_ast/src/visitor/preorder.rs | 1278 +++++++++-------- .../src/comments/visitor.rs | 203 +-- 2 files changed, 725 insertions(+), 756 deletions(-) diff --git a/crates/ruff_python_ast/src/visitor/preorder.rs b/crates/ruff_python_ast/src/visitor/preorder.rs index 6d3c5334da..1e18bf2544 100644 --- a/crates/ruff_python_ast/src/visitor/preorder.rs +++ b/crates/ruff_python_ast/src/visitor/preorder.rs @@ -1,3 +1,4 @@ +use crate::node::AnyNodeRef; use crate::{ self as ast, Alias, Arguments, BoolOp, CmpOp, Comprehension, Constant, Decorator, ElifElseClause, ExceptHandler, Expr, Keyword, MatchCase, Mod, Operator, Parameter, @@ -7,64 +8,89 @@ use crate::{ /// Visitor that traverses all nodes recursively in pre-order. pub trait PreorderVisitor<'a> { + #[allow(clippy::inline_always)] + #[inline(always)] + fn enter_node(&mut self, _node: AnyNodeRef<'a>) -> TraversalSignal { + TraversalSignal::Traverse + } + + #[inline(always)] + fn leave_node(&mut self, _node: AnyNodeRef<'a>) {} + + #[inline] fn visit_mod(&mut self, module: &'a Mod) { walk_module(self, module); } + #[inline] fn visit_stmt(&mut self, stmt: &'a Stmt) { walk_stmt(self, stmt); } + #[inline] fn visit_annotation(&mut self, expr: &'a Expr) { walk_annotation(self, expr); } + #[inline] fn visit_expr(&mut self, expr: &'a Expr) { walk_expr(self, expr); } + #[inline] fn visit_decorator(&mut self, decorator: &'a Decorator) { walk_decorator(self, decorator); } + #[inline] fn visit_constant(&mut self, _constant: &'a Constant) {} + #[inline] fn visit_bool_op(&mut self, bool_op: &'a BoolOp) { walk_bool_op(self, bool_op); } + #[inline] fn visit_operator(&mut self, operator: &'a Operator) { walk_operator(self, operator); } + #[inline] fn visit_unary_op(&mut self, unary_op: &'a UnaryOp) { walk_unary_op(self, unary_op); } + #[inline] fn visit_cmp_op(&mut self, cmp_op: &'a CmpOp) { walk_cmp_op(self, cmp_op); } + #[inline] fn visit_comprehension(&mut self, comprehension: &'a Comprehension) { walk_comprehension(self, comprehension); } + #[inline] fn visit_except_handler(&mut self, except_handler: &'a ExceptHandler) { walk_except_handler(self, except_handler); } + #[inline] fn visit_format_spec(&mut self, format_spec: &'a Expr) { walk_format_spec(self, format_spec); } + #[inline] fn visit_arguments(&mut self, arguments: &'a Arguments) { walk_arguments(self, arguments); } + #[inline] fn visit_parameters(&mut self, parameters: &'a Parameters) { walk_parameters(self, parameters); } + #[inline] fn visit_parameter(&mut self, arg: &'a Parameter) { walk_parameter(self, arg); } @@ -73,38 +99,47 @@ pub trait PreorderVisitor<'a> { walk_parameter_with_default(self, parameter_with_default); } + #[inline] fn visit_keyword(&mut self, keyword: &'a Keyword) { walk_keyword(self, keyword); } + #[inline] fn visit_alias(&mut self, alias: &'a Alias) { walk_alias(self, alias); } + #[inline] fn visit_with_item(&mut self, with_item: &'a WithItem) { walk_with_item(self, with_item); } + #[inline] fn visit_type_params(&mut self, type_params: &'a TypeParams) { walk_type_params(self, type_params); } + #[inline] fn visit_type_param(&mut self, type_param: &'a TypeParam) { walk_type_param(self, type_param); } + #[inline] fn visit_match_case(&mut self, match_case: &'a MatchCase) { walk_match_case(self, match_case); } + #[inline] fn visit_pattern(&mut self, pattern: &'a Pattern) { walk_pattern(self, pattern); } + #[inline] fn visit_body(&mut self, body: &'a [Stmt]) { walk_body(self, body); } + #[inline] fn visit_elif_else_clause(&mut self, elif_else_clause: &'a ElifElseClause) { walk_elif_else_clause(self, elif_else_clause); } @@ -114,12 +149,17 @@ pub fn walk_module<'a, V>(visitor: &mut V, module: &'a Mod) where V: PreorderVisitor<'a> + ?Sized, { - match module { - Mod::Module(ast::ModModule { body, range: _ }) => { - visitor.visit_body(body); + let node = AnyNodeRef::from(module); + if visitor.enter_node(node).is_traverse() { + match module { + Mod::Module(ast::ModModule { body, range: _ }) => { + visitor.visit_body(body); + } + Mod::Expression(ast::ModExpression { body, range: _ }) => visitor.visit_expr(body), } - Mod::Expression(ast::ModExpression { body, range: _ }) => visitor.visit_expr(body), } + + visitor.leave_node(node); } pub fn walk_body<'a, V>(visitor: &mut V, body: &'a [Stmt]) @@ -135,613 +175,680 @@ pub fn walk_stmt<'a, V>(visitor: &mut V, stmt: &'a Stmt) where V: PreorderVisitor<'a> + ?Sized, { - match stmt { - Stmt::Expr(ast::StmtExpr { value, range: _ }) => visitor.visit_expr(value), + let node = AnyNodeRef::from(stmt); - Stmt::FunctionDef(ast::StmtFunctionDef { - parameters, - body, - decorator_list, - returns, - type_params, - .. - }) => { - for decorator in decorator_list { - visitor.visit_decorator(decorator); + if visitor.enter_node(node).is_traverse() { + match stmt { + Stmt::Expr(ast::StmtExpr { value, range: _ }) => visitor.visit_expr(value), + + Stmt::FunctionDef(ast::StmtFunctionDef { + parameters, + body, + decorator_list, + returns, + type_params, + .. + }) => { + for decorator in decorator_list { + visitor.visit_decorator(decorator); + } + + if let Some(type_params) = type_params { + visitor.visit_type_params(type_params); + } + + visitor.visit_parameters(parameters); + + for expr in returns { + visitor.visit_annotation(expr); + } + + visitor.visit_body(body); } - if let Some(type_params) = type_params { - visitor.visit_type_params(type_params); + Stmt::ClassDef(ast::StmtClassDef { + arguments, + body, + decorator_list, + type_params, + .. + }) => { + for decorator in decorator_list { + visitor.visit_decorator(decorator); + } + + if let Some(type_params) = type_params { + visitor.visit_type_params(type_params); + } + + if let Some(arguments) = arguments { + visitor.visit_arguments(arguments); + } + + visitor.visit_body(body); } - visitor.visit_parameters(parameters); - - for expr in returns { - visitor.visit_annotation(expr); + Stmt::Return(ast::StmtReturn { value, range: _ }) => { + if let Some(expr) = value { + visitor.visit_expr(expr); + } } - visitor.visit_body(body); - } - - Stmt::ClassDef(ast::StmtClassDef { - arguments, - body, - decorator_list, - type_params, - .. - }) => { - for decorator in decorator_list { - visitor.visit_decorator(decorator); + Stmt::Delete(ast::StmtDelete { targets, range: _ }) => { + for expr in targets { + visitor.visit_expr(expr); + } } - if let Some(type_params) = type_params { - visitor.visit_type_params(type_params); + Stmt::TypeAlias(ast::StmtTypeAlias { + range: _, + name, + type_params, + value, + }) => { + visitor.visit_expr(name); + if let Some(type_params) = type_params { + visitor.visit_type_params(type_params); + } + visitor.visit_expr(value); } - if let Some(arguments) = arguments { - visitor.visit_arguments(arguments); + Stmt::Assign(ast::StmtAssign { + targets, + value, + range: _, + }) => { + for expr in targets { + visitor.visit_expr(expr); + } + + visitor.visit_expr(value); } - visitor.visit_body(body); - } - - Stmt::Return(ast::StmtReturn { value, range: _ }) => { - if let Some(expr) = value { - visitor.visit_expr(expr); - } - } - - Stmt::Delete(ast::StmtDelete { targets, range: _ }) => { - for expr in targets { - visitor.visit_expr(expr); - } - } - - Stmt::TypeAlias(ast::StmtTypeAlias { - range: _, - name, - type_params, - value, - }) => { - visitor.visit_expr(name); - if let Some(type_params) = type_params { - visitor.visit_type_params(type_params); - } - visitor.visit_expr(value); - } - - Stmt::Assign(ast::StmtAssign { - targets, - value, - range: _, - }) => { - for expr in targets { - visitor.visit_expr(expr); + Stmt::AugAssign(ast::StmtAugAssign { + target, + op, + value, + range: _, + }) => { + visitor.visit_expr(target); + visitor.visit_operator(op); + visitor.visit_expr(value); } - visitor.visit_expr(value); - } - - Stmt::AugAssign(ast::StmtAugAssign { - target, - op, - value, - range: _, - }) => { - visitor.visit_expr(target); - visitor.visit_operator(op); - visitor.visit_expr(value); - } - - Stmt::AnnAssign(ast::StmtAnnAssign { - target, - annotation, - value, - range: _, - simple: _, - }) => { - visitor.visit_expr(target); - visitor.visit_annotation(annotation); - if let Some(expr) = value { - visitor.visit_expr(expr); + Stmt::AnnAssign(ast::StmtAnnAssign { + target, + annotation, + value, + range: _, + simple: _, + }) => { + visitor.visit_expr(target); + visitor.visit_annotation(annotation); + if let Some(expr) = value { + visitor.visit_expr(expr); + } } - } - Stmt::For(ast::StmtFor { - target, - iter, - body, - orelse, - .. - }) => { - visitor.visit_expr(target); - visitor.visit_expr(iter); - visitor.visit_body(body); - visitor.visit_body(orelse); - } - - Stmt::While(ast::StmtWhile { - test, - body, - orelse, - range: _, - }) => { - visitor.visit_expr(test); - visitor.visit_body(body); - visitor.visit_body(orelse); - } - - Stmt::If(ast::StmtIf { - test, - body, - elif_else_clauses, - range: _, - }) => { - visitor.visit_expr(test); - visitor.visit_body(body); - for clause in elif_else_clauses { - visitor.visit_elif_else_clause(clause); + Stmt::For(ast::StmtFor { + target, + iter, + body, + orelse, + .. + }) => { + visitor.visit_expr(target); + visitor.visit_expr(iter); + visitor.visit_body(body); + visitor.visit_body(orelse); } - } - Stmt::With(ast::StmtWith { - items, - body, - is_async: _, - range: _, - }) => { - for with_item in items { - visitor.visit_with_item(with_item); + Stmt::While(ast::StmtWhile { + test, + body, + orelse, + range: _, + }) => { + visitor.visit_expr(test); + visitor.visit_body(body); + visitor.visit_body(orelse); } - visitor.visit_body(body); - } - Stmt::Match(ast::StmtMatch { - subject, - cases, - range: _, - }) => { - visitor.visit_expr(subject); - for match_case in cases { - visitor.visit_match_case(match_case); + Stmt::If(ast::StmtIf { + test, + body, + elif_else_clauses, + range: _, + }) => { + visitor.visit_expr(test); + visitor.visit_body(body); + for clause in elif_else_clauses { + visitor.visit_elif_else_clause(clause); + } } - } - Stmt::Raise(ast::StmtRaise { - exc, - cause, - range: _, - }) => { - if let Some(expr) = exc { - visitor.visit_expr(expr); - }; - if let Some(expr) = cause { - visitor.visit_expr(expr); - }; - } - - Stmt::Try(ast::StmtTry { - body, - handlers, - orelse, - finalbody, - range: _, - }) - | Stmt::TryStar(ast::StmtTryStar { - body, - handlers, - orelse, - finalbody, - range: _, - }) => { - visitor.visit_body(body); - for except_handler in handlers { - visitor.visit_except_handler(except_handler); + Stmt::With(ast::StmtWith { + items, + body, + is_async: _, + range: _, + }) => { + for with_item in items { + visitor.visit_with_item(with_item); + } + visitor.visit_body(body); } - visitor.visit_body(orelse); - visitor.visit_body(finalbody); - } - Stmt::Assert(ast::StmtAssert { - test, - msg, - range: _, - }) => { - visitor.visit_expr(test); - if let Some(expr) = msg { - visitor.visit_expr(expr); + Stmt::Match(ast::StmtMatch { + subject, + cases, + range: _, + }) => { + visitor.visit_expr(subject); + for match_case in cases { + visitor.visit_match_case(match_case); + } } - } - Stmt::Import(ast::StmtImport { names, range: _ }) => { - for alias in names { - visitor.visit_alias(alias); + Stmt::Raise(ast::StmtRaise { + exc, + cause, + range: _, + }) => { + if let Some(expr) = exc { + visitor.visit_expr(expr); + }; + if let Some(expr) = cause { + visitor.visit_expr(expr); + }; } - } - Stmt::ImportFrom(ast::StmtImportFrom { - range: _, - module: _, - names, - level: _, - }) => { - for alias in names { - visitor.visit_alias(alias); + Stmt::Try(ast::StmtTry { + body, + handlers, + orelse, + finalbody, + range: _, + }) + | Stmt::TryStar(ast::StmtTryStar { + body, + handlers, + orelse, + finalbody, + range: _, + }) => { + visitor.visit_body(body); + for except_handler in handlers { + visitor.visit_except_handler(except_handler); + } + visitor.visit_body(orelse); + visitor.visit_body(finalbody); } - } - Stmt::Pass(_) - | Stmt::Break(_) - | Stmt::Continue(_) - | Stmt::Global(_) - | Stmt::Nonlocal(_) - | Stmt::LineMagic(_) => {} + Stmt::Assert(ast::StmtAssert { + test, + msg, + range: _, + }) => { + visitor.visit_expr(test); + if let Some(expr) = msg { + visitor.visit_expr(expr); + } + } + + Stmt::Import(ast::StmtImport { names, range: _ }) => { + for alias in names { + visitor.visit_alias(alias); + } + } + + Stmt::ImportFrom(ast::StmtImportFrom { + range: _, + module: _, + names, + level: _, + }) => { + for alias in names { + visitor.visit_alias(alias); + } + } + + Stmt::Pass(_) + | Stmt::Break(_) + | Stmt::Continue(_) + | Stmt::Global(_) + | Stmt::Nonlocal(_) + | Stmt::LineMagic(_) => {} + } + } + + visitor.leave_node(node); +} + +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +pub enum TraversalSignal { + Traverse, + Skip, +} + +impl TraversalSignal { + const fn is_traverse(self) -> bool { + matches!(self, TraversalSignal::Traverse) } } pub fn walk_annotation<'a, V: PreorderVisitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) { - visitor.visit_expr(expr); + let node = AnyNodeRef::from(expr); + if visitor.enter_node(node).is_traverse() { + visitor.visit_expr(expr); + } + + visitor.leave_node(node); } pub fn walk_decorator<'a, V>(visitor: &mut V, decorator: &'a Decorator) where V: PreorderVisitor<'a> + ?Sized, { - visitor.visit_expr(&decorator.expression); + let node = AnyNodeRef::from(decorator); + if visitor.enter_node(node).is_traverse() { + visitor.visit_expr(&decorator.expression); + } + + visitor.leave_node(node); } pub fn walk_expr<'a, V>(visitor: &mut V, expr: &'a Expr) where V: PreorderVisitor<'a> + ?Sized, { - match expr { - Expr::BoolOp(ast::ExprBoolOp { - op, - values, - range: _, - }) => match values.as_slice() { - [left, rest @ ..] => { + let node = AnyNodeRef::from(expr); + if visitor.enter_node(node).is_traverse() { + match expr { + Expr::BoolOp(ast::ExprBoolOp { + op, + values, + range: _, + }) => match values.as_slice() { + [left, rest @ ..] => { + visitor.visit_expr(left); + visitor.visit_bool_op(op); + for expr in rest { + visitor.visit_expr(expr); + } + } + [] => { + visitor.visit_bool_op(op); + } + }, + + Expr::NamedExpr(ast::ExprNamedExpr { + target, + value, + range: _, + }) => { + visitor.visit_expr(target); + visitor.visit_expr(value); + } + + Expr::BinOp(ast::ExprBinOp { + left, + op, + right, + range: _, + }) => { visitor.visit_expr(left); - visitor.visit_bool_op(op); - for expr in rest { + visitor.visit_operator(op); + visitor.visit_expr(right); + } + + Expr::UnaryOp(ast::ExprUnaryOp { + op, + operand, + range: _, + }) => { + visitor.visit_unary_op(op); + visitor.visit_expr(operand); + } + + Expr::Lambda(ast::ExprLambda { + parameters, + body, + range: _, + }) => { + visitor.visit_parameters(parameters); + visitor.visit_expr(body); + } + + Expr::IfExp(ast::ExprIfExp { + test, + body, + orelse, + range: _, + }) => { + // `body if test else orelse` + visitor.visit_expr(body); + visitor.visit_expr(test); + visitor.visit_expr(orelse); + } + + Expr::Dict(ast::ExprDict { + keys, + values, + range: _, + }) => { + for (key, value) in keys.iter().zip(values) { + if let Some(key) = key { + visitor.visit_expr(key); + } + visitor.visit_expr(value); + } + } + + Expr::Set(ast::ExprSet { elts, range: _ }) => { + for expr in elts { visitor.visit_expr(expr); } } - [] => { - visitor.visit_bool_op(op); - } - }, - Expr::NamedExpr(ast::ExprNamedExpr { - target, - value, - range: _, - }) => { - visitor.visit_expr(target); - visitor.visit_expr(value); - } - - Expr::BinOp(ast::ExprBinOp { - left, - op, - right, - range: _, - }) => { - visitor.visit_expr(left); - visitor.visit_operator(op); - visitor.visit_expr(right); - } - - Expr::UnaryOp(ast::ExprUnaryOp { - op, - operand, - range: _, - }) => { - visitor.visit_unary_op(op); - visitor.visit_expr(operand); - } - - Expr::Lambda(ast::ExprLambda { - parameters, - body, - range: _, - }) => { - visitor.visit_parameters(parameters); - visitor.visit_expr(body); - } - - Expr::IfExp(ast::ExprIfExp { - test, - body, - orelse, - range: _, - }) => { - // `body if test else orelse` - visitor.visit_expr(body); - visitor.visit_expr(test); - visitor.visit_expr(orelse); - } - - Expr::Dict(ast::ExprDict { - keys, - values, - range: _, - }) => { - for (key, value) in keys.iter().zip(values) { - if let Some(key) = key { - visitor.visit_expr(key); + Expr::ListComp(ast::ExprListComp { + elt, + generators, + range: _, + }) => { + visitor.visit_expr(elt); + for comprehension in generators { + visitor.visit_comprehension(comprehension); } + } + + Expr::SetComp(ast::ExprSetComp { + elt, + generators, + range: _, + }) => { + visitor.visit_expr(elt); + for comprehension in generators { + visitor.visit_comprehension(comprehension); + } + } + + Expr::DictComp(ast::ExprDictComp { + key, + value, + generators, + range: _, + }) => { + visitor.visit_expr(key); + visitor.visit_expr(value); + + for comprehension in generators { + visitor.visit_comprehension(comprehension); + } + } + + Expr::GeneratorExp(ast::ExprGeneratorExp { + elt, + generators, + range: _, + }) => { + visitor.visit_expr(elt); + for comprehension in generators { + visitor.visit_comprehension(comprehension); + } + } + + Expr::Await(ast::ExprAwait { value, range: _ }) + | Expr::YieldFrom(ast::ExprYieldFrom { value, range: _ }) => visitor.visit_expr(value), + + Expr::Yield(ast::ExprYield { value, range: _ }) => { + if let Some(expr) = value { + visitor.visit_expr(expr); + } + } + + Expr::Compare(ast::ExprCompare { + left, + ops, + comparators, + range: _, + }) => { + visitor.visit_expr(left); + + for (op, comparator) in ops.iter().zip(comparators) { + visitor.visit_cmp_op(op); + visitor.visit_expr(comparator); + } + } + + Expr::Call(ast::ExprCall { + func, + arguments, + range: _, + }) => { + visitor.visit_expr(func); + visitor.visit_arguments(arguments); + } + + Expr::FormattedValue(ast::ExprFormattedValue { + value, format_spec, .. + }) => { + visitor.visit_expr(value); + + if let Some(expr) = format_spec { + visitor.visit_format_spec(expr); + } + } + + Expr::FString(ast::ExprFString { values, range: _ }) => { + for expr in values { + visitor.visit_expr(expr); + } + } + + Expr::Constant(ast::ExprConstant { + value, + range: _, + kind: _, + }) => visitor.visit_constant(value), + + Expr::Attribute(ast::ExprAttribute { + value, + attr: _, + ctx: _, + range: _, + }) => { visitor.visit_expr(value); } - } - Expr::Set(ast::ExprSet { elts, range: _ }) => { - for expr in elts { - visitor.visit_expr(expr); + Expr::Subscript(ast::ExprSubscript { + value, + slice, + ctx: _, + range: _, + }) => { + visitor.visit_expr(value); + visitor.visit_expr(slice); } - } - - Expr::ListComp(ast::ExprListComp { - elt, - generators, - range: _, - }) => { - visitor.visit_expr(elt); - for comprehension in generators { - visitor.visit_comprehension(comprehension); + Expr::Starred(ast::ExprStarred { + value, + ctx: _, + range: _, + }) => { + visitor.visit_expr(value); } - } - Expr::SetComp(ast::ExprSetComp { - elt, - generators, - range: _, - }) => { - visitor.visit_expr(elt); - for comprehension in generators { - visitor.visit_comprehension(comprehension); + Expr::Name(ast::ExprName { + id: _, + ctx: _, + range: _, + }) => {} + + Expr::List(ast::ExprList { + elts, + ctx: _, + range: _, + }) => { + for expr in elts { + visitor.visit_expr(expr); + } } - } - - Expr::DictComp(ast::ExprDictComp { - key, - value, - generators, - range: _, - }) => { - visitor.visit_expr(key); - visitor.visit_expr(value); - - for comprehension in generators { - visitor.visit_comprehension(comprehension); + Expr::Tuple(ast::ExprTuple { + elts, + ctx: _, + range: _, + }) => { + for expr in elts { + visitor.visit_expr(expr); + } } - } - Expr::GeneratorExp(ast::ExprGeneratorExp { - elt, - generators, - range: _, - }) => { - visitor.visit_expr(elt); - for comprehension in generators { - visitor.visit_comprehension(comprehension); + Expr::Slice(ast::ExprSlice { + lower, + upper, + step, + range: _, + }) => { + if let Some(expr) = lower { + visitor.visit_expr(expr); + } + if let Some(expr) = upper { + visitor.visit_expr(expr); + } + if let Some(expr) = step { + visitor.visit_expr(expr); + } } + Expr::LineMagic(_) => (), } - - Expr::Await(ast::ExprAwait { value, range: _ }) - | Expr::YieldFrom(ast::ExprYieldFrom { value, range: _ }) => visitor.visit_expr(value), - - Expr::Yield(ast::ExprYield { value, range: _ }) => { - if let Some(expr) = value { - visitor.visit_expr(expr); - } - } - - Expr::Compare(ast::ExprCompare { - left, - ops, - comparators, - range: _, - }) => { - visitor.visit_expr(left); - - for (op, comparator) in ops.iter().zip(comparators) { - visitor.visit_cmp_op(op); - visitor.visit_expr(comparator); - } - } - - Expr::Call(ast::ExprCall { - func, - arguments, - range: _, - }) => { - visitor.visit_expr(func); - visitor.visit_arguments(arguments); - } - - Expr::FormattedValue(ast::ExprFormattedValue { - value, format_spec, .. - }) => { - visitor.visit_expr(value); - - if let Some(expr) = format_spec { - visitor.visit_format_spec(expr); - } - } - - Expr::FString(ast::ExprFString { values, range: _ }) => { - for expr in values { - visitor.visit_expr(expr); - } - } - - Expr::Constant(ast::ExprConstant { - value, - range: _, - kind: _, - }) => visitor.visit_constant(value), - - Expr::Attribute(ast::ExprAttribute { - value, - attr: _, - ctx: _, - range: _, - }) => { - visitor.visit_expr(value); - } - - Expr::Subscript(ast::ExprSubscript { - value, - slice, - ctx: _, - range: _, - }) => { - visitor.visit_expr(value); - visitor.visit_expr(slice); - } - Expr::Starred(ast::ExprStarred { - value, - ctx: _, - range: _, - }) => { - visitor.visit_expr(value); - } - - Expr::Name(ast::ExprName { - id: _, - ctx: _, - range: _, - }) => {} - - Expr::List(ast::ExprList { - elts, - ctx: _, - range: _, - }) => { - for expr in elts { - visitor.visit_expr(expr); - } - } - Expr::Tuple(ast::ExprTuple { - elts, - ctx: _, - range: _, - }) => { - for expr in elts { - visitor.visit_expr(expr); - } - } - - Expr::Slice(ast::ExprSlice { - lower, - upper, - step, - range: _, - }) => { - if let Some(expr) = lower { - visitor.visit_expr(expr); - } - if let Some(expr) = upper { - visitor.visit_expr(expr); - } - if let Some(expr) = step { - visitor.visit_expr(expr); - } - } - Expr::LineMagic(_) => (), } + + visitor.leave_node(node); } pub fn walk_comprehension<'a, V>(visitor: &mut V, comprehension: &'a Comprehension) where V: PreorderVisitor<'a> + ?Sized, { - visitor.visit_expr(&comprehension.target); - visitor.visit_expr(&comprehension.iter); + let node = AnyNodeRef::from(comprehension); + if visitor.enter_node(node).is_traverse() { + visitor.visit_expr(&comprehension.target); + visitor.visit_expr(&comprehension.iter); - for expr in &comprehension.ifs { - visitor.visit_expr(expr); + for expr in &comprehension.ifs { + visitor.visit_expr(expr); + } } + + visitor.leave_node(node); } pub fn walk_elif_else_clause<'a, V>(visitor: &mut V, elif_else_clause: &'a ElifElseClause) where V: PreorderVisitor<'a> + ?Sized, { - if let Some(test) = &elif_else_clause.test { - visitor.visit_expr(test); + let node = AnyNodeRef::from(elif_else_clause); + if visitor.enter_node(node).is_traverse() { + if let Some(test) = &elif_else_clause.test { + visitor.visit_expr(test); + } + visitor.visit_body(&elif_else_clause.body); } - visitor.visit_body(&elif_else_clause.body); + + visitor.leave_node(node); } pub fn walk_except_handler<'a, V>(visitor: &mut V, except_handler: &'a ExceptHandler) where V: PreorderVisitor<'a> + ?Sized, { - match except_handler { - ExceptHandler::ExceptHandler(ast::ExceptHandlerExceptHandler { - range: _, - type_, - name: _, - body, - }) => { - if let Some(expr) = type_ { - visitor.visit_expr(expr); + let node = AnyNodeRef::from(except_handler); + if visitor.enter_node(node).is_traverse() { + match except_handler { + ExceptHandler::ExceptHandler(ast::ExceptHandlerExceptHandler { + range: _, + type_, + name: _, + body, + }) => { + if let Some(expr) = type_ { + visitor.visit_expr(expr); + } + visitor.visit_body(body); } - visitor.visit_body(body); } } + visitor.leave_node(node); } pub fn walk_format_spec<'a, V: PreorderVisitor<'a> + ?Sized>( visitor: &mut V, format_spec: &'a Expr, ) { - visitor.visit_expr(format_spec); + let node = AnyNodeRef::from(format_spec); + if visitor.enter_node(node).is_traverse() { + visitor.visit_expr(format_spec); + } + + visitor.leave_node(node); } pub fn walk_arguments<'a, V>(visitor: &mut V, arguments: &'a Arguments) where V: PreorderVisitor<'a> + ?Sized, { - for arg in &arguments.args { - visitor.visit_expr(arg); + let node = AnyNodeRef::from(arguments); + if visitor.enter_node(node).is_traverse() { + for arg in &arguments.args { + visitor.visit_expr(arg); + } + + for keyword in &arguments.keywords { + visitor.visit_keyword(keyword); + } } - for keyword in &arguments.keywords { - visitor.visit_keyword(keyword); - } + visitor.leave_node(node); } pub fn walk_parameters<'a, V>(visitor: &mut V, parameters: &'a Parameters) where V: PreorderVisitor<'a> + ?Sized, { - for arg in parameters.posonlyargs.iter().chain(¶meters.args) { - visitor.visit_parameter_with_default(arg); + let node = AnyNodeRef::from(parameters); + if visitor.enter_node(node).is_traverse() { + for arg in parameters.posonlyargs.iter().chain(¶meters.args) { + visitor.visit_parameter_with_default(arg); + } + + if let Some(arg) = ¶meters.vararg { + visitor.visit_parameter(arg); + } + + for arg in ¶meters.kwonlyargs { + visitor.visit_parameter_with_default(arg); + } + + if let Some(arg) = ¶meters.kwarg { + visitor.visit_parameter(arg); + } } - if let Some(arg) = ¶meters.vararg { - visitor.visit_parameter(arg); - } - - for arg in ¶meters.kwonlyargs { - visitor.visit_parameter_with_default(arg); - } - - if let Some(arg) = ¶meters.kwarg { - visitor.visit_parameter(arg); - } + visitor.leave_node(node); } pub fn walk_parameter<'a, V>(visitor: &mut V, parameter: &'a Parameter) where V: PreorderVisitor<'a> + ?Sized, { - if let Some(expr) = ¶meter.annotation { - visitor.visit_annotation(expr); + let node = AnyNodeRef::from(parameter); + + if visitor.enter_node(node).is_traverse() { + if let Some(expr) = ¶meter.annotation { + visitor.visit_annotation(expr); + } } + visitor.leave_node(node); } pub fn walk_parameter_with_default<'a, V>( @@ -750,10 +857,15 @@ pub fn walk_parameter_with_default<'a, V>( ) where V: PreorderVisitor<'a> + ?Sized, { - visitor.visit_parameter(¶meter_with_default.parameter); - if let Some(expr) = ¶meter_with_default.default { - visitor.visit_expr(expr); + let node = AnyNodeRef::from(parameter_with_default); + if visitor.enter_node(node).is_traverse() { + visitor.visit_parameter(¶meter_with_default.parameter); + if let Some(expr) = ¶meter_with_default.default { + visitor.visit_expr(expr); + } } + + visitor.leave_node(node); } #[inline] @@ -761,124 +873,149 @@ pub fn walk_keyword<'a, V>(visitor: &mut V, keyword: &'a Keyword) where V: PreorderVisitor<'a> + ?Sized, { - visitor.visit_expr(&keyword.value); + let node = AnyNodeRef::from(keyword); + + if visitor.enter_node(node).is_traverse() { + visitor.visit_expr(&keyword.value); + } + visitor.leave_node(node); } pub fn walk_with_item<'a, V>(visitor: &mut V, with_item: &'a WithItem) where V: PreorderVisitor<'a> + ?Sized, { - visitor.visit_expr(&with_item.context_expr); + let node = AnyNodeRef::from(with_item); + if visitor.enter_node(node).is_traverse() { + visitor.visit_expr(&with_item.context_expr); - if let Some(expr) = &with_item.optional_vars { - visitor.visit_expr(expr); + if let Some(expr) = &with_item.optional_vars { + visitor.visit_expr(expr); + } } + visitor.leave_node(node); } pub fn walk_type_params<'a, V>(visitor: &mut V, type_params: &'a TypeParams) where V: PreorderVisitor<'a> + ?Sized, { - for type_param in &type_params.type_params { - visitor.visit_type_param(type_param); + let node = AnyNodeRef::from(type_params); + if visitor.enter_node(node).is_traverse() { + for type_param in &type_params.type_params { + visitor.visit_type_param(type_param); + } } + visitor.leave_node(node); } pub fn walk_type_param<'a, V>(visitor: &mut V, type_param: &'a TypeParam) where V: PreorderVisitor<'a> + ?Sized, { - match type_param { - TypeParam::TypeVar(TypeParamTypeVar { - bound, - name: _, - range: _, - }) => { - if let Some(expr) = bound { - visitor.visit_expr(expr); + let node = AnyNodeRef::from(type_param); + if visitor.enter_node(node).is_traverse() { + match type_param { + TypeParam::TypeVar(TypeParamTypeVar { + bound, + name: _, + range: _, + }) => { + if let Some(expr) = bound { + visitor.visit_expr(expr); + } } + TypeParam::TypeVarTuple(_) | TypeParam::ParamSpec(_) => {} } - TypeParam::TypeVarTuple(_) | TypeParam::ParamSpec(_) => {} } + visitor.leave_node(node); } pub fn walk_match_case<'a, V>(visitor: &mut V, match_case: &'a MatchCase) where V: PreorderVisitor<'a> + ?Sized, { - visitor.visit_pattern(&match_case.pattern); - if let Some(expr) = &match_case.guard { - visitor.visit_expr(expr); + let node = AnyNodeRef::from(match_case); + if visitor.enter_node(node).is_traverse() { + visitor.visit_pattern(&match_case.pattern); + if let Some(expr) = &match_case.guard { + visitor.visit_expr(expr); + } + visitor.visit_body(&match_case.body); } - visitor.visit_body(&match_case.body); + visitor.leave_node(node); } pub fn walk_pattern<'a, V>(visitor: &mut V, pattern: &'a Pattern) where V: PreorderVisitor<'a> + ?Sized, { - match pattern { - Pattern::MatchValue(ast::PatternMatchValue { value, range: _ }) => { - visitor.visit_expr(value); - } - - Pattern::MatchSingleton(ast::PatternMatchSingleton { value, range: _ }) => { - visitor.visit_constant(value); - } - - Pattern::MatchSequence(ast::PatternMatchSequence { patterns, range: _ }) => { - for pattern in patterns { - visitor.visit_pattern(pattern); - } - } - - Pattern::MatchMapping(ast::PatternMatchMapping { - keys, - patterns, - range: _, - rest: _, - }) => { - for (key, pattern) in keys.iter().zip(patterns) { - visitor.visit_expr(key); - visitor.visit_pattern(pattern); - } - } - - Pattern::MatchClass(ast::PatternMatchClass { - cls, - patterns, - kwd_attrs: _, - kwd_patterns, - range: _, - }) => { - visitor.visit_expr(cls); - for pattern in patterns { - visitor.visit_pattern(pattern); + let node = AnyNodeRef::from(pattern); + if visitor.enter_node(node).is_traverse() { + match pattern { + Pattern::MatchValue(ast::PatternMatchValue { value, range: _ }) => { + visitor.visit_expr(value); } - for pattern in kwd_patterns { - visitor.visit_pattern(pattern); + Pattern::MatchSingleton(ast::PatternMatchSingleton { value, range: _ }) => { + visitor.visit_constant(value); } - } - Pattern::MatchStar(_) => {} - - Pattern::MatchAs(ast::PatternMatchAs { - pattern, - range: _, - name: _, - }) => { - if let Some(pattern) = pattern { - visitor.visit_pattern(pattern); + Pattern::MatchSequence(ast::PatternMatchSequence { patterns, range: _ }) => { + for pattern in patterns { + visitor.visit_pattern(pattern); + } } - } - Pattern::MatchOr(ast::PatternMatchOr { patterns, range: _ }) => { - for pattern in patterns { - visitor.visit_pattern(pattern); + Pattern::MatchMapping(ast::PatternMatchMapping { + keys, + patterns, + range: _, + rest: _, + }) => { + for (key, pattern) in keys.iter().zip(patterns) { + visitor.visit_expr(key); + visitor.visit_pattern(pattern); + } + } + + Pattern::MatchClass(ast::PatternMatchClass { + cls, + patterns, + kwd_attrs: _, + kwd_patterns, + range: _, + }) => { + visitor.visit_expr(cls); + for pattern in patterns { + visitor.visit_pattern(pattern); + } + + for pattern in kwd_patterns { + visitor.visit_pattern(pattern); + } + } + + Pattern::MatchStar(_) => {} + + Pattern::MatchAs(ast::PatternMatchAs { + pattern, + range: _, + name: _, + }) => { + if let Some(pattern) = pattern { + visitor.visit_pattern(pattern); + } + } + + Pattern::MatchOr(ast::PatternMatchOr { patterns, range: _ }) => { + for pattern in patterns { + visitor.visit_pattern(pattern); + } } } } + visitor.leave_node(node); } pub fn walk_bool_op<'a, V>(_visitor: &mut V, _bool_op: &'a BoolOp) @@ -909,8 +1046,11 @@ where } #[inline] -pub fn walk_alias<'a, V>(_visitor: &mut V, _alias: &'a Alias) +pub fn walk_alias<'a, V>(visitor: &mut V, alias: &'a Alias) where V: PreorderVisitor<'a> + ?Sized, { + let node = AnyNodeRef::from(alias); + visitor.enter_node(node); + visitor.leave_node(node); } diff --git a/crates/ruff_python_formatter/src/comments/visitor.rs b/crates/ruff_python_formatter/src/comments/visitor.rs index 0b18ea76d4..a70b62d0fd 100644 --- a/crates/ruff_python_formatter/src/comments/visitor.rs +++ b/crates/ruff_python_formatter/src/comments/visitor.rs @@ -1,10 +1,6 @@ use std::iter::Peekable; -use ruff_python_ast::{ - Alias, Arguments, Comprehension, Decorator, ElifElseClause, ExceptHandler, Expr, Keyword, - MatchCase, Mod, Parameter, ParameterWithDefault, Parameters, Pattern, Ranged, Stmt, TypeParam, - TypeParams, WithItem, -}; +use ruff_python_ast::{Mod, Ranged, Stmt}; use ruff_text_size::{TextRange, TextSize}; use ruff_formatter::{SourceCode, SourceCodeSlice}; @@ -48,14 +44,22 @@ impl<'a> CommentsVisitor<'a> { self.finish() } - fn start_node(&mut self, node: N) -> TraversalSignal - where - N: Into>, - { - self.start_node_impl(node.into()) + // Try to skip the subtree if + // * there are no comments + // * if the next comment comes after this node (meaning, this nodes subtree contains no comments) + fn can_skip(&mut self, node_end: TextSize) -> bool { + self.comment_ranges + .peek() + .map_or(true, |next_comment| next_comment.start() >= node_end) } - fn start_node_impl(&mut self, node: AnyNodeRef<'a>) -> TraversalSignal { + fn finish(self) -> CommentsMap<'a> { + self.builder.finish() + } +} + +impl<'ast> PreorderVisitor<'ast> for CommentsVisitor<'ast> { + fn enter_node(&mut self, node: AnyNodeRef<'ast>) -> TraversalSignal { let node_range = node.range(); let enclosing_node = self.parents.last().copied().unwrap_or(node); @@ -95,23 +99,7 @@ impl<'a> CommentsVisitor<'a> { } } - // Try to skip the subtree if - // * there are no comments - // * if the next comment comes after this node (meaning, this nodes subtree contains no comments) - fn can_skip(&mut self, node_end: TextSize) -> bool { - self.comment_ranges - .peek() - .map_or(true, |next_comment| next_comment.start() >= node_end) - } - - fn finish_node(&mut self, node: N) - where - N: Into>, - { - self.finish_node_impl(node.into()); - } - - fn finish_node_impl(&mut self, node: AnyNodeRef<'a>) { + fn leave_node(&mut self, node: AnyNodeRef<'ast>) { // We are leaving this node, pop it from the parent stack. self.parents.pop(); @@ -146,19 +134,6 @@ impl<'a> CommentsVisitor<'a> { self.preceding_node = Some(node); } - fn finish(self) -> CommentsMap<'a> { - self.builder.finish() - } -} - -impl<'ast> PreorderVisitor<'ast> for CommentsVisitor<'ast> { - fn visit_mod(&mut self, module: &'ast Mod) { - if self.start_node(module).is_traverse() { - walk_module(self, module); - } - self.finish_node(module); - } - fn visit_body(&mut self, body: &'ast [Stmt]) { match body { [] => { @@ -178,140 +153,6 @@ impl<'ast> PreorderVisitor<'ast> for CommentsVisitor<'ast> { } } } - - fn visit_stmt(&mut self, stmt: &'ast Stmt) { - if self.start_node(stmt).is_traverse() { - walk_stmt(self, stmt); - } - self.finish_node(stmt); - } - - fn visit_annotation(&mut self, expr: &'ast Expr) { - if self.start_node(expr).is_traverse() { - walk_expr(self, expr); - } - self.finish_node(expr); - } - - fn visit_decorator(&mut self, decorator: &'ast Decorator) { - if self.start_node(decorator).is_traverse() { - walk_decorator(self, decorator); - } - self.finish_node(decorator); - } - - fn visit_expr(&mut self, expr: &'ast Expr) { - if self.start_node(expr).is_traverse() { - walk_expr(self, expr); - } - self.finish_node(expr); - } - - fn visit_comprehension(&mut self, comprehension: &'ast Comprehension) { - if self.start_node(comprehension).is_traverse() { - walk_comprehension(self, comprehension); - } - self.finish_node(comprehension); - } - - fn visit_except_handler(&mut self, except_handler: &'ast ExceptHandler) { - if self.start_node(except_handler).is_traverse() { - walk_except_handler(self, except_handler); - } - self.finish_node(except_handler); - } - - fn visit_format_spec(&mut self, format_spec: &'ast Expr) { - if self.start_node(format_spec).is_traverse() { - walk_expr(self, format_spec); - } - self.finish_node(format_spec); - } - - fn visit_arguments(&mut self, arguments: &'ast Arguments) { - if self.start_node(arguments).is_traverse() { - walk_arguments(self, arguments); - } - self.finish_node(arguments); - } - - fn visit_parameters(&mut self, parameters: &'ast Parameters) { - if self.start_node(parameters).is_traverse() { - walk_parameters(self, parameters); - } - self.finish_node(parameters); - } - - fn visit_parameter(&mut self, arg: &'ast Parameter) { - if self.start_node(arg).is_traverse() { - walk_parameter(self, arg); - } - self.finish_node(arg); - } - - fn visit_parameter_with_default(&mut self, parameter_with_default: &'ast ParameterWithDefault) { - if self.start_node(parameter_with_default).is_traverse() { - walk_parameter_with_default(self, parameter_with_default); - } - self.finish_node(parameter_with_default); - } - - fn visit_keyword(&mut self, keyword: &'ast Keyword) { - if self.start_node(keyword).is_traverse() { - walk_keyword(self, keyword); - } - self.finish_node(keyword); - } - - fn visit_alias(&mut self, alias: &'ast Alias) { - if self.start_node(alias).is_traverse() { - walk_alias(self, alias); - } - self.finish_node(alias); - } - - fn visit_with_item(&mut self, with_item: &'ast WithItem) { - if self.start_node(with_item).is_traverse() { - walk_with_item(self, with_item); - } - - self.finish_node(with_item); - } - - fn visit_match_case(&mut self, match_case: &'ast MatchCase) { - if self.start_node(match_case).is_traverse() { - walk_match_case(self, match_case); - } - self.finish_node(match_case); - } - - fn visit_pattern(&mut self, pattern: &'ast Pattern) { - if self.start_node(pattern).is_traverse() { - walk_pattern(self, pattern); - } - self.finish_node(pattern); - } - - fn visit_elif_else_clause(&mut self, elif_else_clause: &'ast ElifElseClause) { - if self.start_node(elif_else_clause).is_traverse() { - walk_elif_else_clause(self, elif_else_clause); - } - self.finish_node(elif_else_clause); - } - - fn visit_type_params(&mut self, type_params: &'ast TypeParams) { - if self.start_node(type_params).is_traverse() { - walk_type_params(self, type_params); - } - self.finish_node(type_params); - } - - fn visit_type_param(&mut self, type_param: &'ast TypeParam) { - if self.start_node(type_param).is_traverse() { - walk_type_param(self, type_param); - } - self.finish_node(type_param); - } } fn text_position(comment_range: TextRange, source_code: SourceCode) -> CommentLinePosition { @@ -663,18 +504,6 @@ impl<'a> CommentPlacement<'a> { } } -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum TraversalSignal { - Traverse, - Skip, -} - -impl TraversalSignal { - const fn is_traverse(self) -> bool { - matches!(self, TraversalSignal::Traverse) - } -} - #[derive(Clone, Debug, Default)] struct CommentsBuilder<'a> { comments: CommentsMap<'a>, From eaada0345ca9ef295a21ec14c5761fb438296f88 Mon Sep 17 00:00:00 2001 From: rco-ableton <11273197+rco-ableton@users.noreply.github.com> Date: Wed, 9 Aug 2023 14:08:47 +0200 Subject: [PATCH 046/155] Set default version to py38 (#6444) ## Summary In https://github.com/astral-sh/ruff/pull/6397, the documentation was updated stating that the default target-version is now "py38", but the actual default value wasn't updated and remained py310. This commit updates the default value to match what the documentation says. --- crates/ruff/src/rules/flake8_bugbear/mod.rs | 14 ++++++++++- ...ules__flake8_bugbear__tests__B905.py.snap} | 0 .../ruff/src/rules/flake8_use_pathlib/mod.rs | 6 +++-- crates/ruff/src/rules/pylint/mod.rs | 25 ++++++++----------- crates/ruff/src/rules/pyupgrade/mod.rs | 2 +- ...ff__rules__pyupgrade__tests__UP035.py.snap | 15 +++++++++++ crates/ruff/src/rules/ruff/mod.rs | 8 +++--- crates/ruff/src/settings/defaults.rs | 2 +- crates/ruff/src/settings/mod.rs | 7 ++++++ crates/ruff/src/settings/options.rs | 2 +- crates/ruff/src/settings/types.rs | 4 +++ 11 files changed, 59 insertions(+), 26 deletions(-) rename crates/ruff/src/rules/flake8_bugbear/snapshots/{ruff__rules__flake8_bugbear__tests__B905_B905.py.snap => ruff__rules__flake8_bugbear__tests__B905.py.snap} (100%) diff --git a/crates/ruff/src/rules/flake8_bugbear/mod.rs b/crates/ruff/src/rules/flake8_bugbear/mod.rs index 005fe03002..50edabed6d 100644 --- a/crates/ruff/src/rules/flake8_bugbear/mod.rs +++ b/crates/ruff/src/rules/flake8_bugbear/mod.rs @@ -11,6 +11,7 @@ mod tests { use crate::assert_messages; use crate::registry::Rule; + use crate::settings::types::PythonVersion; use crate::settings::Settings; use crate::test::test_path; @@ -49,7 +50,6 @@ mod tests { #[test_case(Rule::UselessComparison, Path::new("B015.py"))] #[test_case(Rule::UselessContextlibSuppress, Path::new("B022.py"))] #[test_case(Rule::UselessExpression, Path::new("B018.py"))] - #[test_case(Rule::ZipWithoutExplicitStrict, Path::new("B905.py"))] fn rules(rule_code: Rule, path: &Path) -> Result<()> { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( @@ -60,6 +60,18 @@ mod tests { Ok(()) } + #[test] + fn zip_without_explicit_strict() -> Result<()> { + let snapshot = "B905.py"; + let diagnostics = test_path( + Path::new("flake8_bugbear").join(snapshot).as_path(), + &Settings::for_rule(Rule::ZipWithoutExplicitStrict) + .with_target_version(PythonVersion::latest()), + )?; + assert_messages!(snapshot, diagnostics); + Ok(()) + } + #[test] fn extend_immutable_calls() -> Result<()> { let snapshot = "extend_immutable_calls".to_string(); diff --git a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B905_B905.py.snap b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B905.py.snap similarity index 100% rename from crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B905_B905.py.snap rename to crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B905.py.snap diff --git a/crates/ruff/src/rules/flake8_use_pathlib/mod.rs b/crates/ruff/src/rules/flake8_use_pathlib/mod.rs index b319fd92ee..39a0bd7bbd 100644 --- a/crates/ruff/src/rules/flake8_use_pathlib/mod.rs +++ b/crates/ruff/src/rules/flake8_use_pathlib/mod.rs @@ -12,6 +12,7 @@ mod tests { use crate::assert_messages; use crate::registry::Rule; use crate::settings; + use crate::settings::types::PythonVersion; use crate::test::test_path; #[test_case(Path::new("full_name.py"))] @@ -48,7 +49,8 @@ mod tests { Rule::OsPathSamefile, Rule::OsPathSplitext, Rule::BuiltinOpen, - ]), + ]) + .with_target_version(PythonVersion::latest()), )?; assert_messages!(snapshot, diagnostics); Ok(()) @@ -67,7 +69,7 @@ mod tests { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( Path::new("flake8_use_pathlib").join(path).as_path(), - &settings::Settings::for_rule(rule_code), + &settings::Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), )?; assert_messages!(snapshot, diagnostics); Ok(()) diff --git a/crates/ruff/src/rules/pylint/mod.rs b/crates/ruff/src/rules/pylint/mod.rs index fbe0c1abe3..6f127f394d 100644 --- a/crates/ruff/src/rules/pylint/mod.rs +++ b/crates/ruff/src/rules/pylint/mod.rs @@ -130,7 +130,7 @@ mod tests { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( Path::new("pylint").join(path).as_path(), - &Settings::for_rules(vec![rule_code]), + &Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), )?; assert_messages!(snapshot, diagnostics); Ok(()) @@ -140,10 +140,8 @@ mod tests { fn repeated_isinstance_calls() -> Result<()> { let diagnostics = test_path( Path::new("pylint/repeated_isinstance_calls.py"), - &Settings { - target_version: PythonVersion::Py39, - ..Settings::for_rules(vec![Rule::RepeatedIsinstanceCalls]) - }, + &Settings::for_rule(Rule::RepeatedIsinstanceCalls) + .with_target_version(PythonVersion::Py39), )?; assert_messages!(diagnostics); Ok(()) @@ -153,10 +151,7 @@ mod tests { fn continue_in_finally() -> Result<()> { let diagnostics = test_path( Path::new("pylint/continue_in_finally.py"), - &Settings { - target_version: PythonVersion::Py37, - ..Settings::for_rules(vec![Rule::ContinueInFinally]) - }, + &Settings::for_rule(Rule::ContinueInFinally).with_target_version(PythonVersion::Py37), )?; assert_messages!(diagnostics); Ok(()) @@ -171,7 +166,7 @@ mod tests { allow_magic_value_types: vec![pylint::settings::ConstantType::Int], ..pylint::settings::Settings::default() }, - ..Settings::for_rules(vec![Rule::MagicValueComparison]) + ..Settings::for_rule(Rule::MagicValueComparison) }, )?; assert_messages!(diagnostics); @@ -187,7 +182,7 @@ mod tests { max_args: 4, ..pylint::settings::Settings::default() }, - ..Settings::for_rules(vec![Rule::TooManyArguments]) + ..Settings::for_rule(Rule::TooManyArguments) }, )?; assert_messages!(diagnostics); @@ -200,7 +195,7 @@ mod tests { Path::new("pylint/too_many_arguments_params.py"), &Settings { dummy_variable_rgx: Regex::new(r"skip_.*").unwrap(), - ..Settings::for_rules(vec![Rule::TooManyArguments]) + ..Settings::for_rule(Rule::TooManyArguments) }, )?; assert_messages!(diagnostics); @@ -216,7 +211,7 @@ mod tests { max_branches: 1, ..pylint::settings::Settings::default() }, - ..Settings::for_rules(vec![Rule::TooManyBranches]) + ..Settings::for_rule(Rule::TooManyBranches) }, )?; assert_messages!(diagnostics); @@ -232,7 +227,7 @@ mod tests { max_statements: 1, ..pylint::settings::Settings::default() }, - ..Settings::for_rules(vec![Rule::TooManyStatements]) + ..Settings::for_rule(Rule::TooManyStatements) }, )?; assert_messages!(diagnostics); @@ -248,7 +243,7 @@ mod tests { max_returns: 1, ..pylint::settings::Settings::default() }, - ..Settings::for_rules(vec![Rule::TooManyReturnStatements]) + ..Settings::for_rule(Rule::TooManyReturnStatements) }, )?; assert_messages!(diagnostics); diff --git a/crates/ruff/src/rules/pyupgrade/mod.rs b/crates/ruff/src/rules/pyupgrade/mod.rs index 9e2f633ba0..edbec0e5c5 100644 --- a/crates/ruff/src/rules/pyupgrade/mod.rs +++ b/crates/ruff/src/rules/pyupgrade/mod.rs @@ -81,7 +81,7 @@ mod tests { let snapshot = path.to_string_lossy().to_string(); let diagnostics = test_path( Path::new("pyupgrade").join(path).as_path(), - &settings::Settings::for_rule(rule_code), + &settings::Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), )?; assert_messages!(snapshot, diagnostics); Ok(()) diff --git a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap index f610969a3c..04319f36dc 100644 --- a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap +++ b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap @@ -974,4 +974,19 @@ UP035.py:76:1: UP035 [*] Import from `collections.abc` instead: `Generator` 78 78 | # OK 79 79 | from a import b +UP035.py:88:1: UP035 [*] Import from `typing` instead: `dataclass_transform` + | +87 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). +88 | from typing_extensions import dataclass_transform + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP035 + | + = help: Import from `typing` + +ℹ Suggested fix +85 85 | from typing_extensions import NamedTuple +86 86 | +87 87 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). +88 |-from typing_extensions import dataclass_transform + 88 |+from typing import dataclass_transform + diff --git a/crates/ruff/src/rules/ruff/mod.rs b/crates/ruff/src/rules/ruff/mod.rs index 16b6ac7a48..1195b3b559 100644 --- a/crates/ruff/src/rules/ruff/mod.rs +++ b/crates/ruff/src/rules/ruff/mod.rs @@ -44,7 +44,7 @@ mod tests { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( Path::new("ruff").join(path).as_path(), - &settings::Settings::for_rule(rule_code), + &settings::Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), )?; assert_messages!(snapshot, diagnostics); Ok(()) @@ -60,10 +60,8 @@ mod tests { ); let diagnostics = test_path( Path::new("ruff").join(path).as_path(), - &settings::Settings { - target_version: PythonVersion::Py39, - ..settings::Settings::for_rule(Rule::ImplicitOptional) - }, + &settings::Settings::for_rule(Rule::ImplicitOptional) + .with_target_version(PythonVersion::Py39), )?; assert_messages!(snapshot, diagnostics); Ok(()) diff --git a/crates/ruff/src/settings/defaults.rs b/crates/ruff/src/settings/defaults.rs index 6ccc3bf09b..1605c6b027 100644 --- a/crates/ruff/src/settings/defaults.rs +++ b/crates/ruff/src/settings/defaults.rs @@ -24,7 +24,7 @@ pub const PREFIXES: &[RuleSelector] = &[ RuleSelector::Linter(Linter::Pyflakes), ]; -pub const TARGET_VERSION: PythonVersion = PythonVersion::Py310; +pub const TARGET_VERSION: PythonVersion = PythonVersion::Py38; pub const TASK_TAGS: &[&str] = &["TODO", "FIXME", "XXX"]; diff --git a/crates/ruff/src/settings/mod.rs b/crates/ruff/src/settings/mod.rs index 3dfc8372cd..efdddd4374 100644 --- a/crates/ruff/src/settings/mod.rs +++ b/crates/ruff/src/settings/mod.rs @@ -308,6 +308,13 @@ impl Settings { ..Self::default() } } + + /// Return the [`Settings`] after updating the target [`PythonVersion`]. + #[must_use] + pub fn with_target_version(mut self, target_version: PythonVersion) -> Self { + self.target_version = target_version; + self + } } impl From<&Configuration> for RuleTable { diff --git a/crates/ruff/src/settings/options.rs b/crates/ruff/src/settings/options.rs index 43d3618d77..7ed6ae20ac 100644 --- a/crates/ruff/src/settings/options.rs +++ b/crates/ruff/src/settings/options.rs @@ -456,7 +456,7 @@ pub struct Options { /// contained an `__init__.py` file. pub namespace_packages: Option>, #[option( - default = r#""py310""#, + default = r#""py38""#, value_type = r#""py37" | "py38" | "py39" | "py310" | "py311" | "py312""#, example = r#" # Always generate Python 3.7-compatible code. diff --git a/crates/ruff/src/settings/types.rs b/crates/ruff/src/settings/types.rs index 82dc6fe34c..538918f8dd 100644 --- a/crates/ruff/src/settings/types.rs +++ b/crates/ruff/src/settings/types.rs @@ -41,6 +41,10 @@ impl From for Pep440Version { } impl PythonVersion { + pub const fn latest() -> Self { + Self::Py312 + } + pub const fn as_tuple(&self) -> (u32, u32) { match self { Self::Py37 => (3, 7), From 3bf1c66cdae3915c4945099bd03ef9da7fb06b2d Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 9 Aug 2023 08:13:58 -0400 Subject: [PATCH 047/155] Group function definition parameters with return type annotations (#6410) ## Summary This PR removes the group around function definition parameters, instead grouping the parameters with the type parameters and return type annotation. This increases Zulip's similarity score from 0.99385 to 0.99699, so it's a meaningful improvement. However, there's at least one stability error that I'm working on, and I'm really just looking for high-level feedback at this point, because I'm not happy with the solution. Closes https://github.com/astral-sh/ruff/issues/6352. ## Test Plan Before: - `zulip`: 0.99396 - `django`: 0.99784 - `warehouse`: 0.99578 - `build`: 0.75436 - `transformers`: 0.99407 - `cpython`: 0.75987 - `typeshed`: 0.74432 After: - `zulip`: 0.99702 - `django`: 0.99784 - `warehouse`: 0.99585 - `build`: 0.75623 - `transformers`: 0.99470 - `cpython`: 0.75988 - `typeshed`: 0.74853 --- .../test/fixtures/ruff/statement/function.py | 26 ++++++ .../src/other/parameters.rs | 18 +++-- .../src/statement/stmt_function_def.rs | 38 +++++---- ..._cases__return_annotation_brackets.py.snap | 12 ++- .../format@statement__function.py.snap | 80 ++++++++++++++++++- 5 files changed, 147 insertions(+), 27 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py index e59547d6ce..d242751143 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py @@ -409,3 +409,29 @@ def double(a: int) -> ( # Hello def double(a: int) -> ( # Hello ): return 2*a + +# Breaking over parameters and return types. (Black adds a trailing comma when the +# function arguments break here with a single argument; we do not.) +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... + +def f(a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> a: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... diff --git a/crates/ruff_python_formatter/src/other/parameters.rs b/crates/ruff_python_formatter/src/other/parameters.rs index cbd9b594b7..34696fbe52 100644 --- a/crates/ruff_python_formatter/src/other/parameters.rs +++ b/crates/ruff_python_formatter/src/other/parameters.rs @@ -7,14 +7,15 @@ use ruff_python_trivia::{SimpleToken, SimpleTokenKind, SimpleTokenizer}; use ruff_text_size::{TextRange, TextSize}; use crate::comments::{ - leading_comments, leading_node_comments, trailing_comments, CommentLinePosition, SourceComment, + dangling_open_parenthesis_comments, leading_comments, leading_node_comments, trailing_comments, + CommentLinePosition, SourceComment, }; use crate::context::{NodeLevel, WithNodeLevel}; -use crate::expression::parentheses::{empty_parenthesized, parenthesized}; +use crate::expression::parentheses::empty_parenthesized; use crate::prelude::*; use crate::FormatNodeRule; -#[derive(Eq, PartialEq, Debug, Default)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub enum ParametersParentheses { /// By default, parameters will always preserve their surrounding parentheses. #[default] @@ -246,10 +247,17 @@ impl FormatNodeRule for FormatParameters { // No parameters, format any dangling comments between `()` write!(f, [empty_parenthesized("(", dangling, ")")]) } else { + // Intentionally avoid `parenthesized`, which groups the entire formatted contents. + // We want parameters to be grouped alongside return types, one level up, so we + // format them "inline" here. write!( f, - [parenthesized("(", &group(&format_inner), ")") - .with_dangling_comments(parenthesis_dangling)] + [ + text("("), + dangling_open_parenthesis_comments(parenthesis_dangling), + soft_block_indent(&group(&format_inner)), + text(")") + ] ) } } diff --git a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs index 4533a6012c..746b69de42 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs @@ -58,24 +58,28 @@ impl FormatNodeRule for FormatStmtFunctionDef { write!(f, [type_params.format()])?; } - write!(f, [item.parameters.format()])?; - - if let Some(return_annotation) = item.returns.as_ref() { - write!(f, [space(), text("->"), space()])?; - if return_annotation.is_tuple_expr() { - write!( - f, - [return_annotation.format().with_options(Parentheses::Never)] - )?; - } else { - write!( - f, - [optional_parentheses( - &return_annotation.format().with_options(Parentheses::Never), - )] - )?; + let format_inner = format_with(|f: &mut PyFormatter| { + write!(f, [item.parameters.format()])?; + if let Some(return_annotation) = item.returns.as_ref() { + write!(f, [space(), text("->"), space()])?; + if return_annotation.is_tuple_expr() { + write!( + f, + [return_annotation.format().with_options(Parentheses::Never)] + )?; + } else { + write!( + f, + [optional_parentheses( + &return_annotation.format().with_options(Parentheses::Never), + )] + )?; + } } - } + Ok(()) + }); + + write!(f, [group(&format_inner)])?; write!( f, diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap index c35111a8b1..36e4656eb0 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap @@ -100,18 +100,20 @@ def foo() -> tuple[int, int, int,]: ```diff --- Black +++ Ruff -@@ -26,7 +26,9 @@ +@@ -26,7 +26,11 @@ return 2 * a -def double(a: int) -> int: # Hello -+def double(a: int) -> ( ++def double( ++ a: int ++) -> ( + int # Hello +): return 2 * a -@@ -54,7 +56,9 @@ +@@ -54,7 +58,9 @@ a: int, b: int, c: int, @@ -155,7 +157,9 @@ def double(a: int) -> int: # Hello return 2 * a -def double(a: int) -> ( +def double( + a: int +) -> ( int # Hello ): return 2 * a diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index 7868120be5..d9f8a55ccf 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -415,6 +415,32 @@ def double(a: int) -> ( # Hello def double(a: int) -> ( # Hello ): return 2*a + +# Breaking over parameters and return types. (Black adds a trailing comma when the +# function arguments break here with a single argument; we do not.) +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... + +def f(a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> a: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... ``` ## Output @@ -1023,9 +1049,61 @@ def double(a: int) -> int: # Hello return 2 * a -def double(a: int) -> ( # Hello +def double( + a: int +) -> ( # Hello ): return 2 * a + + +# Breaking over parameters and return types. (Black adds a trailing comma when the +# function arguments break here with a single argument; we do not.) +def f( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> a: + ... + + +def f( + a +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> ( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +): + ... + + +def f[ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +]() -> a: + ... + + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> a: + ... ``` From 6a64f2289b1b4a091e1a7124eaa43198ce8fa819 Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Wed, 9 Aug 2023 18:58:18 +0530 Subject: [PATCH 048/155] Rename `Magic*` to `IpyEscape*` (#6395) ## Summary This PR renames the `MagicCommand` token to `IpyEscapeCommand` token and `MagicKind` to `IpyEscapeKind` type to better reflect the purpose of the token and type. Similarly, it renames the AST nodes from `LineMagic` to `IpyEscapeCommand` prefixed with `Stmt`/`Expr` wherever necessary. It also makes renames from using `jupyter_magic` to `ipython_escape_commands` in various function names. The mode value is still `Mode::Jupyter` because the escape commands are part of the IPython syntax but the lexing/parsing is done for a Jupyter notebook. ### Motivation behind the rename: * IPython codebase defines it as "EscapeCommand" / "Escape Sequences": * Escape Sequences: https://github.com/ipython/ipython/blob/292e3a23459ca965b8c1bfe2c3707044c510209a/IPython/core/inputtransformer2.py#L329-L333 * Escape command: https://github.com/ipython/ipython/blob/292e3a23459ca965b8c1bfe2c3707044c510209a/IPython/core/inputtransformer2.py#L410-L411 * The word "magic" is used mainly for the actual magic commands i.e., the ones starting with `%`/`%%` (https://ipython.readthedocs.io/en/stable/interactive/reference.html#magic-command-system). So, this avoids any confusion between the Magic token (`%`, `%%`) and the escape command itself. ## Test Plan * `cargo test` to make sure all renames are done correctly. * `grep` for `jupyter_escape`/`magic` to make sure all renames are done correctly. --- ..._magics.ipynb => ipy_escape_command.ipynb} | 0 ...pynb => ipy_escape_command_expected.ipynb} | 0 crates/ruff/src/jupyter/notebook.rs | 6 +- ..._notebook__tests__ipy_escape_command.snap} | 2 +- .../ruff/src/rules/ruff/rules/unreachable.rs | 8 +- crates/ruff_python_ast/src/comparable.rs | 20 +- crates/ruff_python_ast/src/helpers.rs | 6 +- crates/ruff_python_ast/src/node.rs | 116 +-- crates/ruff_python_ast/src/nodes.rs | 126 +-- crates/ruff_python_ast/src/relocate.rs | 2 +- crates/ruff_python_ast/src/visitor.rs | 4 +- .../ruff_python_ast/src/visitor/preorder.rs | 4 +- crates/ruff_python_codegen/src/generator.rs | 4 +- .../src/expression/expr_ipy_escape_command.rs | 12 + .../src/expression/expr_line_magic.rs | 12 - .../src/expression/mod.rs | 8 +- crates/ruff_python_formatter/src/generated.rs | 48 +- .../src/statement/mod.rs | 4 +- .../src/statement/stmt_ipy_escape_command.rs | 12 + .../src/statement/stmt_line_magic.rs | 12 - crates/ruff_python_parser/src/lexer.rs | 265 ++--- crates/ruff_python_parser/src/parser.rs | 12 +- crates/ruff_python_parser/src/python.lalrpop | 58 +- crates/ruff_python_parser/src/python.rs | 962 +++++++++--------- ...rser__tests__ipython_escape_commands.snap} | 174 ++-- crates/ruff_python_parser/src/token.rs | 18 +- 26 files changed, 949 insertions(+), 946 deletions(-) rename crates/ruff/resources/test/fixtures/jupyter/{line_magics.ipynb => ipy_escape_command.ipynb} (100%) rename crates/ruff/resources/test/fixtures/jupyter/{line_magics_expected.ipynb => ipy_escape_command_expected.ipynb} (100%) rename crates/ruff/src/jupyter/snapshots/{ruff__jupyter__notebook__tests__line_magics.snap => ruff__jupyter__notebook__tests__ipy_escape_command.snap} (79%) create mode 100644 crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs delete mode 100644 crates/ruff_python_formatter/src/expression/expr_line_magic.rs create mode 100644 crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs delete mode 100644 crates/ruff_python_formatter/src/statement/stmt_line_magic.rs rename crates/ruff_python_parser/src/snapshots/{ruff_python_parser__parser__tests__jupyter_magic.snap => ruff_python_parser__parser__tests__ipython_escape_commands.snap} (75%) diff --git a/crates/ruff/resources/test/fixtures/jupyter/line_magics.ipynb b/crates/ruff/resources/test/fixtures/jupyter/ipy_escape_command.ipynb similarity index 100% rename from crates/ruff/resources/test/fixtures/jupyter/line_magics.ipynb rename to crates/ruff/resources/test/fixtures/jupyter/ipy_escape_command.ipynb diff --git a/crates/ruff/resources/test/fixtures/jupyter/line_magics_expected.ipynb b/crates/ruff/resources/test/fixtures/jupyter/ipy_escape_command_expected.ipynb similarity index 100% rename from crates/ruff/resources/test/fixtures/jupyter/line_magics_expected.ipynb rename to crates/ruff/resources/test/fixtures/jupyter/ipy_escape_command_expected.ipynb diff --git a/crates/ruff/src/jupyter/notebook.rs b/crates/ruff/src/jupyter/notebook.rs index 4aaff0b1ff..43238f5e2b 100644 --- a/crates/ruff/src/jupyter/notebook.rs +++ b/crates/ruff/src/jupyter/notebook.rs @@ -571,11 +571,11 @@ print("after empty cells") } #[test] - fn test_line_magics() -> Result<()> { - let path = "line_magics.ipynb".to_string(); + fn test_ipy_escape_command() -> Result<()> { + let path = "ipy_escape_command.ipynb".to_string(); let (diagnostics, source_kind, _) = test_notebook_path( &path, - Path::new("line_magics_expected.ipynb"), + Path::new("ipy_escape_command_expected.ipynb"), &settings::Settings::for_rule(Rule::UnusedImport), )?; assert_messages!(diagnostics, path, source_kind); diff --git a/crates/ruff/src/jupyter/snapshots/ruff__jupyter__notebook__tests__line_magics.snap b/crates/ruff/src/jupyter/snapshots/ruff__jupyter__notebook__tests__ipy_escape_command.snap similarity index 79% rename from crates/ruff/src/jupyter/snapshots/ruff__jupyter__notebook__tests__line_magics.snap rename to crates/ruff/src/jupyter/snapshots/ruff__jupyter__notebook__tests__ipy_escape_command.snap index 61211b2c18..57f92d184e 100644 --- a/crates/ruff/src/jupyter/snapshots/ruff__jupyter__notebook__tests__line_magics.snap +++ b/crates/ruff/src/jupyter/snapshots/ruff__jupyter__notebook__tests__ipy_escape_command.snap @@ -1,7 +1,7 @@ --- source: crates/ruff/src/jupyter/notebook.rs --- -line_magics.ipynb:cell 1:5:8: F401 [*] `os` imported but unused +ipy_escape_command.ipynb:cell 1:5:8: F401 [*] `os` imported but unused | 3 | %matplotlib inline 4 | diff --git a/crates/ruff/src/rules/ruff/rules/unreachable.rs b/crates/ruff/src/rules/ruff/rules/unreachable.rs index 300110fe6f..7549d91053 100644 --- a/crates/ruff/src/rules/ruff/rules/unreachable.rs +++ b/crates/ruff/src/rules/ruff/rules/unreachable.rs @@ -653,13 +653,13 @@ impl<'stmt> BasicBlocksBuilder<'stmt> { | Expr::Await(_) | Expr::Yield(_) | Expr::YieldFrom(_) => self.unconditional_next_block(after), - Expr::LineMagic(_) => todo!(), + Expr::IpyEscapeCommand(_) => todo!(), } } // The tough branches are done, here is an easy one. Stmt::Return(_) => NextBlock::Terminate, Stmt::TypeAlias(_) => todo!(), - Stmt::LineMagic(_) => todo!(), + Stmt::IpyEscapeCommand(_) => todo!(), }; // Include any statements in the block that don't divert the control flow. @@ -903,7 +903,7 @@ fn needs_next_block(stmts: &[Stmt]) -> bool { | Stmt::TryStar(_) | Stmt::Assert(_) => true, Stmt::TypeAlias(_) => todo!(), - Stmt::LineMagic(_) => todo!(), + Stmt::IpyEscapeCommand(_) => todo!(), } } @@ -936,7 +936,7 @@ fn is_control_flow_stmt(stmt: &Stmt) -> bool { | Stmt::Break(_) | Stmt::Continue(_) => true, Stmt::TypeAlias(_) => todo!(), - Stmt::LineMagic(_) => todo!(), + Stmt::IpyEscapeCommand(_) => todo!(), } } diff --git a/crates/ruff_python_ast/src/comparable.rs b/crates/ruff_python_ast/src/comparable.rs index f042fe3707..00a6ef87d2 100644 --- a/crates/ruff_python_ast/src/comparable.rs +++ b/crates/ruff_python_ast/src/comparable.rs @@ -672,8 +672,8 @@ pub struct ExprSlice<'a> { } #[derive(Debug, PartialEq, Eq, Hash)] -pub struct ExprLineMagic<'a> { - kind: ast::MagicKind, +pub struct ExprIpyEscapeCommand<'a> { + kind: ast::IpyEscapeKind, value: &'a str, } @@ -706,7 +706,7 @@ pub enum ComparableExpr<'a> { List(ExprList<'a>), Tuple(ExprTuple<'a>), Slice(ExprSlice<'a>), - LineMagic(ExprLineMagic<'a>), + IpyEscapeCommand(ExprIpyEscapeCommand<'a>), } impl<'a> From<&'a Box> for Box> { @@ -936,11 +936,11 @@ impl<'a> From<&'a ast::Expr> for ComparableExpr<'a> { upper: upper.as_ref().map(Into::into), step: step.as_ref().map(Into::into), }), - ast::Expr::LineMagic(ast::ExprLineMagic { + ast::Expr::IpyEscapeCommand(ast::ExprIpyEscapeCommand { kind, value, range: _, - }) => Self::LineMagic(ExprLineMagic { + }) => Self::IpyEscapeCommand(ExprIpyEscapeCommand { kind: *kind, value: value.as_str(), }), @@ -1165,8 +1165,8 @@ pub struct StmtExpr<'a> { } #[derive(Debug, PartialEq, Eq, Hash)] -pub struct StmtLineMagic<'a> { - kind: ast::MagicKind, +pub struct StmtIpyEscapeCommand<'a> { + kind: ast::IpyEscapeKind, value: &'a str, } @@ -1193,7 +1193,7 @@ pub enum ComparableStmt<'a> { ImportFrom(StmtImportFrom<'a>), Global(StmtGlobal<'a>), Nonlocal(StmtNonlocal<'a>), - LineMagic(StmtLineMagic<'a>), + IpyEscapeCommand(StmtIpyEscapeCommand<'a>), Expr(StmtExpr<'a>), Pass, Break, @@ -1394,11 +1394,11 @@ impl<'a> From<&'a ast::Stmt> for ComparableStmt<'a> { names: names.iter().map(ast::Identifier::as_str).collect(), }) } - ast::Stmt::LineMagic(ast::StmtLineMagic { + ast::Stmt::IpyEscapeCommand(ast::StmtIpyEscapeCommand { kind, value, range: _, - }) => Self::LineMagic(StmtLineMagic { + }) => Self::IpyEscapeCommand(StmtIpyEscapeCommand { kind: *kind, value: value.as_str(), }), diff --git a/crates/ruff_python_ast/src/helpers.rs b/crates/ruff_python_ast/src/helpers.rs index f5fa0a5c48..5af9a38dcb 100644 --- a/crates/ruff_python_ast/src/helpers.rs +++ b/crates/ruff_python_ast/src/helpers.rs @@ -108,7 +108,7 @@ where | Expr::Subscript(_) | Expr::Yield(_) | Expr::YieldFrom(_) - | Expr::LineMagic(_) + | Expr::IpyEscapeCommand(_) ) }) } @@ -247,7 +247,7 @@ where .is_some_and(|value| any_over_expr(value, func)) } Expr::Name(_) | Expr::Constant(_) => false, - Expr::LineMagic(_) => false, + Expr::IpyEscapeCommand(_) => false, } } @@ -534,7 +534,7 @@ where Stmt::Nonlocal(_) => false, Stmt::Expr(ast::StmtExpr { value, range: _ }) => any_over_expr(value, func), Stmt::Pass(_) | Stmt::Break(_) | Stmt::Continue(_) => false, - Stmt::LineMagic(_) => false, + Stmt::IpyEscapeCommand(_) => false, } } diff --git a/crates/ruff_python_ast/src/node.rs b/crates/ruff_python_ast/src/node.rs index cc3748d62a..2bc1642af6 100644 --- a/crates/ruff_python_ast/src/node.rs +++ b/crates/ruff_python_ast/src/node.rs @@ -48,7 +48,7 @@ pub enum AnyNode { StmtPass(ast::StmtPass), StmtBreak(ast::StmtBreak), StmtContinue(ast::StmtContinue), - StmtLineMagic(ast::StmtLineMagic), + StmtIpyEscapeCommand(ast::StmtIpyEscapeCommand), ExprBoolOp(ast::ExprBoolOp), ExprNamedExpr(ast::ExprNamedExpr), ExprBinOp(ast::ExprBinOp), @@ -76,7 +76,7 @@ pub enum AnyNode { ExprList(ast::ExprList), ExprTuple(ast::ExprTuple), ExprSlice(ast::ExprSlice), - ExprLineMagic(ast::ExprLineMagic), + ExprIpyEscapeCommand(ast::ExprIpyEscapeCommand), ExceptHandlerExceptHandler(ast::ExceptHandlerExceptHandler), PatternMatchValue(ast::PatternMatchValue), PatternMatchSingleton(ast::PatternMatchSingleton), @@ -131,7 +131,7 @@ impl AnyNode { AnyNode::StmtPass(node) => Some(Stmt::Pass(node)), AnyNode::StmtBreak(node) => Some(Stmt::Break(node)), AnyNode::StmtContinue(node) => Some(Stmt::Continue(node)), - AnyNode::StmtLineMagic(node) => Some(Stmt::LineMagic(node)), + AnyNode::StmtIpyEscapeCommand(node) => Some(Stmt::IpyEscapeCommand(node)), AnyNode::ModModule(_) | AnyNode::ModExpression(_) @@ -162,7 +162,7 @@ impl AnyNode { | AnyNode::ExprList(_) | AnyNode::ExprTuple(_) | AnyNode::ExprSlice(_) - | AnyNode::ExprLineMagic(_) + | AnyNode::ExprIpyEscapeCommand(_) | AnyNode::ExceptHandlerExceptHandler(_) | AnyNode::PatternMatchValue(_) | AnyNode::PatternMatchSingleton(_) @@ -219,7 +219,7 @@ impl AnyNode { AnyNode::ExprList(node) => Some(Expr::List(node)), AnyNode::ExprTuple(node) => Some(Expr::Tuple(node)), AnyNode::ExprSlice(node) => Some(Expr::Slice(node)), - AnyNode::ExprLineMagic(node) => Some(Expr::LineMagic(node)), + AnyNode::ExprIpyEscapeCommand(node) => Some(Expr::IpyEscapeCommand(node)), AnyNode::ModModule(_) | AnyNode::ModExpression(_) @@ -248,7 +248,7 @@ impl AnyNode { | AnyNode::StmtPass(_) | AnyNode::StmtBreak(_) | AnyNode::StmtContinue(_) - | AnyNode::StmtLineMagic(_) + | AnyNode::StmtIpyEscapeCommand(_) | AnyNode::ExceptHandlerExceptHandler(_) | AnyNode::PatternMatchValue(_) | AnyNode::PatternMatchSingleton(_) @@ -306,7 +306,7 @@ impl AnyNode { | AnyNode::StmtPass(_) | AnyNode::StmtBreak(_) | AnyNode::StmtContinue(_) - | AnyNode::StmtLineMagic(_) + | AnyNode::StmtIpyEscapeCommand(_) | AnyNode::ExprBoolOp(_) | AnyNode::ExprNamedExpr(_) | AnyNode::ExprBinOp(_) @@ -334,7 +334,7 @@ impl AnyNode { | AnyNode::ExprList(_) | AnyNode::ExprTuple(_) | AnyNode::ExprSlice(_) - | AnyNode::ExprLineMagic(_) + | AnyNode::ExprIpyEscapeCommand(_) | AnyNode::ExceptHandlerExceptHandler(_) | AnyNode::PatternMatchValue(_) | AnyNode::PatternMatchSingleton(_) @@ -400,7 +400,7 @@ impl AnyNode { | AnyNode::StmtPass(_) | AnyNode::StmtBreak(_) | AnyNode::StmtContinue(_) - | AnyNode::StmtLineMagic(_) + | AnyNode::StmtIpyEscapeCommand(_) | AnyNode::ExprBoolOp(_) | AnyNode::ExprNamedExpr(_) | AnyNode::ExprBinOp(_) @@ -428,7 +428,7 @@ impl AnyNode { | AnyNode::ExprList(_) | AnyNode::ExprTuple(_) | AnyNode::ExprSlice(_) - | AnyNode::ExprLineMagic(_) + | AnyNode::ExprIpyEscapeCommand(_) | AnyNode::ExceptHandlerExceptHandler(_) | AnyNode::Comprehension(_) | AnyNode::Arguments(_) @@ -479,7 +479,7 @@ impl AnyNode { | AnyNode::StmtPass(_) | AnyNode::StmtBreak(_) | AnyNode::StmtContinue(_) - | AnyNode::StmtLineMagic(_) + | AnyNode::StmtIpyEscapeCommand(_) | AnyNode::ExprBoolOp(_) | AnyNode::ExprNamedExpr(_) | AnyNode::ExprBinOp(_) @@ -507,7 +507,7 @@ impl AnyNode { | AnyNode::ExprList(_) | AnyNode::ExprTuple(_) | AnyNode::ExprSlice(_) - | AnyNode::ExprLineMagic(_) + | AnyNode::ExprIpyEscapeCommand(_) | AnyNode::PatternMatchValue(_) | AnyNode::PatternMatchSingleton(_) | AnyNode::PatternMatchSequence(_) @@ -583,7 +583,7 @@ impl AnyNode { Self::StmtPass(node) => AnyNodeRef::StmtPass(node), Self::StmtBreak(node) => AnyNodeRef::StmtBreak(node), Self::StmtContinue(node) => AnyNodeRef::StmtContinue(node), - Self::StmtLineMagic(node) => AnyNodeRef::StmtLineMagic(node), + Self::StmtIpyEscapeCommand(node) => AnyNodeRef::StmtIpyEscapeCommand(node), Self::ExprBoolOp(node) => AnyNodeRef::ExprBoolOp(node), Self::ExprNamedExpr(node) => AnyNodeRef::ExprNamedExpr(node), Self::ExprBinOp(node) => AnyNodeRef::ExprBinOp(node), @@ -611,7 +611,7 @@ impl AnyNode { Self::ExprList(node) => AnyNodeRef::ExprList(node), Self::ExprTuple(node) => AnyNodeRef::ExprTuple(node), Self::ExprSlice(node) => AnyNodeRef::ExprSlice(node), - Self::ExprLineMagic(node) => AnyNodeRef::ExprLineMagic(node), + Self::ExprIpyEscapeCommand(node) => AnyNodeRef::ExprIpyEscapeCommand(node), Self::ExceptHandlerExceptHandler(node) => AnyNodeRef::ExceptHandlerExceptHandler(node), Self::PatternMatchValue(node) => AnyNodeRef::PatternMatchValue(node), Self::PatternMatchSingleton(node) => AnyNodeRef::PatternMatchSingleton(node), @@ -1429,12 +1429,12 @@ impl AstNode for ast::StmtContinue { AnyNode::from(self) } } -impl AstNode for ast::StmtLineMagic { +impl AstNode for ast::StmtIpyEscapeCommand { fn cast(kind: AnyNode) -> Option where Self: Sized, { - if let AnyNode::StmtLineMagic(node) = kind { + if let AnyNode::StmtIpyEscapeCommand(node) = kind { Some(node) } else { None @@ -1442,7 +1442,7 @@ impl AstNode for ast::StmtLineMagic { } fn cast_ref(kind: AnyNodeRef) -> Option<&Self> { - if let AnyNodeRef::StmtLineMagic(node) = kind { + if let AnyNodeRef::StmtIpyEscapeCommand(node) = kind { Some(node) } else { None @@ -2213,12 +2213,12 @@ impl AstNode for ast::ExprSlice { AnyNode::from(self) } } -impl AstNode for ast::ExprLineMagic { +impl AstNode for ast::ExprIpyEscapeCommand { fn cast(kind: AnyNode) -> Option where Self: Sized, { - if let AnyNode::ExprLineMagic(node) = kind { + if let AnyNode::ExprIpyEscapeCommand(node) = kind { Some(node) } else { None @@ -2226,7 +2226,7 @@ impl AstNode for ast::ExprLineMagic { } fn cast_ref(kind: AnyNodeRef) -> Option<&Self> { - if let AnyNodeRef::ExprLineMagic(node) = kind { + if let AnyNodeRef::ExprIpyEscapeCommand(node) = kind { Some(node) } else { None @@ -2915,7 +2915,7 @@ impl From for AnyNode { Stmt::Pass(node) => AnyNode::StmtPass(node), Stmt::Break(node) => AnyNode::StmtBreak(node), Stmt::Continue(node) => AnyNode::StmtContinue(node), - Stmt::LineMagic(node) => AnyNode::StmtLineMagic(node), + Stmt::IpyEscapeCommand(node) => AnyNode::StmtIpyEscapeCommand(node), } } } @@ -2950,7 +2950,7 @@ impl From for AnyNode { Expr::List(node) => AnyNode::ExprList(node), Expr::Tuple(node) => AnyNode::ExprTuple(node), Expr::Slice(node) => AnyNode::ExprSlice(node), - Expr::LineMagic(node) => AnyNode::ExprLineMagic(node), + Expr::IpyEscapeCommand(node) => AnyNode::ExprIpyEscapeCommand(node), } } } @@ -3155,9 +3155,9 @@ impl From for AnyNode { } } -impl From for AnyNode { - fn from(node: ast::StmtLineMagic) -> Self { - AnyNode::StmtLineMagic(node) +impl From for AnyNode { + fn from(node: ast::StmtIpyEscapeCommand) -> Self { + AnyNode::StmtIpyEscapeCommand(node) } } @@ -3323,9 +3323,9 @@ impl From for AnyNode { } } -impl From for AnyNode { - fn from(node: ast::ExprLineMagic) -> Self { - AnyNode::ExprLineMagic(node) +impl From for AnyNode { + fn from(node: ast::ExprIpyEscapeCommand) -> Self { + AnyNode::ExprIpyEscapeCommand(node) } } @@ -3486,7 +3486,7 @@ impl Ranged for AnyNode { AnyNode::StmtPass(node) => node.range(), AnyNode::StmtBreak(node) => node.range(), AnyNode::StmtContinue(node) => node.range(), - AnyNode::StmtLineMagic(node) => node.range(), + AnyNode::StmtIpyEscapeCommand(node) => node.range(), AnyNode::ExprBoolOp(node) => node.range(), AnyNode::ExprNamedExpr(node) => node.range(), AnyNode::ExprBinOp(node) => node.range(), @@ -3514,7 +3514,7 @@ impl Ranged for AnyNode { AnyNode::ExprList(node) => node.range(), AnyNode::ExprTuple(node) => node.range(), AnyNode::ExprSlice(node) => node.range(), - AnyNode::ExprLineMagic(node) => node.range(), + AnyNode::ExprIpyEscapeCommand(node) => node.range(), AnyNode::ExceptHandlerExceptHandler(node) => node.range(), AnyNode::PatternMatchValue(node) => node.range(), AnyNode::PatternMatchSingleton(node) => node.range(), @@ -3572,7 +3572,7 @@ pub enum AnyNodeRef<'a> { StmtPass(&'a ast::StmtPass), StmtBreak(&'a ast::StmtBreak), StmtContinue(&'a ast::StmtContinue), - StmtLineMagic(&'a ast::StmtLineMagic), + StmtIpyEscapeCommand(&'a ast::StmtIpyEscapeCommand), ExprBoolOp(&'a ast::ExprBoolOp), ExprNamedExpr(&'a ast::ExprNamedExpr), ExprBinOp(&'a ast::ExprBinOp), @@ -3600,7 +3600,7 @@ pub enum AnyNodeRef<'a> { ExprList(&'a ast::ExprList), ExprTuple(&'a ast::ExprTuple), ExprSlice(&'a ast::ExprSlice), - ExprLineMagic(&'a ast::ExprLineMagic), + ExprIpyEscapeCommand(&'a ast::ExprIpyEscapeCommand), ExceptHandlerExceptHandler(&'a ast::ExceptHandlerExceptHandler), PatternMatchValue(&'a ast::PatternMatchValue), PatternMatchSingleton(&'a ast::PatternMatchSingleton), @@ -3657,7 +3657,7 @@ impl AnyNodeRef<'_> { AnyNodeRef::StmtPass(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtBreak(node) => NonNull::from(*node).cast(), AnyNodeRef::StmtContinue(node) => NonNull::from(*node).cast(), - AnyNodeRef::StmtLineMagic(node) => NonNull::from(*node).cast(), + AnyNodeRef::StmtIpyEscapeCommand(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprBoolOp(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprNamedExpr(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprBinOp(node) => NonNull::from(*node).cast(), @@ -3685,7 +3685,7 @@ impl AnyNodeRef<'_> { AnyNodeRef::ExprList(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprTuple(node) => NonNull::from(*node).cast(), AnyNodeRef::ExprSlice(node) => NonNull::from(*node).cast(), - AnyNodeRef::ExprLineMagic(node) => NonNull::from(*node).cast(), + AnyNodeRef::ExprIpyEscapeCommand(node) => NonNull::from(*node).cast(), AnyNodeRef::ExceptHandlerExceptHandler(node) => NonNull::from(*node).cast(), AnyNodeRef::PatternMatchValue(node) => NonNull::from(*node).cast(), AnyNodeRef::PatternMatchSingleton(node) => NonNull::from(*node).cast(), @@ -3748,7 +3748,7 @@ impl AnyNodeRef<'_> { AnyNodeRef::StmtPass(_) => NodeKind::StmtPass, AnyNodeRef::StmtBreak(_) => NodeKind::StmtBreak, AnyNodeRef::StmtContinue(_) => NodeKind::StmtContinue, - AnyNodeRef::StmtLineMagic(_) => NodeKind::StmtLineMagic, + AnyNodeRef::StmtIpyEscapeCommand(_) => NodeKind::StmtIpyEscapeCommand, AnyNodeRef::ExprBoolOp(_) => NodeKind::ExprBoolOp, AnyNodeRef::ExprNamedExpr(_) => NodeKind::ExprNamedExpr, AnyNodeRef::ExprBinOp(_) => NodeKind::ExprBinOp, @@ -3776,7 +3776,7 @@ impl AnyNodeRef<'_> { AnyNodeRef::ExprList(_) => NodeKind::ExprList, AnyNodeRef::ExprTuple(_) => NodeKind::ExprTuple, AnyNodeRef::ExprSlice(_) => NodeKind::ExprSlice, - AnyNodeRef::ExprLineMagic(_) => NodeKind::ExprLineMagic, + AnyNodeRef::ExprIpyEscapeCommand(_) => NodeKind::ExprIpyEscapeCommand, AnyNodeRef::ExceptHandlerExceptHandler(_) => NodeKind::ExceptHandlerExceptHandler, AnyNodeRef::PatternMatchValue(_) => NodeKind::PatternMatchValue, AnyNodeRef::PatternMatchSingleton(_) => NodeKind::PatternMatchSingleton, @@ -3831,7 +3831,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtPass(_) | AnyNodeRef::StmtBreak(_) | AnyNodeRef::StmtContinue(_) - | AnyNodeRef::StmtLineMagic(_) => true, + | AnyNodeRef::StmtIpyEscapeCommand(_) => true, AnyNodeRef::ModModule(_) | AnyNodeRef::ModExpression(_) @@ -3862,7 +3862,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprList(_) | AnyNodeRef::ExprTuple(_) | AnyNodeRef::ExprSlice(_) - | AnyNodeRef::ExprLineMagic(_) + | AnyNodeRef::ExprIpyEscapeCommand(_) | AnyNodeRef::ExceptHandlerExceptHandler(_) | AnyNodeRef::PatternMatchValue(_) | AnyNodeRef::PatternMatchSingleton(_) @@ -3919,7 +3919,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprList(_) | AnyNodeRef::ExprTuple(_) | AnyNodeRef::ExprSlice(_) - | AnyNodeRef::ExprLineMagic(_) => true, + | AnyNodeRef::ExprIpyEscapeCommand(_) => true, AnyNodeRef::ModModule(_) | AnyNodeRef::ModExpression(_) @@ -3948,7 +3948,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtPass(_) | AnyNodeRef::StmtBreak(_) | AnyNodeRef::StmtContinue(_) - | AnyNodeRef::StmtLineMagic(_) + | AnyNodeRef::StmtIpyEscapeCommand(_) | AnyNodeRef::ExceptHandlerExceptHandler(_) | AnyNodeRef::PatternMatchValue(_) | AnyNodeRef::PatternMatchSingleton(_) @@ -4005,7 +4005,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtPass(_) | AnyNodeRef::StmtBreak(_) | AnyNodeRef::StmtContinue(_) - | AnyNodeRef::StmtLineMagic(_) + | AnyNodeRef::StmtIpyEscapeCommand(_) | AnyNodeRef::ExprBoolOp(_) | AnyNodeRef::ExprNamedExpr(_) | AnyNodeRef::ExprBinOp(_) @@ -4033,7 +4033,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprList(_) | AnyNodeRef::ExprTuple(_) | AnyNodeRef::ExprSlice(_) - | AnyNodeRef::ExprLineMagic(_) + | AnyNodeRef::ExprIpyEscapeCommand(_) | AnyNodeRef::ExceptHandlerExceptHandler(_) | AnyNodeRef::PatternMatchValue(_) | AnyNodeRef::PatternMatchSingleton(_) @@ -4099,7 +4099,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtPass(_) | AnyNodeRef::StmtBreak(_) | AnyNodeRef::StmtContinue(_) - | AnyNodeRef::StmtLineMagic(_) + | AnyNodeRef::StmtIpyEscapeCommand(_) | AnyNodeRef::ExprBoolOp(_) | AnyNodeRef::ExprNamedExpr(_) | AnyNodeRef::ExprBinOp(_) @@ -4127,7 +4127,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprList(_) | AnyNodeRef::ExprTuple(_) | AnyNodeRef::ExprSlice(_) - | AnyNodeRef::ExprLineMagic(_) + | AnyNodeRef::ExprIpyEscapeCommand(_) | AnyNodeRef::ExceptHandlerExceptHandler(_) | AnyNodeRef::Comprehension(_) | AnyNodeRef::Arguments(_) @@ -4178,7 +4178,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::StmtPass(_) | AnyNodeRef::StmtBreak(_) | AnyNodeRef::StmtContinue(_) - | AnyNodeRef::StmtLineMagic(_) + | AnyNodeRef::StmtIpyEscapeCommand(_) | AnyNodeRef::ExprBoolOp(_) | AnyNodeRef::ExprNamedExpr(_) | AnyNodeRef::ExprBinOp(_) @@ -4206,7 +4206,7 @@ impl AnyNodeRef<'_> { | AnyNodeRef::ExprList(_) | AnyNodeRef::ExprTuple(_) | AnyNodeRef::ExprSlice(_) - | AnyNodeRef::ExprLineMagic(_) + | AnyNodeRef::ExprIpyEscapeCommand(_) | AnyNodeRef::PatternMatchValue(_) | AnyNodeRef::PatternMatchSingleton(_) | AnyNodeRef::PatternMatchSequence(_) @@ -4429,9 +4429,9 @@ impl<'a> From<&'a ast::StmtContinue> for AnyNodeRef<'a> { } } -impl<'a> From<&'a ast::StmtLineMagic> for AnyNodeRef<'a> { - fn from(node: &'a ast::StmtLineMagic) -> Self { - AnyNodeRef::StmtLineMagic(node) +impl<'a> From<&'a ast::StmtIpyEscapeCommand> for AnyNodeRef<'a> { + fn from(node: &'a ast::StmtIpyEscapeCommand) -> Self { + AnyNodeRef::StmtIpyEscapeCommand(node) } } @@ -4597,9 +4597,9 @@ impl<'a> From<&'a ast::ExprSlice> for AnyNodeRef<'a> { } } -impl<'a> From<&'a ast::ExprLineMagic> for AnyNodeRef<'a> { - fn from(node: &'a ast::ExprLineMagic) -> Self { - AnyNodeRef::ExprLineMagic(node) +impl<'a> From<&'a ast::ExprIpyEscapeCommand> for AnyNodeRef<'a> { + fn from(node: &'a ast::ExprIpyEscapeCommand) -> Self { + AnyNodeRef::ExprIpyEscapeCommand(node) } } @@ -4714,7 +4714,7 @@ impl<'a> From<&'a Stmt> for AnyNodeRef<'a> { Stmt::Pass(node) => AnyNodeRef::StmtPass(node), Stmt::Break(node) => AnyNodeRef::StmtBreak(node), Stmt::Continue(node) => AnyNodeRef::StmtContinue(node), - Stmt::LineMagic(node) => AnyNodeRef::StmtLineMagic(node), + Stmt::IpyEscapeCommand(node) => AnyNodeRef::StmtIpyEscapeCommand(node), } } } @@ -4749,7 +4749,7 @@ impl<'a> From<&'a Expr> for AnyNodeRef<'a> { Expr::List(node) => AnyNodeRef::ExprList(node), Expr::Tuple(node) => AnyNodeRef::ExprTuple(node), Expr::Slice(node) => AnyNodeRef::ExprSlice(node), - Expr::LineMagic(node) => AnyNodeRef::ExprLineMagic(node), + Expr::IpyEscapeCommand(node) => AnyNodeRef::ExprIpyEscapeCommand(node), } } } @@ -4874,7 +4874,7 @@ impl Ranged for AnyNodeRef<'_> { AnyNodeRef::StmtPass(node) => node.range(), AnyNodeRef::StmtBreak(node) => node.range(), AnyNodeRef::StmtContinue(node) => node.range(), - AnyNodeRef::StmtLineMagic(node) => node.range(), + AnyNodeRef::StmtIpyEscapeCommand(node) => node.range(), AnyNodeRef::ExprBoolOp(node) => node.range(), AnyNodeRef::ExprNamedExpr(node) => node.range(), AnyNodeRef::ExprBinOp(node) => node.range(), @@ -4902,7 +4902,7 @@ impl Ranged for AnyNodeRef<'_> { AnyNodeRef::ExprList(node) => node.range(), AnyNodeRef::ExprTuple(node) => node.range(), AnyNodeRef::ExprSlice(node) => node.range(), - AnyNodeRef::ExprLineMagic(node) => node.range(), + AnyNodeRef::ExprIpyEscapeCommand(node) => node.range(), AnyNodeRef::ExceptHandlerExceptHandler(node) => node.range(), AnyNodeRef::PatternMatchValue(node) => node.range(), AnyNodeRef::PatternMatchSingleton(node) => node.range(), @@ -4958,7 +4958,7 @@ pub enum NodeKind { StmtImportFrom, StmtGlobal, StmtNonlocal, - StmtLineMagic, + StmtIpyEscapeCommand, StmtExpr, StmtPass, StmtBreak, @@ -4990,7 +4990,7 @@ pub enum NodeKind { ExprList, ExprTuple, ExprSlice, - ExprLineMagic, + ExprIpyEscapeCommand, ExceptHandlerExceptHandler, PatternMatchValue, PatternMatchSingleton, diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs index 94c93c82b1..46efa5b098 100644 --- a/crates/ruff_python_ast/src/nodes.rs +++ b/crates/ruff_python_ast/src/nodes.rs @@ -95,20 +95,20 @@ pub enum Stmt { Continue(StmtContinue), // Jupyter notebook specific - #[is(name = "line_magic_stmt")] - LineMagic(StmtLineMagic), + #[is(name = "ipy_escape_command_stmt")] + IpyEscapeCommand(StmtIpyEscapeCommand), } #[derive(Clone, Debug, PartialEq)] -pub struct StmtLineMagic { +pub struct StmtIpyEscapeCommand { pub range: TextRange, - pub kind: MagicKind, + pub kind: IpyEscapeKind, pub value: String, } -impl From for Stmt { - fn from(payload: StmtLineMagic) -> Self { - Stmt::LineMagic(payload) +impl From for Stmt { + fn from(payload: StmtIpyEscapeCommand) -> Self { + Stmt::IpyEscapeCommand(payload) } } @@ -570,20 +570,20 @@ pub enum Expr { Slice(ExprSlice), // Jupyter notebook specific - #[is(name = "line_magic_expr")] - LineMagic(ExprLineMagic), + #[is(name = "ipy_escape_command_expr")] + IpyEscapeCommand(ExprIpyEscapeCommand), } #[derive(Clone, Debug, PartialEq)] -pub struct ExprLineMagic { +pub struct ExprIpyEscapeCommand { pub range: TextRange, - pub kind: MagicKind, + pub kind: IpyEscapeKind, pub value: String, } -impl From for Expr { - fn from(payload: ExprLineMagic) -> Self { - Expr::LineMagic(payload) +impl From for Expr { + fn from(payload: ExprIpyEscapeCommand) -> Self { + Expr::IpyEscapeCommand(payload) } } @@ -2253,103 +2253,103 @@ impl Parameters { } } -/// The kind of magic command as defined in [IPython Syntax] in the IPython codebase. +/// The kind of escape command as defined in [IPython Syntax] in the IPython codebase. /// /// [IPython Syntax]: https://github.com/ipython/ipython/blob/635815e8f1ded5b764d66cacc80bbe25e9e2587f/IPython/core/inputtransformer2.py#L335-L343 #[derive(PartialEq, Eq, Debug, Clone, Hash, Copy)] -pub enum MagicKind { - /// Send line to underlying system shell. +pub enum IpyEscapeKind { + /// Send line to underlying system shell (`!`). Shell, - /// Send line to system shell and capture output. + /// Send line to system shell and capture output (`!!`). ShCap, - /// Show help on object. + /// Show help on object (`?`). Help, - /// Show help on object, with extra verbosity. + /// Show help on object, with extra verbosity (`??`). Help2, - /// Call magic function. + /// Call magic function (`%`). Magic, - /// Call cell magic function. + /// Call cell magic function (`%%`). Magic2, /// Call first argument with rest of line as arguments after splitting on whitespace - /// and quote each as string. + /// and quote each as string (`,`). Quote, - /// Call first argument with rest of line as an argument quoted as a single string. + /// Call first argument with rest of line as an argument quoted as a single string (`;`). Quote2, - /// Call first argument with rest of line as arguments. + /// Call first argument with rest of line as arguments (`/`). Paren, } -impl TryFrom for MagicKind { +impl TryFrom for IpyEscapeKind { type Error = String; fn try_from(ch: char) -> Result { match ch { - '!' => Ok(MagicKind::Shell), - '?' => Ok(MagicKind::Help), - '%' => Ok(MagicKind::Magic), - ',' => Ok(MagicKind::Quote), - ';' => Ok(MagicKind::Quote2), - '/' => Ok(MagicKind::Paren), + '!' => Ok(IpyEscapeKind::Shell), + '?' => Ok(IpyEscapeKind::Help), + '%' => Ok(IpyEscapeKind::Magic), + ',' => Ok(IpyEscapeKind::Quote), + ';' => Ok(IpyEscapeKind::Quote2), + '/' => Ok(IpyEscapeKind::Paren), _ => Err(format!("Unexpected magic escape: {ch}")), } } } -impl TryFrom<[char; 2]> for MagicKind { +impl TryFrom<[char; 2]> for IpyEscapeKind { type Error = String; fn try_from(ch: [char; 2]) -> Result { match ch { - ['!', '!'] => Ok(MagicKind::ShCap), - ['?', '?'] => Ok(MagicKind::Help2), - ['%', '%'] => Ok(MagicKind::Magic2), + ['!', '!'] => Ok(IpyEscapeKind::ShCap), + ['?', '?'] => Ok(IpyEscapeKind::Help2), + ['%', '%'] => Ok(IpyEscapeKind::Magic2), [c1, c2] => Err(format!("Unexpected magic escape: {c1}{c2}")), } } } -impl fmt::Display for MagicKind { +impl fmt::Display for IpyEscapeKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(self.as_str()) } } -impl MagicKind { - /// Returns the length of the magic command prefix. +impl IpyEscapeKind { + /// Returns the length of the escape kind token. pub fn prefix_len(self) -> TextSize { let len = match self { - MagicKind::Shell - | MagicKind::Magic - | MagicKind::Help - | MagicKind::Quote - | MagicKind::Quote2 - | MagicKind::Paren => 1, - MagicKind::ShCap | MagicKind::Magic2 | MagicKind::Help2 => 2, + IpyEscapeKind::Shell + | IpyEscapeKind::Magic + | IpyEscapeKind::Help + | IpyEscapeKind::Quote + | IpyEscapeKind::Quote2 + | IpyEscapeKind::Paren => 1, + IpyEscapeKind::ShCap | IpyEscapeKind::Magic2 | IpyEscapeKind::Help2 => 2, }; len.into() } - /// Returns `true` if the kind is a help command i.e., `?` or `??`. + /// Returns `true` if the escape kind is help i.e., `?` or `??`. pub const fn is_help(self) -> bool { - matches!(self, MagicKind::Help | MagicKind::Help2) + matches!(self, IpyEscapeKind::Help | IpyEscapeKind::Help2) } - /// Returns `true` if the kind is a magic command i.e., `%` or `%%`. + /// Returns `true` if the escape kind is magic i.e., `%` or `%%`. pub const fn is_magic(self) -> bool { - matches!(self, MagicKind::Magic | MagicKind::Magic2) + matches!(self, IpyEscapeKind::Magic | IpyEscapeKind::Magic2) } pub fn as_str(self) -> &'static str { match self { - MagicKind::Shell => "!", - MagicKind::ShCap => "!!", - MagicKind::Help => "?", - MagicKind::Help2 => "??", - MagicKind::Magic => "%", - MagicKind::Magic2 => "%%", - MagicKind::Quote => ",", - MagicKind::Quote2 => ";", - MagicKind::Paren => "/", + IpyEscapeKind::Shell => "!", + IpyEscapeKind::ShCap => "!!", + IpyEscapeKind::Help => "?", + IpyEscapeKind::Help2 => "??", + IpyEscapeKind::Magic => "%", + IpyEscapeKind::Magic2 => "%%", + IpyEscapeKind::Quote => ",", + IpyEscapeKind::Quote2 => ";", + IpyEscapeKind::Paren => "/", } } } @@ -2686,7 +2686,7 @@ impl Ranged for crate::nodes::StmtContinue { self.range } } -impl Ranged for StmtLineMagic { +impl Ranged for StmtIpyEscapeCommand { fn range(&self) -> TextRange { self.range } @@ -2719,7 +2719,7 @@ impl Ranged for crate::Stmt { Self::Pass(node) => node.range(), Self::Break(node) => node.range(), Self::Continue(node) => node.range(), - Stmt::LineMagic(node) => node.range(), + Stmt::IpyEscapeCommand(node) => node.range(), } } } @@ -2859,7 +2859,7 @@ impl Ranged for crate::nodes::ExprSlice { self.range } } -impl Ranged for ExprLineMagic { +impl Ranged for ExprIpyEscapeCommand { fn range(&self) -> TextRange { self.range } @@ -2894,7 +2894,7 @@ impl Ranged for crate::Expr { Self::List(node) => node.range(), Self::Tuple(node) => node.range(), Self::Slice(node) => node.range(), - Expr::LineMagic(node) => node.range(), + Expr::IpyEscapeCommand(node) => node.range(), } } } diff --git a/crates/ruff_python_ast/src/relocate.rs b/crates/ruff_python_ast/src/relocate.rs index daf02214b0..292101e664 100644 --- a/crates/ruff_python_ast/src/relocate.rs +++ b/crates/ruff_python_ast/src/relocate.rs @@ -199,7 +199,7 @@ pub fn relocate_expr(expr: &mut Expr, location: TextRange) { relocate_expr(expr, location); } } - Expr::LineMagic(nodes::ExprLineMagic { range, .. }) => { + Expr::IpyEscapeCommand(nodes::ExprIpyEscapeCommand { range, .. }) => { *range = location; } } diff --git a/crates/ruff_python_ast/src/visitor.rs b/crates/ruff_python_ast/src/visitor.rs index 527c7e187a..a4a517026b 100644 --- a/crates/ruff_python_ast/src/visitor.rs +++ b/crates/ruff_python_ast/src/visitor.rs @@ -312,7 +312,7 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) { Stmt::Global(_) => {} Stmt::Nonlocal(_) => {} Stmt::Expr(ast::StmtExpr { value, range: _ }) => visitor.visit_expr(value), - Stmt::Pass(_) | Stmt::Break(_) | Stmt::Continue(_) | Stmt::LineMagic(_) => {} + Stmt::Pass(_) | Stmt::Break(_) | Stmt::Continue(_) | Stmt::IpyEscapeCommand(_) => {} } } @@ -543,7 +543,7 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) { visitor.visit_expr(expr); } } - Expr::LineMagic(_) => {} + Expr::IpyEscapeCommand(_) => {} } } diff --git a/crates/ruff_python_ast/src/visitor/preorder.rs b/crates/ruff_python_ast/src/visitor/preorder.rs index 1e18bf2544..b96b5228b1 100644 --- a/crates/ruff_python_ast/src/visitor/preorder.rs +++ b/crates/ruff_python_ast/src/visitor/preorder.rs @@ -418,7 +418,7 @@ where | Stmt::Continue(_) | Stmt::Global(_) | Stmt::Nonlocal(_) - | Stmt::LineMagic(_) => {} + | Stmt::IpyEscapeCommand(_) => {} } } @@ -719,7 +719,7 @@ where visitor.visit_expr(expr); } } - Expr::LineMagic(_) => (), + Expr::IpyEscapeCommand(_) => (), } } diff --git a/crates/ruff_python_codegen/src/generator.rs b/crates/ruff_python_codegen/src/generator.rs index e67b76d2d7..65a1280272 100644 --- a/crates/ruff_python_codegen/src/generator.rs +++ b/crates/ruff_python_codegen/src/generator.rs @@ -656,7 +656,7 @@ impl<'a> Generator<'a> { self.p("continue"); }); } - Stmt::LineMagic(ast::StmtLineMagic { kind, value, .. }) => { + Stmt::IpyEscapeCommand(ast::StmtIpyEscapeCommand { kind, value, .. }) => { statement!({ self.p(&format!("{kind}{value}")); }); @@ -1184,7 +1184,7 @@ impl<'a> Generator<'a> { self.unparse_expr(step, precedence::SLICE); } } - Expr::LineMagic(ast::ExprLineMagic { kind, value, .. }) => { + Expr::IpyEscapeCommand(ast::ExprIpyEscapeCommand { kind, value, .. }) => { self.p(&format!("{kind}{value}")); } } diff --git a/crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs b/crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs new file mode 100644 index 0000000000..ab087df685 --- /dev/null +++ b/crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs @@ -0,0 +1,12 @@ +use crate::{verbatim_text, FormatNodeRule, PyFormatter}; +use ruff_formatter::{write, Buffer, FormatResult}; +use ruff_python_ast::ExprIpyEscapeCommand; + +#[derive(Default)] +pub struct FormatExprIpyEscapeCommand; + +impl FormatNodeRule for FormatExprIpyEscapeCommand { + fn fmt_fields(&self, item: &ExprIpyEscapeCommand, f: &mut PyFormatter) -> FormatResult<()> { + write!(f, [verbatim_text(item)]) + } +} diff --git a/crates/ruff_python_formatter/src/expression/expr_line_magic.rs b/crates/ruff_python_formatter/src/expression/expr_line_magic.rs deleted file mode 100644 index 5d1d93d565..0000000000 --- a/crates/ruff_python_formatter/src/expression/expr_line_magic.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::{verbatim_text, FormatNodeRule, PyFormatter}; -use ruff_formatter::{write, Buffer, FormatResult}; -use ruff_python_ast::ExprLineMagic; - -#[derive(Default)] -pub struct FormatExprLineMagic; - -impl FormatNodeRule for FormatExprLineMagic { - fn fmt_fields(&self, item: &ExprLineMagic, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [verbatim_text(item)]) - } -} diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index 8fc5fe6a04..672e7f4c72 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -31,8 +31,8 @@ pub(crate) mod expr_f_string; pub(crate) mod expr_formatted_value; pub(crate) mod expr_generator_exp; pub(crate) mod expr_if_exp; +pub(crate) mod expr_ipy_escape_command; pub(crate) mod expr_lambda; -pub(crate) mod expr_line_magic; pub(crate) mod expr_list; pub(crate) mod expr_list_comp; pub(crate) mod expr_name; @@ -102,7 +102,7 @@ impl FormatRule> for FormatExpr { Expr::List(expr) => expr.format().fmt(f), Expr::Tuple(expr) => expr.format().fmt(f), Expr::Slice(expr) => expr.format().fmt(f), - Expr::LineMagic(_) => todo!(), + Expr::IpyEscapeCommand(_) => todo!(), }); let parenthesize = match parentheses { @@ -240,7 +240,7 @@ impl NeedsParentheses for Expr { Expr::List(expr) => expr.needs_parentheses(parent, context), Expr::Tuple(expr) => expr.needs_parentheses(parent, context), Expr::Slice(expr) => expr.needs_parentheses(parent, context), - Expr::LineMagic(_) => todo!(), + Expr::IpyEscapeCommand(_) => todo!(), } } } @@ -434,7 +434,7 @@ impl<'input> CanOmitOptionalParenthesesVisitor<'input> { | Expr::Starred(_) | Expr::Name(_) | Expr::Slice(_) => {} - Expr::LineMagic(_) => todo!(), + Expr::IpyEscapeCommand(_) => todo!(), }; walk_expr(self, expr); diff --git a/crates/ruff_python_formatter/src/generated.rs b/crates/ruff_python_formatter/src/generated.rs index b5c3e08042..13617df622 100644 --- a/crates/ruff_python_formatter/src/generated.rs +++ b/crates/ruff_python_formatter/src/generated.rs @@ -930,38 +930,38 @@ impl<'ast> IntoFormat> for ast::StmtContinue { } } -impl FormatRule> - for crate::statement::stmt_line_magic::FormatStmtLineMagic +impl FormatRule> + for crate::statement::stmt_ipy_escape_command::FormatStmtIpyEscapeCommand { #[inline] - fn fmt(&self, node: &ast::StmtLineMagic, f: &mut PyFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) + fn fmt(&self, node: &ast::StmtIpyEscapeCommand, f: &mut PyFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) } } -impl<'ast> AsFormat> for ast::StmtLineMagic { +impl<'ast> AsFormat> for ast::StmtIpyEscapeCommand { type Format<'a> = FormatRefWithRule< 'a, - ast::StmtLineMagic, - crate::statement::stmt_line_magic::FormatStmtLineMagic, + ast::StmtIpyEscapeCommand, + crate::statement::stmt_ipy_escape_command::FormatStmtIpyEscapeCommand, PyFormatContext<'ast>, >; fn format(&self) -> Self::Format<'_> { FormatRefWithRule::new( self, - crate::statement::stmt_line_magic::FormatStmtLineMagic::default(), + crate::statement::stmt_ipy_escape_command::FormatStmtIpyEscapeCommand::default(), ) } } -impl<'ast> IntoFormat> for ast::StmtLineMagic { +impl<'ast> IntoFormat> for ast::StmtIpyEscapeCommand { type Format = FormatOwnedWithRule< - ast::StmtLineMagic, - crate::statement::stmt_line_magic::FormatStmtLineMagic, + ast::StmtIpyEscapeCommand, + crate::statement::stmt_ipy_escape_command::FormatStmtIpyEscapeCommand, PyFormatContext<'ast>, >; fn into_format(self) -> Self::Format { FormatOwnedWithRule::new( self, - crate::statement::stmt_line_magic::FormatStmtLineMagic::default(), + crate::statement::stmt_ipy_escape_command::FormatStmtIpyEscapeCommand::default(), ) } } @@ -1930,38 +1930,38 @@ impl<'ast> IntoFormat> for ast::ExprSlice { } } -impl FormatRule> - for crate::expression::expr_line_magic::FormatExprLineMagic +impl FormatRule> + for crate::expression::expr_ipy_escape_command::FormatExprIpyEscapeCommand { #[inline] - fn fmt(&self, node: &ast::ExprLineMagic, f: &mut PyFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) + fn fmt(&self, node: &ast::ExprIpyEscapeCommand, f: &mut PyFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) } } -impl<'ast> AsFormat> for ast::ExprLineMagic { +impl<'ast> AsFormat> for ast::ExprIpyEscapeCommand { type Format<'a> = FormatRefWithRule< 'a, - ast::ExprLineMagic, - crate::expression::expr_line_magic::FormatExprLineMagic, + ast::ExprIpyEscapeCommand, + crate::expression::expr_ipy_escape_command::FormatExprIpyEscapeCommand, PyFormatContext<'ast>, >; fn format(&self) -> Self::Format<'_> { FormatRefWithRule::new( self, - crate::expression::expr_line_magic::FormatExprLineMagic::default(), + crate::expression::expr_ipy_escape_command::FormatExprIpyEscapeCommand::default(), ) } } -impl<'ast> IntoFormat> for ast::ExprLineMagic { +impl<'ast> IntoFormat> for ast::ExprIpyEscapeCommand { type Format = FormatOwnedWithRule< - ast::ExprLineMagic, - crate::expression::expr_line_magic::FormatExprLineMagic, + ast::ExprIpyEscapeCommand, + crate::expression::expr_ipy_escape_command::FormatExprIpyEscapeCommand, PyFormatContext<'ast>, >; fn into_format(self) -> Self::Format { FormatOwnedWithRule::new( self, - crate::expression::expr_line_magic::FormatExprLineMagic::default(), + crate::expression::expr_ipy_escape_command::FormatExprIpyEscapeCommand::default(), ) } } diff --git a/crates/ruff_python_formatter/src/statement/mod.rs b/crates/ruff_python_formatter/src/statement/mod.rs index 1a92f03e39..aeaf272ab7 100644 --- a/crates/ruff_python_formatter/src/statement/mod.rs +++ b/crates/ruff_python_formatter/src/statement/mod.rs @@ -17,7 +17,7 @@ pub(crate) mod stmt_global; pub(crate) mod stmt_if; pub(crate) mod stmt_import; pub(crate) mod stmt_import_from; -pub(crate) mod stmt_line_magic; +pub(crate) mod stmt_ipy_escape_command; pub(crate) mod stmt_match; pub(crate) mod stmt_nonlocal; pub(crate) mod stmt_pass; @@ -61,7 +61,7 @@ impl FormatRule> for FormatStmt { Stmt::Break(x) => x.format().fmt(f), Stmt::Continue(x) => x.format().fmt(f), Stmt::TypeAlias(x) => x.format().fmt(f), - Stmt::LineMagic(_) => todo!(), + Stmt::IpyEscapeCommand(_) => todo!(), } } } diff --git a/crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs b/crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs new file mode 100644 index 0000000000..008c22b793 --- /dev/null +++ b/crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs @@ -0,0 +1,12 @@ +use crate::{verbatim_text, FormatNodeRule, PyFormatter}; +use ruff_formatter::{write, Buffer, FormatResult}; +use ruff_python_ast::StmtIpyEscapeCommand; + +#[derive(Default)] +pub struct FormatStmtIpyEscapeCommand; + +impl FormatNodeRule for FormatStmtIpyEscapeCommand { + fn fmt_fields(&self, item: &StmtIpyEscapeCommand, f: &mut PyFormatter) -> FormatResult<()> { + write!(f, [verbatim_text(item)]) + } +} diff --git a/crates/ruff_python_formatter/src/statement/stmt_line_magic.rs b/crates/ruff_python_formatter/src/statement/stmt_line_magic.rs deleted file mode 100644 index 906bd9a148..0000000000 --- a/crates/ruff_python_formatter/src/statement/stmt_line_magic.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::{verbatim_text, FormatNodeRule, PyFormatter}; -use ruff_formatter::{write, Buffer, FormatResult}; -use ruff_python_ast::StmtLineMagic; - -#[derive(Default)] -pub struct FormatStmtLineMagic; - -impl FormatNodeRule for FormatStmtLineMagic { - fn fmt_fields(&self, item: &StmtLineMagic, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [verbatim_text(item)]) - } -} diff --git a/crates/ruff_python_parser/src/lexer.rs b/crates/ruff_python_parser/src/lexer.rs index 2366471179..6bb9c79e55 100644 --- a/crates/ruff_python_parser/src/lexer.rs +++ b/crates/ruff_python_parser/src/lexer.rs @@ -34,7 +34,7 @@ use std::{char, cmp::Ordering, str::FromStr}; use num_bigint::BigInt; use num_traits::{Num, Zero}; -use ruff_python_ast::MagicKind; +use ruff_python_ast::IpyEscapeKind; use ruff_text_size::{TextLen, TextRange, TextSize}; use unic_emoji_char::is_emoji_presentation; use unic_ucd_ident::{is_xid_continue, is_xid_start}; @@ -398,8 +398,8 @@ impl<'source> Lexer<'source> { Tok::Comment(self.token_text().to_string()) } - /// Lex a single magic command. - fn lex_magic_command(&mut self, kind: MagicKind) -> Tok { + /// Lex a single IPython escape command. + fn lex_ipython_escape_command(&mut self, escape_kind: IpyEscapeKind) -> Tok { let mut value = String::new(); loop { @@ -457,7 +457,7 @@ impl<'source> Lexer<'source> { // Now, the whitespace and empty value check also makes sure that an empty // command (e.g. `%?` or `? ??`, no value after/between the escape tokens) // is not recognized as a help end escape command. So, `%?` and `? ??` are - // `MagicKind::Magic` and `MagicKind::Help` because of the initial `%` and `??` + // `IpyEscapeKind::Magic` and `IpyEscapeKind::Help` because of the initial `%` and `??` // tokens. if question_count > 2 || value.chars().last().map_or(true, is_python_whitespace) @@ -471,31 +471,34 @@ impl<'source> Lexer<'source> { continue; } - if kind.is_help() { + if escape_kind.is_help() { // If we've recognize this as a help end escape command, then // any question mark token / whitespaces at the start are not // considered as part of the value. // - // For example, `??foo?` is recognized as `MagicKind::Help` and + // For example, `??foo?` is recognized as `IpyEscapeKind::Help` and // `value` is `foo` instead of `??foo`. value = value.trim_start_matches([' ', '?']).to_string(); - } else if kind.is_magic() { + } else if escape_kind.is_magic() { // Between `%` and `?` (at the end), the `?` takes priority - // over the `%` so `%foo?` is recognized as `MagicKind::Help` + // over the `%` so `%foo?` is recognized as `IpyEscapeKind::Help` // and `value` is `%foo` instead of `foo`. So, we need to // insert the magic escape token at the start. - value.insert_str(0, kind.as_str()); + value.insert_str(0, escape_kind.as_str()); } let kind = match question_count { - 1 => MagicKind::Help, - 2 => MagicKind::Help2, + 1 => IpyEscapeKind::Help, + 2 => IpyEscapeKind::Help2, _ => unreachable!("`question_count` is always 1 or 2"), }; - return Tok::MagicCommand { kind, value }; + return Tok::IpyEscapeCommand { kind, value }; } '\n' | '\r' | EOF_CHAR => { - return Tok::MagicCommand { kind, value }; + return Tok::IpyEscapeCommand { + kind: escape_kind, + value, + }; } c => { self.cursor.bump(); @@ -763,22 +766,22 @@ impl<'source> Lexer<'source> { && self.state.is_after_equal() && self.nesting == 0 => { - // SAFETY: Safe because `c` has been matched against one of the possible magic command prefix - self.lex_magic_command(MagicKind::try_from(c).unwrap()) + // SAFETY: Safe because `c` has been matched against one of the possible escape command token + self.lex_ipython_escape_command(IpyEscapeKind::try_from(c).unwrap()) } c @ ('%' | '!' | '?' | '/' | ';' | ',') if self.mode == Mode::Jupyter && self.state.is_new_logical_line() => { - let kind = if let Ok(kind) = MagicKind::try_from([c, self.cursor.first()]) { + let kind = if let Ok(kind) = IpyEscapeKind::try_from([c, self.cursor.first()]) { self.cursor.bump(); kind } else { - // SAFETY: Safe because `c` has been matched against one of the possible magic command prefix - MagicKind::try_from(c).unwrap() + // SAFETY: Safe because `c` has been matched against one of the possible escape command token + IpyEscapeKind::try_from(c).unwrap() }; - self.lex_magic_command(kind) + self.lex_ipython_escape_command(kind) } '?' if self.mode == Mode::Jupyter => Tok::Question, @@ -1208,7 +1211,7 @@ const fn is_python_whitespace(c: char) -> bool { #[cfg(test)] mod tests { use num_bigint::BigInt; - use ruff_python_ast::MagicKind; + use ruff_python_ast::IpyEscapeKind; use super::*; @@ -1242,15 +1245,15 @@ mod tests { } } - fn assert_jupyter_magic_line_continuation_with_eol(eol: &str) { + fn assert_ipython_escape_command_line_continuation_with_eol(eol: &str) { let source = format!("%matplotlib \\{eol} --inline"); let tokens = lex_jupyter_source(&source); assert_eq!( tokens, vec![ - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "matplotlib --inline".to_string(), - kind: MagicKind::Magic + kind: IpyEscapeKind::Magic }, Tok::Newline ] @@ -1258,29 +1261,29 @@ mod tests { } #[test] - fn test_jupyter_magic_line_continuation_unix_eol() { - assert_jupyter_magic_line_continuation_with_eol(UNIX_EOL); + fn test_ipython_escape_command_line_continuation_unix_eol() { + assert_ipython_escape_command_line_continuation_with_eol(UNIX_EOL); } #[test] - fn test_jupyter_magic_line_continuation_mac_eol() { - assert_jupyter_magic_line_continuation_with_eol(MAC_EOL); + fn test_ipython_escape_command_line_continuation_mac_eol() { + assert_ipython_escape_command_line_continuation_with_eol(MAC_EOL); } #[test] - fn test_jupyter_magic_line_continuation_windows_eol() { - assert_jupyter_magic_line_continuation_with_eol(WINDOWS_EOL); + fn test_ipython_escape_command_line_continuation_windows_eol() { + assert_ipython_escape_command_line_continuation_with_eol(WINDOWS_EOL); } - fn assert_jupyter_magic_line_continuation_with_eol_and_eof(eol: &str) { + fn assert_ipython_escape_command_line_continuation_with_eol_and_eof(eol: &str) { let source = format!("%matplotlib \\{eol}"); let tokens = lex_jupyter_source(&source); assert_eq!( tokens, vec![ - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "matplotlib ".to_string(), - kind: MagicKind::Magic + kind: IpyEscapeKind::Magic }, Tok::Newline ] @@ -1288,70 +1291,70 @@ mod tests { } #[test] - fn test_jupyter_magic_line_continuation_unix_eol_and_eof() { - assert_jupyter_magic_line_continuation_with_eol_and_eof(UNIX_EOL); + fn test_ipython_escape_command_line_continuation_unix_eol_and_eof() { + assert_ipython_escape_command_line_continuation_with_eol_and_eof(UNIX_EOL); } #[test] - fn test_jupyter_magic_line_continuation_mac_eol_and_eof() { - assert_jupyter_magic_line_continuation_with_eol_and_eof(MAC_EOL); + fn test_ipython_escape_command_line_continuation_mac_eol_and_eof() { + assert_ipython_escape_command_line_continuation_with_eol_and_eof(MAC_EOL); } #[test] - fn test_jupyter_magic_line_continuation_windows_eol_and_eof() { - assert_jupyter_magic_line_continuation_with_eol_and_eof(WINDOWS_EOL); + fn test_ipython_escape_command_line_continuation_windows_eol_and_eof() { + assert_ipython_escape_command_line_continuation_with_eol_and_eof(WINDOWS_EOL); } #[test] - fn test_empty_jupyter_magic() { + fn test_empty_ipython_escape_command() { let source = "%\n%%\n!\n!!\n?\n??\n/\n,\n;"; let tokens = lex_jupyter_source(source); assert_eq!( tokens, vec![ - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Magic2, + kind: IpyEscapeKind::Magic2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Shell, + kind: IpyEscapeKind::Shell, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::ShCap, + kind: IpyEscapeKind::ShCap, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Paren, + kind: IpyEscapeKind::Paren, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Quote, + kind: IpyEscapeKind::Quote, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: String::new(), - kind: MagicKind::Quote2, + kind: IpyEscapeKind::Quote2, }, Tok::Newline, ] @@ -1359,7 +1362,7 @@ mod tests { } #[test] - fn test_jupyter_magic() { + fn test_ipython_escape_command() { let source = r" ?foo ??foo @@ -1380,59 +1383,59 @@ mod tests { assert_eq!( tokens, vec![ - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "timeit a = b".to_string(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "timeit a % 3".to_string(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "matplotlib --inline".to_string(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "pwd && ls -a | sed 's/^/\\\\ /'".to_string(), - kind: MagicKind::Shell, + kind: IpyEscapeKind::Shell, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "cd /Users/foo/Library/Application\\ Support/".to_string(), - kind: MagicKind::ShCap, + kind: IpyEscapeKind::ShCap, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo 1 2".to_string(), - kind: MagicKind::Paren, + kind: IpyEscapeKind::Paren, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo 1 2".to_string(), - kind: MagicKind::Quote, + kind: IpyEscapeKind::Quote, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo 1 2".to_string(), - kind: MagicKind::Quote2, + kind: IpyEscapeKind::Quote2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "ls".to_string(), - kind: MagicKind::Shell, + kind: IpyEscapeKind::Shell, }, Tok::Newline, ] @@ -1440,7 +1443,7 @@ mod tests { } #[test] - fn test_jupyter_magic_help_end() { + fn test_ipython_help_end_escape_command() { let source = r" ?foo? ?? foo? @@ -1465,84 +1468,84 @@ mod tests { assert_eq!( tokens, [ - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: " foo ?".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo???".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "?foo???".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo".to_string(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: " ?".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "??".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "%foo".to_string(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "%foo".to_string(), - kind: MagicKind::Help2, + kind: IpyEscapeKind::Help2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "foo???".to_string(), - kind: MagicKind::Magic2, + kind: IpyEscapeKind::Magic2, }, Tok::Newline, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "pwd".to_string(), - kind: MagicKind::Help, + kind: IpyEscapeKind::Help, }, Tok::Newline, ] @@ -1550,7 +1553,7 @@ mod tests { } #[test] - fn test_jupyter_magic_indentation() { + fn test_ipython_escape_command_indentation() { let source = r" if True: %matplotlib \ @@ -1565,9 +1568,9 @@ if True: Tok::Colon, Tok::Newline, Tok::Indent, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "matplotlib --inline".to_string(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, Tok::Dedent, @@ -1576,7 +1579,7 @@ if True: } #[test] - fn test_jupyter_magic_assignment() { + fn test_ipython_escape_command_assignment() { let source = r" pwd = !pwd foo = %timeit a = b @@ -1592,54 +1595,54 @@ baz = %matplotlib \ name: "pwd".to_string() }, Tok::Equal, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "pwd".to_string(), - kind: MagicKind::Shell, + kind: IpyEscapeKind::Shell, }, Tok::Newline, Tok::Name { name: "foo".to_string() }, Tok::Equal, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "timeit a = b".to_string(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, Tok::Name { name: "bar".to_string() }, Tok::Equal, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "timeit a % 3".to_string(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, Tok::Name { name: "baz".to_string() }, Tok::Equal, - Tok::MagicCommand { + Tok::IpyEscapeCommand { value: "matplotlib inline".to_string(), - kind: MagicKind::Magic, + kind: IpyEscapeKind::Magic, }, Tok::Newline, ] ); } - fn assert_no_jupyter_magic(tokens: &[Tok]) { + fn assert_no_ipython_escape_command(tokens: &[Tok]) { for tok in tokens { - if let Tok::MagicCommand { .. } = tok { - panic!("Unexpected magic command token: {tok:?}") + if let Tok::IpyEscapeCommand { .. } = tok { + panic!("Unexpected escape command token: {tok:?}") } } } #[test] - fn test_jupyter_magic_not_an_assignment() { + fn test_ipython_escape_command_not_an_assignment() { let source = r" -# Other magic kinds are not valid here (can't test `foo = ?str` because '?' is not a valid token) +# Other escape kinds are not valid here (can't test `foo = ?str` because '?' is not a valid token) foo = /func foo = ;func foo = ,func @@ -1650,7 +1653,7 @@ def f(arg=%timeit a = b): pass" .trim(); let tokens = lex_jupyter_source(source); - assert_no_jupyter_magic(&tokens); + assert_no_ipython_escape_command(&tokens); } #[test] diff --git a/crates/ruff_python_parser/src/parser.rs b/crates/ruff_python_parser/src/parser.rs index b1b5b4488e..f87093ccaf 100644 --- a/crates/ruff_python_parser/src/parser.rs +++ b/crates/ruff_python_parser/src/parser.rs @@ -117,7 +117,7 @@ pub fn parse_expression_starts_at( /// /// This function is the most general function to parse Python code. Based on the [`Mode`] supplied, /// it can be used to parse a single expression, a full Python program, an interactive expression -/// or a Python program containing Jupyter magics. +/// or a Python program containing IPython escape commands. /// /// # Example /// @@ -146,7 +146,7 @@ pub fn parse_expression_starts_at( /// assert!(program.is_ok()); /// ``` /// -/// Additionally, we can parse a Python program containing Jupyter magics: +/// Additionally, we can parse a Python program containing IPython escapes: /// /// ``` /// use ruff_python_parser::{Mode, parse}; @@ -1122,7 +1122,7 @@ class Abcd: } #[test] - fn test_jupyter_magic() { + fn test_ipython_escape_commands() { let parse_ast = parse( r#" # Normal Python code @@ -1169,7 +1169,7 @@ def foo(): ;foo 1 2 ,foo 1 2 -# Indented magic +# Indented escape commands for a in range(5): !ls @@ -1199,7 +1199,7 @@ foo.bar[0].baz[2].egg?? } #[test] - fn test_jupyter_magic_parse_error() { + fn test_ipython_escape_command_parse_error() { let source = r#" a = 1 %timeit a == 1 @@ -1209,7 +1209,7 @@ a = 1 let parse_err = parse_tokens(lxr, Mode::Module, "").unwrap_err(); assert_eq!( parse_err.to_string(), - "line magics are only allowed in Jupyter mode at byte offset 6".to_string() + "IPython escape commands are only allowed in Jupyter mode at byte offset 6".to_string() ); } } diff --git a/crates/ruff_python_parser/src/python.lalrpop b/crates/ruff_python_parser/src/python.lalrpop index a98a2317f3..15ab75db65 100644 --- a/crates/ruff_python_parser/src/python.lalrpop +++ b/crates/ruff_python_parser/src/python.lalrpop @@ -5,7 +5,7 @@ use num_bigint::BigInt; use ruff_text_size::TextSize; -use ruff_python_ast::{self as ast, Ranged, MagicKind}; +use ruff_python_ast::{self as ast, Ranged, IpyEscapeKind}; use crate::{ Mode, lexer::{LexicalError, LexicalErrorType}, @@ -89,8 +89,8 @@ SmallStatement: ast::Stmt = { NonlocalStatement, AssertStatement, TypeAliasStatement, - LineMagicStatement, - HelpEndLineMagic, + IpyEscapeCommandStatement, + IpyHelpEndEscapeCommandStatement, }; PassStatement: ast::Stmt = { @@ -155,7 +155,7 @@ ExpressionStatement: ast::Stmt = { AssignSuffix: ast::Expr = { "=" => e, - "=" => e + "=" => e }; TestListOrYieldExpr: ast::Expr = { @@ -323,52 +323,52 @@ AssertStatement: ast::Stmt = { }, }; -LineMagicStatement: ast::Stmt = { - =>? { +IpyEscapeCommandStatement: ast::Stmt = { + =>? { if mode == Mode::Jupyter { - Ok(ast::Stmt::LineMagic( - ast::StmtLineMagic { - kind: m.0, - value: m.1, + Ok(ast::Stmt::IpyEscapeCommand( + ast::StmtIpyEscapeCommand { + kind: c.0, + value: c.1, range: (location..end_location).into() } )) } else { Err(LexicalError { - error: LexicalErrorType::OtherError("line magics are only allowed in Jupyter mode".to_string()), + error: LexicalErrorType::OtherError("IPython escape commands are only allowed in Jupyter mode".to_string()), location, })? } } } -LineMagicExpr: ast::Expr = { - =>? { +IpyEscapeCommandExpr: ast::Expr = { + =>? { if mode == Mode::Jupyter { // This should never occur as the lexer won't allow it. - if !matches!(m.0, MagicKind::Magic | MagicKind::Shell) { + if !matches!(c.0, IpyEscapeKind::Magic | IpyEscapeKind::Shell) { return Err(LexicalError { - error: LexicalErrorType::OtherError("expr line magics are only allowed for % and !".to_string()), + error: LexicalErrorType::OtherError("IPython escape command expr is only allowed for % and !".to_string()), location, })?; } - Ok(ast::Expr::LineMagic( - ast::ExprLineMagic { - kind: m.0, - value: m.1, + Ok(ast::Expr::IpyEscapeCommand( + ast::ExprIpyEscapeCommand { + kind: c.0, + value: c.1, range: (location..end_location).into() } )) } else { Err(LexicalError { - error: LexicalErrorType::OtherError("line magics are only allowed in Jupyter mode".to_string()), + error: LexicalErrorType::OtherError("IPython escape commands are only allowed in Jupyter mode".to_string()), location, })? } } } -HelpEndLineMagic: ast::Stmt = { +IpyHelpEndEscapeCommandStatement: ast::Stmt = { // We are permissive than the original implementation because we would allow whitespace // between the expression and the suffix while the IPython implementation doesn't allow it. // For example, `foo ?` would be valid in our case but invalid from IPython. @@ -404,7 +404,7 @@ HelpEndLineMagic: ast::Stmt = { } Ok(()) } - + if mode != Mode::Jupyter { return Err(ParseError::User { error: LexicalError { @@ -415,8 +415,8 @@ HelpEndLineMagic: ast::Stmt = { } let kind = match suffix.len() { - 1 => MagicKind::Help, - 2 => MagicKind::Help2, + 1 => IpyEscapeKind::Help, + 2 => IpyEscapeKind::Help2, _ => { return Err(ParseError::User { error: LexicalError { @@ -429,9 +429,9 @@ HelpEndLineMagic: ast::Stmt = { let mut value = String::new(); unparse_expr(&e, &mut value)?; - - Ok(ast::Stmt::LineMagic( - ast::StmtLineMagic { + + Ok(ast::Stmt::IpyEscapeCommand( + ast::StmtIpyEscapeCommand { kind, value, range: (location..end_location).into() @@ -1900,8 +1900,8 @@ extern { triple_quoted: }, name => token::Tok::Name { name: }, - line_magic => token::Tok::MagicCommand { - kind: , + ipy_escape_command => token::Tok::IpyEscapeCommand { + kind: , value: }, "\n" => token::Tok::Newline, diff --git a/crates/ruff_python_parser/src/python.rs b/crates/ruff_python_parser/src/python.rs index da4a9a1ce9..209f8c89a1 100644 --- a/crates/ruff_python_parser/src/python.rs +++ b/crates/ruff_python_parser/src/python.rs @@ -1,8 +1,8 @@ // auto-generated: "lalrpop 0.20.0" -// sha3: dec845ec3261934e0c3a17a15f53b12d397b19cee9a45f9d8868c93484de3fe3 +// sha3: eea7f30d1f9d5648f73bb9aeb9c0d61be448c1d648b743eb3155da459e4e6038 use num_bigint::BigInt; use ruff_text_size::TextSize; -use ruff_python_ast::{self as ast, Ranged, MagicKind}; +use ruff_python_ast::{self as ast, Ranged, IpyEscapeKind}; use crate::{ Mode, lexer::{LexicalError, LexicalErrorType}, @@ -25,7 +25,7 @@ mod __parse__Top { use num_bigint::BigInt; use ruff_text_size::TextSize; - use ruff_python_ast::{self as ast, Ranged, MagicKind}; + use ruff_python_ast::{self as ast, Ranged, IpyEscapeKind}; use crate::{ Mode, lexer::{LexicalError, LexicalErrorType}, @@ -49,7 +49,7 @@ mod __parse__Top { Variant1((f64, f64)), Variant2(f64), Variant3(BigInt), - Variant4((MagicKind, String)), + Variant4((IpyEscapeKind, String)), Variant5(String), Variant6((String, StringKind, bool)), Variant7(core::option::Option), @@ -224,7 +224,7 @@ mod __parse__Top { // State 40 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, -752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 41 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 42 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 447, 0, 0, 448, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 451, 452, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 453, 0, 0, 0, 0, 454, 455, 456, 0, 457, 458, // State 43 @@ -394,7 +394,7 @@ mod __parse__Top { // State 125 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 126 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, // State 127 -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 128 @@ -616,13 +616,13 @@ mod __parse__Top { // State 236 0, 0, 0, 0, 0, 0, 0, -674, 0, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 237 - 0, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, + 0, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, -496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 238 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 239 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, // State 240 - -471, 0, 0, 0, 0, 0, -471, 0, -471, 0, 0, 0, -471, 0, 0, -471, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -471, 0, -471, -471, -471, -471, 0, 0, 0, 0, 0, -471, -471, -471, -471, 0, -471, -471, -471, -471, 283, 927, 0, 0, -471, -471, -471, -471, -471, 0, 0, -471, -471, -471, -471, 0, -471, -471, -471, -471, -471, -471, -471, -471, -471, 0, 0, 0, -471, -471, 0, 0, 0, -471, -471, -471, -471, -471, -471, + -470, 0, 0, 0, 0, 0, -470, 0, -470, 0, 0, 0, -470, 0, 0, -470, 0, 0, 0, -470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -470, 0, -470, -470, -470, -470, 0, 0, 0, 0, 0, -470, -470, -470, -470, 0, -470, -470, -470, -470, 283, 927, 0, 0, -470, -470, -470, -470, -470, 0, 0, -470, -470, -470, -470, 0, -470, -470, -470, -470, -470, -470, -470, -470, -470, 0, 0, 0, -470, -470, 0, 0, 0, -470, -470, -470, -470, -470, -470, // State 241 -909, 0, 0, 0, 0, 0, -909, 0, -909, 0, 0, 0, -909, 0, 0, -909, 0, 0, 0, -909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -909, 0, -909, -909, -909, -909, 0, 0, 0, 0, 0, -909, -909, -909, -909, 0, -909, -909, -909, -909, 0, 934, 287, 935, -909, -909, -909, -909, -909, 0, 0, -909, -909, -909, -909, 0, -909, -909, -909, -909, -909, -909, -909, -909, -909, 0, 0, 0, -909, -909, 0, 0, 0, -909, -909, -909, -909, -909, -909, // State 242 @@ -1054,7 +1054,7 @@ mod __parse__Top { // State 455 -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, 0, -372, 0, -372, -372, -372, -372, -372, 0, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, 0, 0, 0, -372, -372, -372, -372, -372, -372, 0, -372, 0, 0, 0, 0, 0, 0, 0, 0, -372, 0, 0, -372, -372, 0, -372, 0, -372, -372, 0, 0, 0, -372, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, -372, -372, -372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 456 - -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, 0, -469, 0, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, -469, 0, 0, 0, -469, -469, -469, -469, -469, -469, 0, -469, 0, 0, 0, 0, 0, 0, 0, 0, -469, 0, 0, -469, -469, 0, -469, -469, -469, -469, 0, 0, 0, -469, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, -469, -469, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, 0, -468, 0, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, -468, 0, 0, 0, -468, -468, -468, -468, -468, -468, 0, -468, 0, 0, 0, 0, 0, 0, 0, 0, -468, 0, 0, -468, -468, 0, -468, -468, -468, -468, 0, 0, 0, -468, -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, -468, -468, -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 457 -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, 0, -139, 0, -139, -139, -139, -139, -139, 0, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, 0, 0, 0, -139, -139, -139, -139, -139, -139, 0, -139, 0, 0, 0, 0, 0, 0, 0, 0, -139, 0, 0, -139, -139, 0, -139, 0, -139, -139, 0, 0, 0, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, -139, -139, -139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -139, // State 458 @@ -1212,15 +1212,15 @@ mod __parse__Top { // State 534 -836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 535 - -841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // State 536 -219, -219, -219, -219, -219, -219, -219, 0, -219, -219, -219, -219, -219, -219, -219, -219, -219, 0, -219, 0, -219, -219, -219, -219, -219, 0, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, -190, -219, -219, 0, 0, 0, -219, 0, -219, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, 0, -219, -219, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // State 537 + // State 536 -360, 0, 0, 0, 0, 0, -360, 0, -360, 0, 0, 0, -360, 0, 0, -360, 0, 0, 0, -360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -360, 0, -360, -360, -360, -360, 0, 0, 0, 0, 0, -360, -360, -360, -360, 0, -360, -360, -360, -360, 0, 0, 0, 0, -360, -360, -360, -360, -360, 0, 0, -360, -360, -360, -360, 0, -360, -360, -360, -360, -360, -360, -360, -360, -360, 0, 0, 0, -360, -360, 0, 0, 0, -360, -360, -360, -360, -360, -360, - // State 538 + // State 537 -835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // State 539 + // State 538 -840, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -840, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 539 + -841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 540 -359, 0, 0, 0, 0, 0, -359, 0, -359, 0, 0, 0, -359, 0, 0, -359, 0, 0, 0, -359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -359, 0, -359, -359, -359, -359, 0, 0, 0, 0, 0, -359, -359, -359, -359, 0, -359, -359, -359, -359, 0, 0, 0, 0, -359, -359, -359, -359, -359, 0, 0, -359, -359, -359, -359, 0, -359, -359, -359, -359, -359, -359, -359, -359, -359, 0, 0, 0, -359, -359, 0, 0, 0, -359, -359, -359, -359, -359, -359, // State 541 @@ -1274,7 +1274,7 @@ mod __parse__Top { // State 565 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 566 - -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 567 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, 0, -112, 0, 0, -112, 0, 0, 0, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, -112, -112, -112, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, 0, 0, 0, -112, 0, 0, 0, 0, -112, -112, -112, 0, -112, -112, // State 568 @@ -1346,9 +1346,9 @@ mod __parse__Top { // State 601 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, -848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 602 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 603 - -498, 0, 0, -498, 0, -498, 0, -498, 0, 0, -498, -498, 0, -498, -498, 0, -498, 0, 0, 0, 0, 0, -498, -498, -498, 0, -498, 0, 0, -498, 0, -498, 0, 0, 0, 0, -498, 0, 0, -498, 0, 0, 0, 0, -498, 0, -498, 0, -498, 0, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -498, -498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -500, 0, 0, -500, 0, -500, 0, -500, 0, 0, -500, -500, 0, -500, -500, 0, -500, 0, 0, 0, 0, 0, -500, -500, -500, 0, -500, 0, 0, -500, 0, -500, 0, 0, 0, 0, -500, 0, 0, -500, 0, 0, 0, 0, -500, 0, -500, 0, -500, 0, -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -500, -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -500, -500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 604 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 605 @@ -1368,7 +1368,7 @@ mod __parse__Top { // State 612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 613 - -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 614 -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 615 @@ -1436,15 +1436,15 @@ mod __parse__Top { // State 646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 647 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 648 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -485, -485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -485, 0, // State 649 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 650 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, -483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -483, 0, - // State 651 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, -482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, + // State 651 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 0, // State 652 -557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 653 @@ -1454,7 +1454,7 @@ mod __parse__Top { // State 655 -560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 656 - -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 657 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 658 @@ -1590,7 +1590,7 @@ mod __parse__Top { // State 723 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -574, 0, 0, 0, 0, 0, 0, 0, 0, 0, -574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 724 - -497, 0, 0, -497, 0, -497, 0, -497, 0, 0, -497, -497, 0, -497, -497, 0, -497, 0, 0, 0, 0, 0, -497, -497, -497, 0, -497, 0, 0, -497, 0, -497, 0, 0, 0, 0, -497, 0, 0, -497, 0, 0, 0, 0, -497, 0, -497, 0, -497, 0, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -497, -497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -499, 0, 0, -499, 0, -499, 0, -499, 0, 0, -499, -499, 0, -499, -499, 0, -499, 0, 0, 0, 0, 0, -499, -499, -499, 0, -499, 0, 0, -499, 0, -499, 0, 0, 0, 0, -499, 0, 0, -499, 0, 0, 0, 0, -499, 0, -499, 0, -499, 0, -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -499, -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -499, -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 725 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -594, 0, 0, 0, 0, 0, 0, 0, 0, 0, -594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 726 @@ -1638,7 +1638,7 @@ mod __parse__Top { // State 747 -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 0, -180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 748 - -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -499, 0, 0, 0, 0, -499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -492, 0, 0, 0, 0, -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 749 -794, 0, 0, 0, 0, 0, -794, 0, -794, 0, 0, 0, -794, 0, 0, -794, 0, 0, 0, -794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -794, 0, -794, -794, -794, -794, 0, 0, 0, 0, 0, -794, -794, -794, -794, 0, -794, -794, -794, -794, 0, 0, 0, 0, -794, -794, -794, -794, -794, 0, 0, -794, -794, -794, -794, 0, -794, -794, -794, -794, -794, -794, -794, -794, -794, 0, 0, 0, -794, 0, 0, 0, 0, -794, -794, -794, -794, -794, -794, // State 750 @@ -1672,9 +1672,9 @@ mod __parse__Top { // State 764 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 765 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 766 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, -487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -487, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -486, 0, // State 767 -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 768 @@ -1826,11 +1826,11 @@ mod __parse__Top { // State 841 -564, 0, 0, 0, 0, 0, 0, -564, 0, 0, 0, 0, 0, 0, -564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 842 - -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 843 - -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 844 - -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 845 -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 846 @@ -1984,7 +1984,7 @@ mod __parse__Top { // State 920 0, 0, 0, 0, 0, 0, 0, -845, 0, 0, 0, 0, 0, 0, -845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 921 - 0, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, -493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, -495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 922 0, 0, 0, 0, 0, 0, 0, -394, 0, 0, 0, 0, 0, 0, -394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 923 @@ -1992,7 +1992,7 @@ mod __parse__Top { // State 924 -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 925 - -473, 0, 0, 0, 0, 0, -473, 0, -473, 0, 0, 0, -473, 0, 0, -473, 0, 0, 0, -473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -473, 0, -473, -473, -473, -473, 0, 0, 0, 0, 0, -473, -473, -473, -473, 0, -473, -473, -473, -473, 323, 994, 0, 0, -473, -473, -473, -473, -473, 0, 0, -473, -473, -473, -473, 0, -473, -473, -473, -473, -473, -473, -473, -473, -473, 0, 0, 0, -473, -473, 0, 0, 0, -473, -473, -473, -473, -473, -473, + -472, 0, 0, 0, 0, 0, -472, 0, -472, 0, 0, 0, -472, 0, 0, -472, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -472, 0, -472, -472, -472, -472, 0, 0, 0, 0, 0, -472, -472, -472, -472, 0, -472, -472, -472, -472, 323, 994, 0, 0, -472, -472, -472, -472, -472, 0, 0, -472, -472, -472, -472, 0, -472, -472, -472, -472, -472, -472, -472, -472, -472, 0, 0, 0, -472, -472, 0, 0, 0, -472, -472, -472, -472, -472, -472, // State 926 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 927 @@ -2126,7 +2126,7 @@ mod __parse__Top { // State 991 -566, 0, 0, 0, 0, 0, 0, -566, 0, 0, 0, 0, 0, 0, -566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 992 - -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 993 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 994 @@ -2232,11 +2232,11 @@ mod __parse__Top { // State 1044 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1045 - -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1046 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1047 - -470, 0, 0, 0, 0, 0, -470, 0, -470, 0, 0, 0, -470, 0, 0, -470, 0, 0, 0, -470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -470, 0, -470, -470, -470, -470, 0, 0, 0, 0, 0, -470, -470, -470, -470, 0, -470, -470, -470, -470, 0, 0, 0, 0, -470, -470, -470, -470, -470, 0, 0, -470, -470, -470, -470, 0, -470, -470, -470, -470, -470, -470, -470, -470, -470, 0, 0, 0, -470, -470, 0, 0, 0, -470, -470, -470, -470, -470, -470, + -469, 0, 0, 0, 0, 0, -469, 0, -469, 0, 0, 0, -469, 0, 0, -469, 0, 0, 0, -469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -469, 0, -469, -469, -469, -469, 0, 0, 0, 0, 0, -469, -469, -469, -469, 0, -469, -469, -469, -469, 0, 0, 0, 0, -469, -469, -469, -469, -469, 0, 0, -469, -469, -469, -469, 0, -469, -469, -469, -469, -469, -469, -469, -469, -469, 0, 0, 0, -469, -469, 0, 0, 0, -469, -469, -469, -469, -469, -469, // State 1048 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -528, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1049 @@ -2362,7 +2362,7 @@ mod __parse__Top { // State 1109 -565, 0, 0, 0, 0, 0, 0, -565, 0, 0, 0, 0, 0, 0, -565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1110 - -472, 0, 0, 0, 0, 0, -472, 0, -472, 0, 0, 0, -472, 0, 0, -472, 0, 0, 0, -472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -472, 0, -472, -472, -472, -472, 0, 0, 0, 0, 0, -472, -472, -472, -472, 0, -472, -472, -472, -472, 0, 0, 0, 0, -472, -472, -472, -472, -472, 0, 0, -472, -472, -472, -472, 0, -472, -472, -472, -472, -472, -472, -472, -472, -472, 0, 0, 0, -472, -472, 0, 0, 0, -472, -472, -472, -472, -472, -472, + -471, 0, 0, 0, 0, 0, -471, 0, -471, 0, 0, 0, -471, 0, 0, -471, 0, 0, 0, -471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -471, 0, -471, -471, -471, -471, 0, 0, 0, 0, 0, -471, -471, -471, -471, 0, -471, -471, -471, -471, 0, 0, 0, 0, -471, -471, -471, -471, -471, 0, 0, -471, -471, -471, -471, 0, -471, -471, -471, -471, -471, -471, -471, -471, -471, 0, 0, 0, -471, -471, 0, 0, 0, -471, -471, -471, -471, -471, -471, // State 1111 -105, 0, 0, 0, 0, 0, -105, 0, -105, 0, 0, 0, -105, 0, 0, -105, 0, 0, 0, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -105, 0, -105, -105, -105, -105, 0, 0, 0, 0, 0, -105, -105, -105, -105, 0, -105, -105, -105, -105, -105, -105, 0, 0, -105, -105, -105, -105, -105, 0, 0, -105, -105, -105, -105, 0, -105, -105, -105, -105, -105, -105, -105, -105, -105, 0, 0, 0, -105, -105, 0, 0, 0, -105, -105, -105, -105, -105, -105, // State 1112 @@ -3147,7 +3147,7 @@ mod __parse__Top { // State 239 0, // State 240 - -471, + -470, // State 241 -909, // State 242 @@ -3579,7 +3579,7 @@ mod __parse__Top { // State 455 -372, // State 456 - -469, + -468, // State 457 -139, // State 458 @@ -3739,9 +3739,9 @@ mod __parse__Top { // State 535 0, // State 536 - 0, - // State 537 -360, + // State 537 + 0, // State 538 0, // State 539 @@ -3873,7 +3873,7 @@ mod __parse__Top { // State 602 0, // State 603 - -498, + -500, // State 604 0, // State 605 @@ -4115,7 +4115,7 @@ mod __parse__Top { // State 723 0, // State 724 - -497, + -499, // State 725 0, // State 726 @@ -4517,7 +4517,7 @@ mod __parse__Top { // State 924 0, // State 925 - -473, + -472, // State 926 0, // State 927 @@ -4761,7 +4761,7 @@ mod __parse__Top { // State 1046 0, // State 1047 - -470, + -469, // State 1048 0, // State 1049 @@ -4887,7 +4887,7 @@ mod __parse__Top { // State 1109 0, // State 1110 - -472, + -471, // State 1111 -105, // State 1112 @@ -5491,8 +5491,7 @@ mod __parse__Top { }, 158 => 534, 159 => 1113, - 160 => 535, - 161 => match state { + 160 => match state { 61 => 124, 62 => 125, 106 => 163, @@ -5501,7 +5500,7 @@ mod __parse__Top { 162 => 221, 12 | 14 | 18 | 24 | 56..=58 | 67 | 69 | 74 | 76 | 89..=90 | 92 | 99 | 104 | 139..=140 | 143 | 147 | 149 | 154 | 167..=168 | 185..=186 | 195 | 216 | 225 | 250..=251 | 256 | 266 | 282 | 294 | 310 | 322 | 337 | 367 | 390 => 485, 16 | 93 | 97 | 158..=159 | 218..=220 | 257..=259 | 301 | 304 | 341..=343 | 369..=371 | 398 => 500, - 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 536, + 19 | 46 | 128 | 172 | 182 | 188 | 191 | 204 | 223 | 229..=231 | 235 | 244 | 262..=263 | 265 | 268..=269 | 273 | 279 | 288..=291 | 306..=307 | 309 | 312..=314 | 323 | 329..=333 | 335..=336 | 345..=348 | 354..=355 | 365 | 372..=374 | 379..=380 | 389 | 397 | 399..=400 | 405 | 408..=410 => 535, 22 | 79 => 570, 23 => 572, 40..=41 | 156 | 260 | 302 => 601, @@ -5539,16 +5538,19 @@ mod __parse__Top { 420 => 1240, _ => 436, }, - 162 => 537, - 165 => 842, - 166 => match state { + 161 => 536, + 164 => 842, + 165 => match state { 126 => 766, _ => 648, }, - 168 => 126, - 169 => 649, - 170 => 538, - 171 => match state { + 167 => 126, + 168 => 649, + 169 => 537, + 170 => 746, + 171 => 538, + 172 => 539, + 173 => match state { 275 => 983, 278 => 987, 317 => 1038, @@ -5570,7 +5572,7 @@ mod __parse__Top { 424 => 1253, _ => 833, }, - 172 => match state { + 174 => match state { 93 => 722, 97 => 727, 158 => 809, @@ -5592,12 +5594,10 @@ mod __parse__Top { 398 => 1192, _ => 501, }, - 173 => match state { + 175 => match state { 75 | 122 => 678, _ => 437, }, - 174 => 746, - 175 => 539, 176 => match state { 58 => 636, 140 => 782, @@ -6138,7 +6138,7 @@ mod __parse__Top { r###"complex"###, r###"float"###, r###"int"###, - r###"line_magic"###, + r###"ipy_escape_command"###, r###"name"###, r###"string"###, ]; @@ -6368,7 +6368,7 @@ mod __parse__Top { token::Tok::Complex { real: _, imag: _ } if true => Some(91), token::Tok::Float { value: _ } if true => Some(92), token::Tok::Int { value: _ } if true => Some(93), - token::Tok::MagicCommand { kind: _, value: _ } if true => Some(94), + token::Tok::IpyEscapeCommand { kind: _, value: _ } if true => Some(94), token::Tok::Name { name: _ } if true => Some(95), token::Tok::String { value: _, kind: _, triple_quoted: _ } if true => Some(96), _ => None, @@ -6396,7 +6396,7 @@ mod __parse__Top { _ => unreachable!(), }, 94 => match __token { - token::Tok::MagicCommand { kind: __tok0, value: __tok1 } if true => __Symbol::Variant4((__tok0, __tok1)), + token::Tok::IpyEscapeCommand { kind: __tok0, value: __tok1 } if true => __Symbol::Variant4((__tok0, __tok1)), _ => unreachable!(), }, 95 => match __token { @@ -9221,56 +9221,56 @@ mod __parse__Top { } 467 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 160, } } 468 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 7, nonterminal_produced: 161, } } 469 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 7, - nonterminal_produced: 162, + states_to_pop: 4, + nonterminal_produced: 161, } } 470 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 162, + states_to_pop: 8, + nonterminal_produced: 161, } } 471 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 8, - nonterminal_produced: 162, + states_to_pop: 5, + nonterminal_produced: 161, } } 472 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 5, + states_to_pop: 3, nonterminal_produced: 162, } } 473 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 163, + states_to_pop: 1, + nonterminal_produced: 162, } } 474 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 163, } } 475 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 164, + states_to_pop: 1, + nonterminal_produced: 163, } } 476 => { @@ -9281,20 +9281,20 @@ mod __parse__Top { } 477 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 165, + states_to_pop: 4, + nonterminal_produced: 164, } } 478 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 165, + states_to_pop: 3, + nonterminal_produced: 164, } } 479 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 165, + states_to_pop: 1, + nonterminal_produced: 164, } } 480 => { @@ -9306,19 +9306,19 @@ mod __parse__Top { 481 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 166, + nonterminal_produced: 165, } } 482 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 0, nonterminal_produced: 166, } } 483 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 0, - nonterminal_produced: 167, + states_to_pop: 1, + nonterminal_produced: 166, } } 484 => { @@ -9329,91 +9329,91 @@ mod __parse__Top { } 485 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 168, + states_to_pop: 2, + nonterminal_produced: 167, } } 486 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 168, } } 487 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 169, + states_to_pop: 2, + nonterminal_produced: 168, } } 488 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 169, + states_to_pop: 1, + nonterminal_produced: 168, } } 489 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 2, nonterminal_produced: 169, } } 490 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, - nonterminal_produced: 170, + states_to_pop: 4, + nonterminal_produced: 169, } } 491 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, + states_to_pop: 1, nonterminal_produced: 170, } } 492 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 2, + states_to_pop: 1, nonterminal_produced: 171, } } 493 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, - nonterminal_produced: 171, + states_to_pop: 2, + nonterminal_produced: 172, } } 494 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 2, - nonterminal_produced: 172, + nonterminal_produced: 173, } } 495 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, - nonterminal_produced: 172, + nonterminal_produced: 173, } } 496 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 4, - nonterminal_produced: 173, + states_to_pop: 2, + nonterminal_produced: 174, } } 497 => { - __state_machine::SimulatedReduce::Reduce { - states_to_pop: 3, - nonterminal_produced: 173, - } - } - 498 => { __state_machine::SimulatedReduce::Reduce { states_to_pop: 1, nonterminal_produced: 174, } } + 498 => { + __state_machine::SimulatedReduce::Reduce { + states_to_pop: 4, + nonterminal_produced: 175, + } + } 499 => { __state_machine::SimulatedReduce::Reduce { - states_to_pop: 1, + states_to_pop: 3, nonterminal_produced: 175, } } @@ -14602,18 +14602,7 @@ mod __parse__Top { __reduce466(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 467 => { - // HelpEndLineMagic = Expression<"All">, ("?")+ => ActionFn(1423); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant21(__symbols); - let __sym0 = __pop_Variant14(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = match super::__action1423::<>(mode, __sym0, __sym1) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 160) + __reduce467(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 468 => { __reduce468(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -14685,13 +14674,42 @@ mod __parse__Top { __reduce490(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 491 => { - __reduce491(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // IpyEscapeCommandExpr = ipy_escape_command => ActionFn(1434); + let __sym0 = __pop_Variant4(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1434::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant14(__nt), __end)); + (1, 170) } 492 => { - __reduce492(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // IpyEscapeCommandStatement = ipy_escape_command => ActionFn(1435); + let __sym0 = __pop_Variant4(__symbols); + let __start = __sym0.0; + let __end = __sym0.2; + let __nt = match super::__action1435::<>(mode, __sym0) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (1, 171) } 493 => { - __reduce493(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + // IpyHelpEndEscapeCommandStatement = Expression<"All">, ("?")+ => ActionFn(1436); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant21(__symbols); + let __sym0 = __pop_Variant14(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = match super::__action1436::<>(mode, __sym0, __sym1) { + Ok(v) => v, + Err(e) => return Some(Err(e)), + }; + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (2, 172) } 494 => { __reduce494(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -14700,6 +14718,12 @@ mod __parse__Top { __reduce495(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) } 496 => { + __reduce496(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 497 => { + __reduce497(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) + } + 498 => { // LambdaDef = "lambda", ParameterList, ":", Test<"all"> => ActionFn(1819); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant14(__symbols); @@ -14713,9 +14737,9 @@ mod __parse__Top { Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (4, 173) + (4, 175) } - 497 => { + 499 => { // LambdaDef = "lambda", ":", Test<"all"> => ActionFn(1820); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant14(__symbols); @@ -14728,31 +14752,7 @@ mod __parse__Top { Err(e) => return Some(Err(e)), }; __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (3, 173) - } - 498 => { - // LineMagicExpr = line_magic => ActionFn(1436); - let __sym0 = __pop_Variant4(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1436::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant14(__nt), __end)); - (1, 174) - } - 499 => { - // LineMagicStatement = line_magic => ActionFn(1437); - let __sym0 = __pop_Variant4(__symbols); - let __start = __sym0.0; - let __end = __sym0.2; - let __nt = match super::__action1437::<>(mode, __sym0) { - Ok(v) => v, - Err(e) => return Some(Err(e)), - }; - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (1, 175) + (3, 175) } 500 => { __reduce500(mode, __lookahead_start, __symbols, core::marker::PhantomData::<()>) @@ -18686,7 +18686,7 @@ mod __parse__Top { fn __pop_Variant4< >( __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)> - ) -> (TextSize, (MagicKind, String), TextSize) + ) -> (TextSize, (IpyEscapeKind, String), TextSize) { match __symbols.pop() { Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r), @@ -22077,7 +22077,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // AssignSuffix = "=", LineMagicExpr => ActionFn(30); + // AssignSuffix = "=", IpyEscapeCommandExpr => ActionFn(30); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant14(__symbols); let __sym0 = __pop_Variant0(__symbols); @@ -26702,7 +26702,7 @@ mod __parse__Top { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (2, 159) } - pub(crate) fn __reduce468< + pub(crate) fn __reduce467< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26710,15 +26710,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // Identifier = name => ActionFn(1424); + // Identifier = name => ActionFn(1423); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1424::<>(mode, __sym0); + let __nt = super::__action1423::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant22(__nt), __end)); - (1, 161) + (1, 160) } - pub(crate) fn __reduce469< + pub(crate) fn __reduce468< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26739,9 +26739,9 @@ mod __parse__Top { let __end = __sym6.2; let __nt = super::__action1216::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (7, 162) + (7, 161) } - pub(crate) fn __reduce470< + pub(crate) fn __reduce469< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26759,9 +26759,9 @@ mod __parse__Top { let __end = __sym3.2; let __nt = super::__action1217::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 162) + (4, 161) } - pub(crate) fn __reduce471< + pub(crate) fn __reduce470< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26783,9 +26783,9 @@ mod __parse__Top { let __end = __sym7.2; let __nt = super::__action1218::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (8, 162) + (8, 161) } - pub(crate) fn __reduce472< + pub(crate) fn __reduce471< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26804,7 +26804,26 @@ mod __parse__Top { let __end = __sym4.2; let __nt = super::__action1219::<>(mode, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (5, 162) + (5, 161) + } + pub(crate) fn __reduce472< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ImportAsAlias = DottedName, "as", Identifier => ActionFn(1424); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant22(__symbols); + let __start = __sym0.0; + let __end = __sym2.2; + let __nt = super::__action1424::<>(mode, __sym0, __sym1, __sym2); + __symbols.push((__start, __Symbol::Variant68(__nt), __end)); + (3, 162) } pub(crate) fn __reduce473< >( @@ -26814,16 +26833,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportAsAlias = DottedName, "as", Identifier => ActionFn(1425); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // ImportAsAlias = DottedName => ActionFn(1425); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1425::<>(mode, __sym0, __sym1, __sym2); + let __end = __sym0.2; + let __nt = super::__action1425::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant68(__nt), __end)); - (3, 163) + (1, 162) } pub(crate) fn __reduce474< >( @@ -26833,13 +26849,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportAsAlias = DottedName => ActionFn(1426); + // ImportAsAlias = Identifier, "as", Identifier => ActionFn(1426); + assert!(__symbols.len() >= 3); + let __sym2 = __pop_Variant22(__symbols); + let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1426::<>(mode, __sym0); + let __end = __sym2.2; + let __nt = super::__action1426::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant68(__nt), __end)); - (1, 163) + (3, 163) } pub(crate) fn __reduce475< >( @@ -26849,16 +26868,13 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportAsAlias = Identifier, "as", Identifier => ActionFn(1427); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant22(__symbols); - let __sym1 = __pop_Variant0(__symbols); + // ImportAsAlias = Identifier => ActionFn(1427); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1427::<>(mode, __sym0, __sym1, __sym2); + let __end = __sym0.2; + let __nt = super::__action1427::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant68(__nt), __end)); - (3, 164) + (1, 163) } pub(crate) fn __reduce476< >( @@ -26868,12 +26884,12 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportAsAlias = Identifier => ActionFn(1428); - let __sym0 = __pop_Variant22(__symbols); + // ImportAsNames = OneOrMore> => ActionFn(1428); + let __sym0 = __pop_Variant69(__symbols); let __start = __sym0.0; let __end = __sym0.2; let __nt = super::__action1428::<>(mode, __sym0); - __symbols.push((__start, __Symbol::Variant68(__nt), __end)); + __symbols.push((__start, __Symbol::Variant69(__nt), __end)); (1, 164) } pub(crate) fn __reduce477< @@ -26884,13 +26900,17 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportAsNames = OneOrMore> => ActionFn(1429); - let __sym0 = __pop_Variant69(__symbols); + // ImportAsNames = "(", OneOrMore>, ",", ")" => ActionFn(1429); + assert!(__symbols.len() >= 4); + let __sym3 = __pop_Variant0(__symbols); + let __sym2 = __pop_Variant0(__symbols); + let __sym1 = __pop_Variant69(__symbols); + let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym0.2; - let __nt = super::__action1429::<>(mode, __sym0); + let __end = __sym3.2; + let __nt = super::__action1429::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (1, 165) + (4, 164) } pub(crate) fn __reduce478< >( @@ -26900,17 +26920,16 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportAsNames = "(", OneOrMore>, ",", ")" => ActionFn(1430); - assert!(__symbols.len() >= 4); - let __sym3 = __pop_Variant0(__symbols); + // ImportAsNames = "(", OneOrMore>, ")" => ActionFn(1430); + assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant69(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; - let __end = __sym3.2; - let __nt = super::__action1430::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __end = __sym2.2; + let __nt = super::__action1430::<>(mode, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (4, 165) + (3, 164) } pub(crate) fn __reduce479< >( @@ -26920,34 +26939,15 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportAsNames = "(", OneOrMore>, ")" => ActionFn(1431); - assert!(__symbols.len() >= 3); - let __sym2 = __pop_Variant0(__symbols); - let __sym1 = __pop_Variant69(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym2.2; - let __nt = super::__action1431::<>(mode, __sym0, __sym1, __sym2); - __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (3, 165) - } - pub(crate) fn __reduce480< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportAsNames = "*" => ActionFn(1432); + // ImportAsNames = "*" => ActionFn(1431); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym0.2; - let __nt = super::__action1432::<>(mode, __sym0); + let __nt = super::__action1431::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant69(__nt), __end)); - (1, 165) + (1, 164) } - pub(crate) fn __reduce481< + pub(crate) fn __reduce480< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26961,9 +26961,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action64::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant70(__nt), __end)); - (1, 166) + (1, 165) } - pub(crate) fn __reduce482< + pub(crate) fn __reduce481< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26977,9 +26977,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action65::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant70(__nt), __end)); - (1, 166) + (1, 165) } - pub(crate) fn __reduce483< + pub(crate) fn __reduce482< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -26992,9 +26992,9 @@ mod __parse__Top { let __end = __start.clone(); let __nt = super::__action370::<>(mode, &__start, &__end); __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (0, 167) + (0, 166) } - pub(crate) fn __reduce484< + pub(crate) fn __reduce483< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27008,9 +27008,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action371::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (1, 167) + (1, 166) } - pub(crate) fn __reduce485< + pub(crate) fn __reduce484< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27024,9 +27024,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action368::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (1, 168) + (1, 167) } - pub(crate) fn __reduce486< + pub(crate) fn __reduce485< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27042,9 +27042,9 @@ mod __parse__Top { let __end = __sym1.2; let __nt = super::__action369::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant71(__nt), __end)); - (2, 168) + (2, 167) } - pub(crate) fn __reduce487< + pub(crate) fn __reduce486< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27058,9 +27058,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action1691::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant72(__nt), __end)); - (1, 169) + (1, 168) } - pub(crate) fn __reduce488< + pub(crate) fn __reduce487< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27076,9 +27076,9 @@ mod __parse__Top { let __end = __sym1.2; let __nt = super::__action1692::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant72(__nt), __end)); - (2, 169) + (2, 168) } - pub(crate) fn __reduce489< + pub(crate) fn __reduce488< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27092,7 +27092,25 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action63::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant72(__nt), __end)); - (1, 169) + (1, 168) + } + pub(crate) fn __reduce489< + >( + mode: Mode, + __lookahead_start: Option<&TextSize>, + __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, + _: core::marker::PhantomData<()>, + ) -> (usize, usize) + { + // ImportStatement = "import", OneOrMore> => ActionFn(1432); + assert!(__symbols.len() >= 2); + let __sym1 = __pop_Variant69(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0; + let __end = __sym1.2; + let __nt = super::__action1432::<>(mode, __sym0, __sym1); + __symbols.push((__start, __Symbol::Variant36(__nt), __end)); + (2, 169) } pub(crate) fn __reduce490< >( @@ -27102,25 +27120,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // ImportStatement = "import", OneOrMore> => ActionFn(1433); - assert!(__symbols.len() >= 2); - let __sym1 = __pop_Variant69(__symbols); - let __sym0 = __pop_Variant0(__symbols); - let __start = __sym0.0; - let __end = __sym1.2; - let __nt = super::__action1433::<>(mode, __sym0, __sym1); - __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (2, 170) - } - pub(crate) fn __reduce491< - >( - mode: Mode, - __lookahead_start: Option<&TextSize>, - __symbols: &mut alloc::vec::Vec<(TextSize,__Symbol<>,TextSize)>, - _: core::marker::PhantomData<()>, - ) -> (usize, usize) - { - // ImportStatement = "from", ImportFromLocation, "import", ImportAsNames => ActionFn(1434); + // ImportStatement = "from", ImportFromLocation, "import", ImportAsNames => ActionFn(1433); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant69(__symbols); let __sym2 = __pop_Variant0(__symbols); @@ -27128,11 +27128,11 @@ mod __parse__Top { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0; let __end = __sym3.2; - let __nt = super::__action1434::<>(mode, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action1433::<>(mode, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant36(__nt), __end)); - (4, 170) + (4, 169) } - pub(crate) fn __reduce492< + pub(crate) fn __reduce494< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27148,9 +27148,9 @@ mod __parse__Top { let __end = __sym1.2; let __nt = super::__action1681::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (2, 171) + (2, 173) } - pub(crate) fn __reduce493< + pub(crate) fn __reduce495< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27164,9 +27164,9 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action1682::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (1, 171) + (1, 173) } - pub(crate) fn __reduce494< + pub(crate) fn __reduce496< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27182,9 +27182,9 @@ mod __parse__Top { let __end = __sym1.2; let __nt = super::__action1076::<>(mode, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (2, 172) + (2, 174) } - pub(crate) fn __reduce495< + pub(crate) fn __reduce497< >( mode: Mode, __lookahead_start: Option<&TextSize>, @@ -27198,7 +27198,7 @@ mod __parse__Top { let __end = __sym0.2; let __nt = super::__action1077::<>(mode, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); - (1, 172) + (1, 174) } pub(crate) fn __reduce500< >( @@ -30160,7 +30160,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SmallStatement = LineMagicStatement => ActionFn(22); + // SmallStatement = IpyEscapeCommandStatement => ActionFn(22); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym0.2; @@ -30176,7 +30176,7 @@ mod __parse__Top { _: core::marker::PhantomData<()>, ) -> (usize, usize) { - // SmallStatement = HelpEndLineMagic => ActionFn(23); + // SmallStatement = IpyHelpEndEscapeCommandStatement => ActionFn(23); let __sym0 = __pop_Variant36(__symbols); let __start = __sym0.0; let __end = __sym0.2; @@ -33614,22 +33614,22 @@ fn __action74< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), - (_, m, _): (TextSize, (MagicKind, String), TextSize), + (_, c, _): (TextSize, (IpyEscapeKind, String), TextSize), (_, end_location, _): (TextSize, TextSize, TextSize), ) -> Result> { { if mode == Mode::Jupyter { - Ok(ast::Stmt::LineMagic( - ast::StmtLineMagic { - kind: m.0, - value: m.1, + Ok(ast::Stmt::IpyEscapeCommand( + ast::StmtIpyEscapeCommand { + kind: c.0, + value: c.1, range: (location..end_location).into() } )) } else { Err(LexicalError { - error: LexicalErrorType::OtherError("line magics are only allowed in Jupyter mode".to_string()), + error: LexicalErrorType::OtherError("IPython escape commands are only allowed in Jupyter mode".to_string()), location, })? } @@ -33642,29 +33642,29 @@ fn __action75< >( mode: Mode, (_, location, _): (TextSize, TextSize, TextSize), - (_, m, _): (TextSize, (MagicKind, String), TextSize), + (_, c, _): (TextSize, (IpyEscapeKind, String), TextSize), (_, end_location, _): (TextSize, TextSize, TextSize), ) -> Result> { { if mode == Mode::Jupyter { // This should never occur as the lexer won't allow it. - if !matches!(m.0, MagicKind::Magic | MagicKind::Shell) { + if !matches!(c.0, IpyEscapeKind::Magic | IpyEscapeKind::Shell) { return Err(LexicalError { - error: LexicalErrorType::OtherError("expr line magics are only allowed for % and !".to_string()), + error: LexicalErrorType::OtherError("IPython escape command expr is only allowed for % and !".to_string()), location, })?; } - Ok(ast::Expr::LineMagic( - ast::ExprLineMagic { - kind: m.0, - value: m.1, + Ok(ast::Expr::IpyEscapeCommand( + ast::ExprIpyEscapeCommand { + kind: c.0, + value: c.1, range: (location..end_location).into() } )) } else { Err(LexicalError { - error: LexicalErrorType::OtherError("line magics are only allowed in Jupyter mode".to_string()), + error: LexicalErrorType::OtherError("IPython escape commands are only allowed in Jupyter mode".to_string()), location, })? } @@ -33714,7 +33714,7 @@ fn __action76< } Ok(()) } - + if mode != Mode::Jupyter { return Err(ParseError::User { error: LexicalError { @@ -33725,8 +33725,8 @@ fn __action76< } let kind = match suffix.len() { - 1 => MagicKind::Help, - 2 => MagicKind::Help2, + 1 => IpyEscapeKind::Help, + 2 => IpyEscapeKind::Help2, _ => { return Err(ParseError::User { error: LexicalError { @@ -33739,9 +33739,9 @@ fn __action76< let mut value = String::new(); unparse_expr(&e, &mut value)?; - - Ok(ast::Stmt::LineMagic( - ast::StmtLineMagic { + + Ok(ast::Stmt::IpyEscapeCommand( + ast::StmtIpyEscapeCommand { kind, value, range: (location..end_location).into() @@ -49600,33 +49600,6 @@ fn __action886< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action887< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), - __2: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action396( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action76( - mode, - __temp0, - __0, - __1, - __2, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action888< >( mode: Mode, __0: (TextSize, String, TextSize), @@ -49651,7 +49624,7 @@ fn __action888< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action889< +fn __action888< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49684,7 +49657,7 @@ fn __action889< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action890< +fn __action889< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -49711,7 +49684,7 @@ fn __action890< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action891< +fn __action890< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -49738,7 +49711,7 @@ fn __action891< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action892< +fn __action891< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -49763,7 +49736,7 @@ fn __action892< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action893< +fn __action892< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49794,7 +49767,7 @@ fn __action893< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action894< +fn __action893< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49823,7 +49796,7 @@ fn __action894< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action895< +fn __action894< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49848,7 +49821,7 @@ fn __action895< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action896< +fn __action895< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49875,7 +49848,7 @@ fn __action896< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action897< +fn __action896< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49904,9 +49877,86 @@ fn __action897< ) } +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action897< +>( + mode: Mode, + __0: (TextSize, (IpyEscapeKind, String), TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action75( + mode, + __temp0, + __0, + __1, + ) +} + #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action898< +>( + mode: Mode, + __0: (TextSize, (IpyEscapeKind, String), TextSize), + __1: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action74( + mode, + __temp0, + __0, + __1, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action899< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), + __2: (TextSize, TextSize, TextSize), +) -> Result> +{ + let __start0 = __0.0; + let __end0 = __0.0; + let __temp0 = __action396( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action76( + mode, + __temp0, + __0, + __1, + __2, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action900< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -49946,56 +49996,6 @@ fn __action898< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action899< ->( - mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action396( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action75( - mode, - __temp0, - __0, - __1, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action900< ->( - mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), - __1: (TextSize, TextSize, TextSize), -) -> Result> -{ - let __start0 = __0.0; - let __end0 = __0.0; - let __temp0 = __action396( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action74( - mode, - __temp0, - __0, - __1, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action901< @@ -58015,7 +58015,7 @@ fn __action1183< __2, ); let __temp0 = (__start0, __temp0, __end0); - __action890( + __action889( mode, __0, __temp0, @@ -58040,7 +58040,7 @@ fn __action1184< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action890( + __action889( mode, __0, __temp0, @@ -58067,7 +58067,7 @@ fn __action1185< __2, ); let __temp0 = (__start0, __temp0, __end0); - __action891( + __action890( mode, __0, __temp0, @@ -58092,7 +58092,7 @@ fn __action1186< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action891( + __action890( mode, __0, __temp0, @@ -58970,7 +58970,7 @@ fn __action1213< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action889( + __action888( mode, __0, __1, @@ -59001,7 +59001,7 @@ fn __action1214< __4, ); let __temp0 = (__start0, __temp0, __end0); - __action889( + __action888( mode, __0, __1, @@ -64753,31 +64753,6 @@ fn __action1422< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1423< ->( - mode: Mode, - __0: (TextSize, ast::Expr, TextSize), - __1: (TextSize, alloc::vec::Vec, TextSize), -) -> Result> -{ - let __start0 = __1.2; - let __end0 = __1.2; - let __temp0 = __action395( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action887( - mode, - __0, - __1, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1424< >( mode: Mode, __0: (TextSize, String, TextSize), @@ -64791,7 +64766,7 @@ fn __action1424< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action888( + __action887( mode, __0, __temp0, @@ -64800,7 +64775,7 @@ fn __action1424< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1425< +fn __action1424< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -64827,7 +64802,7 @@ fn __action1425< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1426< +fn __action1425< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -64850,7 +64825,7 @@ fn __action1426< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1427< +fn __action1426< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -64877,7 +64852,7 @@ fn __action1427< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1428< +fn __action1427< >( mode: Mode, __0: (TextSize, ast::Identifier, TextSize), @@ -64900,7 +64875,7 @@ fn __action1428< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1429< +fn __action1428< >( mode: Mode, __0: (TextSize, Vec, TextSize), @@ -64914,7 +64889,7 @@ fn __action1429< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action892( + __action891( mode, __0, __temp0, @@ -64923,7 +64898,7 @@ fn __action1429< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1430< +fn __action1429< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -64940,7 +64915,7 @@ fn __action1430< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action893( + __action892( mode, __0, __1, @@ -64952,7 +64927,7 @@ fn __action1430< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1431< +fn __action1430< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -64968,7 +64943,7 @@ fn __action1431< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action894( + __action893( mode, __0, __1, @@ -64979,7 +64954,7 @@ fn __action1431< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1432< +fn __action1431< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -64993,7 +64968,7 @@ fn __action1432< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action895( + __action894( mode, __0, __temp0, @@ -65002,7 +64977,7 @@ fn __action1432< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1433< +fn __action1432< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -65017,7 +64992,7 @@ fn __action1433< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action896( + __action895( mode, __0, __1, @@ -65027,7 +65002,7 @@ fn __action1433< #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] -fn __action1434< +fn __action1433< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -65044,7 +65019,7 @@ fn __action1434< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action897( + __action896( mode, __0, __1, @@ -65054,9 +65029,80 @@ fn __action1434< ) } +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1434< +>( + mode: Mode, + __0: (TextSize, (IpyEscapeKind, String), TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action897( + mode, + __0, + __temp0, + ) +} + #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1435< +>( + mode: Mode, + __0: (TextSize, (IpyEscapeKind, String), TextSize), +) -> Result> +{ + let __start0 = __0.2; + let __end0 = __0.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action898( + mode, + __0, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1436< +>( + mode: Mode, + __0: (TextSize, ast::Expr, TextSize), + __1: (TextSize, alloc::vec::Vec, TextSize), +) -> Result> +{ + let __start0 = __1.2; + let __end0 = __1.2; + let __temp0 = __action395( + mode, + &__start0, + &__end0, + ); + let __temp0 = (__start0, __temp0, __end0); + __action899( + mode, + __0, + __1, + __temp0, + ) +} + +#[allow(unused_variables)] +#[allow(clippy::too_many_arguments)] +fn __action1437< >( mode: Mode, __0: (TextSize, token::Tok, TextSize), @@ -65081,7 +65127,7 @@ fn __action1435< &__end1, ); let __temp1 = (__start1, __temp1, __end1); - __action898( + __action900( mode, __0, __1, @@ -65092,52 +65138,6 @@ fn __action1435< ) } -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1436< ->( - mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action395( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action899( - mode, - __0, - __temp0, - ) -} - -#[allow(unused_variables)] -#[allow(clippy::too_many_arguments)] -fn __action1437< ->( - mode: Mode, - __0: (TextSize, (MagicKind, String), TextSize), -) -> Result> -{ - let __start0 = __0.2; - let __end0 = __0.2; - let __temp0 = __action395( - mode, - &__start0, - &__end0, - ); - let __temp0 = (__start0, __temp0, __end0); - __action900( - mode, - __0, - __temp0, - ) -} - #[allow(unused_variables)] #[allow(clippy::too_many_arguments)] fn __action1438< @@ -71935,7 +71935,7 @@ fn __action1683< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action1425( + let __temp0 = __action1424( mode, __0, __1, @@ -71958,7 +71958,7 @@ fn __action1684< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action1426( + let __temp0 = __action1425( mode, __0, ); @@ -71983,7 +71983,7 @@ fn __action1685< { let __start0 = __2.0; let __end0 = __4.2; - let __temp0 = __action1425( + let __temp0 = __action1424( mode, __2, __3, @@ -72010,7 +72010,7 @@ fn __action1686< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action1426( + let __temp0 = __action1425( mode, __2, ); @@ -72035,7 +72035,7 @@ fn __action1687< { let __start0 = __0.0; let __end0 = __2.2; - let __temp0 = __action1427( + let __temp0 = __action1426( mode, __0, __1, @@ -72058,7 +72058,7 @@ fn __action1688< { let __start0 = __0.0; let __end0 = __0.2; - let __temp0 = __action1428( + let __temp0 = __action1427( mode, __0, ); @@ -72083,7 +72083,7 @@ fn __action1689< { let __start0 = __2.0; let __end0 = __4.2; - let __temp0 = __action1427( + let __temp0 = __action1426( mode, __2, __3, @@ -72110,7 +72110,7 @@ fn __action1690< { let __start0 = __2.0; let __end0 = __2.2; - let __temp0 = __action1428( + let __temp0 = __action1427( mode, __2, ); @@ -76193,7 +76193,7 @@ fn __action1819< __1, ); let __temp0 = (__start0, __temp0, __end0); - __action1435( + __action1437( mode, __0, __temp0, @@ -76220,7 +76220,7 @@ fn __action1820< &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action1435( + __action1437( mode, __0, __temp0, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__ipython_escape_commands.snap similarity index 75% rename from crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap rename to crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__ipython_escape_commands.snap index 4149f47aca..3d06cd7aeb 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__jupyter_magic.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__ipython_escape_commands.snap @@ -4,7 +4,7 @@ expression: parse_ast --- Module( ModModule { - range: 0..919, + range: 0..929, body: [ Expr( StmtExpr { @@ -31,92 +31,92 @@ Module( ), }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 66..73, kind: Help2, value: "a.foo", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 74..80, kind: Help, value: "a.foo", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 81..88, kind: Help, value: "a.foo", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 89..100, kind: Help2, value: "a.foo()", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 115..128, kind: Magic, value: "timeit a = b", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 129..147, kind: Magic, value: "timeit foo(b) % 3", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 148..176, kind: Magic, value: "alias showPath pwd && ls -a", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 177..205, kind: Magic, value: "timeit a = foo(b); b = 2", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 206..226, kind: Magic, value: "matplotlib --inline", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 227..253, kind: Magic, value: "matplotlib --inline", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 277..309, kind: Shell, value: "pwd && ls -a | sed 's/^/\\ /'", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 310..347, kind: Shell, value: "pwd && ls -a | sed 's/^/\\\\ /'", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 348..393, kind: ShCap, value: "cd /Users/foo/Library/Application\\ Support/", @@ -176,22 +176,22 @@ Module( ], }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 656..664, kind: Paren, value: "foo 1 2", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 665..673, kind: Quote2, value: "foo 1 2", }, ), - LineMagic( - StmtLineMagic { + IpyEscapeCommand( + StmtIpyEscapeCommand { range: 674..682, kind: Quote, value: "foo 1 2", @@ -199,31 +199,31 @@ Module( ), For( StmtFor { - range: 701..727, + range: 711..737, is_async: false, target: Name( ExprName { - range: 705..706, + range: 715..716, id: "a", ctx: Store, }, ), iter: Call( ExprCall { - range: 710..718, + range: 720..728, func: Name( ExprName { - range: 710..715, + range: 720..725, id: "range", ctx: Load, }, ), arguments: Arguments { - range: 715..718, + range: 725..728, args: [ Constant( ExprConstant { - range: 716..717, + range: 726..727, value: Int( 5, ), @@ -236,9 +236,9 @@ Module( }, ), body: [ - LineMagic( - StmtLineMagic { - range: 724..727, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 734..737, kind: Shell, value: "ls", }, @@ -249,19 +249,19 @@ Module( ), Assign( StmtAssign { - range: 729..738, + range: 739..748, targets: [ Name( ExprName { - range: 729..731, + range: 739..741, id: "p1", ctx: Store, }, ), ], - value: LineMagic( - ExprLineMagic { - range: 734..738, + value: IpyEscapeCommand( + ExprIpyEscapeCommand { + range: 744..748, kind: Shell, value: "pwd", }, @@ -270,25 +270,25 @@ Module( ), AnnAssign( StmtAnnAssign { - range: 739..753, + range: 749..763, target: Name( ExprName { - range: 739..741, + range: 749..751, id: "p2", ctx: Store, }, ), annotation: Name( ExprName { - range: 743..746, + range: 753..756, id: "str", ctx: Load, }, ), value: Some( - LineMagic( - ExprLineMagic { - range: 749..753, + IpyEscapeCommand( + ExprIpyEscapeCommand { + range: 759..763, kind: Shell, value: "pwd", }, @@ -299,98 +299,98 @@ Module( ), Assign( StmtAssign { - range: 754..774, + range: 764..784, targets: [ Name( ExprName { - range: 754..757, + range: 764..767, id: "foo", ctx: Store, }, ), ], - value: LineMagic( - ExprLineMagic { - range: 760..774, + value: IpyEscapeCommand( + ExprIpyEscapeCommand { + range: 770..784, kind: Magic, value: "foo bar", }, ), }, ), - LineMagic( - StmtLineMagic { - range: 776..781, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 786..791, kind: Magic, value: " foo", }, ), Assign( StmtAssign { - range: 782..803, + range: 792..813, targets: [ Name( ExprName { - range: 782..785, + range: 792..795, id: "foo", ctx: Store, }, ), ], - value: LineMagic( - ExprLineMagic { - range: 788..803, + value: IpyEscapeCommand( + ExprIpyEscapeCommand { + range: 798..813, kind: Magic, value: "foo # comment", }, ), }, ), - LineMagic( - StmtLineMagic { - range: 828..832, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 838..842, kind: Help, value: "foo", }, ), - LineMagic( - StmtLineMagic { - range: 833..842, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 843..852, kind: Help2, value: "foo.bar", }, ), - LineMagic( - StmtLineMagic { - range: 843..855, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 853..865, kind: Help, value: "foo.bar.baz", }, ), - LineMagic( - StmtLineMagic { - range: 856..864, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 866..874, kind: Help2, value: "foo[0]", }, ), - LineMagic( - StmtLineMagic { - range: 865..875, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 875..885, kind: Help, value: "foo[0][1]", }, ), - LineMagic( - StmtLineMagic { - range: 876..895, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 886..905, kind: Help2, value: "foo.bar[0].baz[1]", }, ), - LineMagic( - StmtLineMagic { - range: 896..919, + IpyEscapeCommand( + StmtIpyEscapeCommand { + range: 906..929, kind: Help2, value: "foo.bar[0].baz[2].egg", }, diff --git a/crates/ruff_python_parser/src/token.rs b/crates/ruff_python_parser/src/token.rs index 6a19cf1f37..db159a0340 100644 --- a/crates/ruff_python_parser/src/token.rs +++ b/crates/ruff_python_parser/src/token.rs @@ -6,7 +6,7 @@ //! [CPython source]: https://github.com/python/cpython/blob/dfc2e065a2e71011017077e549cd2f9bf4944c54/Include/internal/pycore_token.h; use crate::Mode; use num_bigint::BigInt; -use ruff_python_ast::MagicKind; +use ruff_python_ast::IpyEscapeKind; use ruff_text_size::TextSize; use std::fmt; @@ -44,13 +44,13 @@ pub enum Tok { /// Whether the string is triple quoted. triple_quoted: bool, }, - /// Token value for a Jupyter magic commands. These are filtered out of the token stream - /// prior to parsing when the mode is [`Mode::Jupyter`]. - MagicCommand { + /// Token value for IPython escape commands. These are recognized by the lexer + /// only when the mode is [`Mode::Jupyter`]. + IpyEscapeCommand { /// The magic command value. value: String, /// The kind of magic command. - kind: MagicKind, + kind: IpyEscapeKind, }, /// Token value for a comment. These are filtered out of the token stream prior to parsing. Comment(String), @@ -234,7 +234,7 @@ impl fmt::Display for Tok { let quotes = "\"".repeat(if *triple_quoted { 3 } else { 1 }); write!(f, "{kind}{quotes}{value}{quotes}") } - MagicCommand { kind, value } => write!(f, "{kind}{value}"), + IpyEscapeCommand { kind, value } => write!(f, "{kind}{value}"), Newline => f.write_str("Newline"), NonLogicalNewline => f.write_str("NonLogicalNewline"), Indent => f.write_str("Indent"), @@ -450,8 +450,8 @@ pub enum TokenKind { Complex, /// Token value for a string. String, - /// Token value for a Jupyter magic command. - MagicCommand, + /// Token value for a IPython escape command. + EscapeCommand, /// Token value for a comment. These are filtered out of the token stream prior to parsing. Comment, /// Token value for a newline. @@ -781,7 +781,7 @@ impl TokenKind { Tok::Float { .. } => TokenKind::Float, Tok::Complex { .. } => TokenKind::Complex, Tok::String { .. } => TokenKind::String, - Tok::MagicCommand { .. } => TokenKind::MagicCommand, + Tok::IpyEscapeCommand { .. } => TokenKind::EscapeCommand, Tok::Comment(_) => TokenKind::Comment, Tok::Newline => TokenKind::Newline, Tok::NonLogicalNewline => TokenKind::NonLogicalNewline, From e4f57434a217c827396001b00e9ac53895642149 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 10:17:43 -0500 Subject: [PATCH 049/155] ci(deps): bump cloudflare/wrangler-action from 2.0.0 to 3.0.0 (#6398) Bumps [cloudflare/wrangler-action](https://github.com/cloudflare/wrangler-action) from 2.0.0 to 3.0.0.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cloudflare/wrangler-action&package-manager=github_actions&previous-version=2.0.0&new-version=3.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yaml | 2 +- .github/workflows/playground.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 146ce520a1..8a691c0290 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -40,7 +40,7 @@ jobs: run: mkdocs build --strict -f mkdocs.generated.yml - name: "Deploy to Cloudflare Pages" if: ${{ env.CF_API_TOKEN_EXISTS == 'true' }} - uses: cloudflare/wrangler-action@2.0.0 + uses: cloudflare/wrangler-action@3.0.0 with: apiToken: ${{ secrets.CF_API_TOKEN }} accountId: ${{ secrets.CF_ACCOUNT_ID }} diff --git a/.github/workflows/playground.yaml b/.github/workflows/playground.yaml index 819ade66b2..ee0e6f65bf 100644 --- a/.github/workflows/playground.yaml +++ b/.github/workflows/playground.yaml @@ -40,7 +40,7 @@ jobs: working-directory: playground - name: "Deploy to Cloudflare Pages" if: ${{ env.CF_API_TOKEN_EXISTS == 'true' }} - uses: cloudflare/wrangler-action@2.0.0 + uses: cloudflare/wrangler-action@3.0.0 with: apiToken: ${{ secrets.CF_API_TOKEN }} accountId: ${{ secrets.CF_ACCOUNT_ID }} From 38b9fb8bbd522e92711c1e44029252b6f60b747c Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 9 Aug 2023 11:19:27 -0400 Subject: [PATCH 050/155] Set a default on `PythonVersion` (#6446) ## Summary I think it makes sense for `PythonVersion::default()` to return our minimum-supported non-EOL version. ## Test Plan `cargo test` --------- Co-authored-by: Zanie --- crates/ruff/src/settings/defaults.rs | 4 +--- crates/ruff/src/settings/mod.rs | 2 +- crates/ruff/src/settings/types.rs | 14 +++++++++++++- crates/ruff_wasm/src/lib.rs | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/crates/ruff/src/settings/defaults.rs b/crates/ruff/src/settings/defaults.rs index 1605c6b027..a7ef3d3b88 100644 --- a/crates/ruff/src/settings/defaults.rs +++ b/crates/ruff/src/settings/defaults.rs @@ -24,8 +24,6 @@ pub const PREFIXES: &[RuleSelector] = &[ RuleSelector::Linter(Linter::Pyflakes), ]; -pub const TARGET_VERSION: PythonVersion = PythonVersion::Py38; - pub const TASK_TAGS: &[&str] = &["TODO", "FIXME", "XXX"]; pub static DUMMY_VARIABLE_RGX: Lazy = @@ -91,7 +89,7 @@ impl Default for Settings { respect_gitignore: true, src: vec![path_dedot::CWD.clone()], tab_size: TabSize::default(), - target_version: TARGET_VERSION, + target_version: PythonVersion::default(), task_tags: TASK_TAGS.iter().map(ToString::to_string).collect(), typing_modules: vec![], flake8_annotations: flake8_annotations::settings::Settings::default(), diff --git a/crates/ruff/src/settings/mod.rs b/crates/ruff/src/settings/mod.rs index efdddd4374..51aaed88dd 100644 --- a/crates/ruff/src/settings/mod.rs +++ b/crates/ruff/src/settings/mod.rs @@ -183,7 +183,7 @@ impl Settings { .src .unwrap_or_else(|| vec![project_root.to_path_buf()]), project_root: project_root.to_path_buf(), - target_version: config.target_version.unwrap_or(defaults::TARGET_VERSION), + target_version: config.target_version.unwrap_or_default(), task_tags: config.task_tags.unwrap_or_else(|| { defaults::TASK_TAGS .iter() diff --git a/crates/ruff/src/settings/types.rs b/crates/ruff/src/settings/types.rs index 538918f8dd..9e180882e5 100644 --- a/crates/ruff/src/settings/types.rs +++ b/crates/ruff/src/settings/types.rs @@ -19,13 +19,25 @@ use crate::registry::RuleSet; use crate::rule_selector::RuleSelector; #[derive( - Clone, Copy, Debug, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize, CacheKey, EnumIter, + Clone, + Copy, + Debug, + PartialOrd, + Ord, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, + CacheKey, + EnumIter, )] #[cfg_attr(feature = "clap", derive(clap::ValueEnum))] #[serde(rename_all = "lowercase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub enum PythonVersion { Py37, + #[default] Py38, Py39, Py310, diff --git a/crates/ruff_wasm/src/lib.rs b/crates/ruff_wasm/src/lib.rs index d8aa2c0e64..602b18f552 100644 --- a/crates/ruff_wasm/src/lib.rs +++ b/crates/ruff_wasm/src/lib.rs @@ -20,6 +20,7 @@ use ruff::rules::{ }; use ruff::settings::configuration::Configuration; use ruff::settings::options::Options; +use ruff::settings::types::PythonVersion; use ruff::settings::{defaults, flags, Settings}; use ruff_python_ast::PySourceType; use ruff_python_codegen::Stylist; @@ -134,7 +135,7 @@ impl Workspace { line_length: Some(LineLength::default()), select: Some(defaults::PREFIXES.to_vec()), tab_size: Some(TabSize::default()), - target_version: Some(defaults::TARGET_VERSION), + target_version: Some(PythonVersion::default()), // Ignore a bunch of options that don't make sense in a single-file editor. cache_dir: None, exclude: None, From 6acf07c5c4da36b8234904395f007d730803609d Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 9 Aug 2023 11:22:39 -0400 Subject: [PATCH 051/155] Use latest Python version by default in tests (#6448) ## Summary Use the same Python version by default for all tests (our latest-supported version). ## Test Plan `cargo test` --------- Co-authored-by: Zanie --- crates/ruff/src/rules/flake8_bugbear/mod.rs | 6 ++---- ...__flake8_pyi__tests__PYI050_PYI050.py.snap | 21 +++++++++++++++++++ ..._flake8_pyi__tests__PYI050_PYI050.pyi.snap | 6 +++--- .../ruff/src/rules/flake8_use_pathlib/mod.rs | 6 ++---- ..._rules__isort__tests__if_elif_else.py.snap | 7 +++---- crates/ruff/src/rules/perflint/mod.rs | 3 ++- crates/ruff/src/rules/pylint/mod.rs | 2 +- crates/ruff/src/rules/pyupgrade/mod.rs | 16 ++------------ ...f__rules__pyupgrade__tests__UP040.py.snap} | 0 crates/ruff/src/rules/ruff/mod.rs | 2 +- crates/ruff/src/settings/mod.rs | 2 ++ crates/ruff/src/settings/types.rs | 1 + 12 files changed, 40 insertions(+), 32 deletions(-) rename crates/ruff/src/rules/pyupgrade/snapshots/{ruff__rules__pyupgrade__tests__non_pep695_type_alias_py312.snap => ruff__rules__pyupgrade__tests__UP040.py.snap} (100%) diff --git a/crates/ruff/src/rules/flake8_bugbear/mod.rs b/crates/ruff/src/rules/flake8_bugbear/mod.rs index 50edabed6d..1d92306633 100644 --- a/crates/ruff/src/rules/flake8_bugbear/mod.rs +++ b/crates/ruff/src/rules/flake8_bugbear/mod.rs @@ -11,7 +11,6 @@ mod tests { use crate::assert_messages; use crate::registry::Rule; - use crate::settings::types::PythonVersion; use crate::settings::Settings; use crate::test::test_path; @@ -65,8 +64,7 @@ mod tests { let snapshot = "B905.py"; let diagnostics = test_path( Path::new("flake8_bugbear").join(snapshot).as_path(), - &Settings::for_rule(Rule::ZipWithoutExplicitStrict) - .with_target_version(PythonVersion::latest()), + &Settings::for_rule(Rule::ZipWithoutExplicitStrict), )?; assert_messages!(snapshot, diagnostics); Ok(()) @@ -84,7 +82,7 @@ mod tests { "fastapi.Query".to_string(), ], }, - ..Settings::for_rules(vec![Rule::FunctionCallInDefaultArgument]) + ..Settings::for_rule(Rule::FunctionCallInDefaultArgument) }, )?; assert_messages!(snapshot, diagnostics); diff --git a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.py.snap b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.py.snap index d1aa2e9116..492243cf19 100644 --- a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.py.snap +++ b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.py.snap @@ -1,4 +1,25 @@ --- source: crates/ruff/src/rules/flake8_pyi/mod.rs --- +PYI050.py:13:24: PYI050 Prefer `typing.Never` over `NoReturn` for argument annotations + | +13 | def foo_no_return(arg: NoReturn): + | ^^^^^^^^ PYI050 +14 | ... + | + +PYI050.py:23:44: PYI050 Prefer `typing.Never` over `NoReturn` for argument annotations + | +23 | def foo_no_return_kwarg(arg: int, *, arg2: NoReturn): + | ^^^^^^^^ PYI050 +24 | ... + | + +PYI050.py:27:47: PYI050 Prefer `typing.Never` over `NoReturn` for argument annotations + | +27 | def foo_no_return_pos_only(arg: int, /, arg2: NoReturn): + | ^^^^^^^^ PYI050 +28 | ... + | + diff --git a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.pyi.snap b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.pyi.snap index f476783f00..2eafac7805 100644 --- a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.pyi.snap +++ b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI050_PYI050.pyi.snap @@ -1,7 +1,7 @@ --- source: crates/ruff/src/rules/flake8_pyi/mod.rs --- -PYI050.pyi:6:24: PYI050 Prefer `typing_extensions.Never` over `NoReturn` for argument annotations +PYI050.pyi:6:24: PYI050 Prefer `typing.Never` over `NoReturn` for argument annotations | 4 | def foo(arg): ... 5 | def foo_int(arg: int): ... @@ -11,7 +11,7 @@ PYI050.pyi:6:24: PYI050 Prefer `typing_extensions.Never` over `NoReturn` for arg 8 | arg: typing_extensions.NoReturn, | -PYI050.pyi:10:44: PYI050 Prefer `typing_extensions.Never` over `NoReturn` for argument annotations +PYI050.pyi:10:44: PYI050 Prefer `typing.Never` over `NoReturn` for argument annotations | 8 | arg: typing_extensions.NoReturn, 9 | ): ... # Error: PYI050 @@ -21,7 +21,7 @@ PYI050.pyi:10:44: PYI050 Prefer `typing_extensions.Never` over `NoReturn` for ar 12 | def foo_never(arg: Never): ... | -PYI050.pyi:11:47: PYI050 Prefer `typing_extensions.Never` over `NoReturn` for argument annotations +PYI050.pyi:11:47: PYI050 Prefer `typing.Never` over `NoReturn` for argument annotations | 9 | ): ... # Error: PYI050 10 | def foo_no_return_kwarg(arg: int, *, arg2: NoReturn): ... # Error: PYI050 diff --git a/crates/ruff/src/rules/flake8_use_pathlib/mod.rs b/crates/ruff/src/rules/flake8_use_pathlib/mod.rs index 39a0bd7bbd..b319fd92ee 100644 --- a/crates/ruff/src/rules/flake8_use_pathlib/mod.rs +++ b/crates/ruff/src/rules/flake8_use_pathlib/mod.rs @@ -12,7 +12,6 @@ mod tests { use crate::assert_messages; use crate::registry::Rule; use crate::settings; - use crate::settings::types::PythonVersion; use crate::test::test_path; #[test_case(Path::new("full_name.py"))] @@ -49,8 +48,7 @@ mod tests { Rule::OsPathSamefile, Rule::OsPathSplitext, Rule::BuiltinOpen, - ]) - .with_target_version(PythonVersion::latest()), + ]), )?; assert_messages!(snapshot, diagnostics); Ok(()) @@ -69,7 +67,7 @@ mod tests { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( Path::new("flake8_use_pathlib").join(path).as_path(), - &settings::Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), + &settings::Settings::for_rule(rule_code), )?; assert_messages!(snapshot, diagnostics); Ok(()) diff --git a/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__if_elif_else.py.snap b/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__if_elif_else.py.snap index 514bc775e9..4a9a844881 100644 --- a/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__if_elif_else.py.snap +++ b/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__if_elif_else.py.snap @@ -14,9 +14,8 @@ if_elif_else.py:6:1: I001 [*] Import block is un-sorted or un-formatted 3 3 | elif "setuptools" in sys.modules: 4 4 | from setuptools.command.sdist import sdist as _sdist 5 5 | else: -6 |- from setuptools.command.sdist import sdist as _sdist -7 6 | from distutils.command.sdist import sdist as _sdist - 7 |+ - 8 |+ from setuptools.command.sdist import sdist as _sdist + 6 |+ from distutils.command.sdist import sdist as _sdist +6 7 | from setuptools.command.sdist import sdist as _sdist +7 |- from distutils.command.sdist import sdist as _sdist diff --git a/crates/ruff/src/rules/perflint/mod.rs b/crates/ruff/src/rules/perflint/mod.rs index 291bfcd207..3e196d479d 100644 --- a/crates/ruff/src/rules/perflint/mod.rs +++ b/crates/ruff/src/rules/perflint/mod.rs @@ -10,6 +10,7 @@ mod tests { use crate::assert_messages; use crate::registry::Rule; + use crate::settings::types::PythonVersion; use crate::settings::Settings; use crate::test::test_path; @@ -22,7 +23,7 @@ mod tests { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( Path::new("perflint").join(path).as_path(), - &Settings::for_rule(rule_code), + &Settings::for_rule(rule_code).with_target_version(PythonVersion::Py310), )?; assert_messages!(snapshot, diagnostics); Ok(()) diff --git a/crates/ruff/src/rules/pylint/mod.rs b/crates/ruff/src/rules/pylint/mod.rs index 6f127f394d..fbbb859126 100644 --- a/crates/ruff/src/rules/pylint/mod.rs +++ b/crates/ruff/src/rules/pylint/mod.rs @@ -130,7 +130,7 @@ mod tests { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( Path::new("pylint").join(path).as_path(), - &Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), + &Settings::for_rule(rule_code), )?; assert_messages!(snapshot, diagnostics); Ok(()) diff --git a/crates/ruff/src/rules/pyupgrade/mod.rs b/crates/ruff/src/rules/pyupgrade/mod.rs index edbec0e5c5..3e75dc8550 100644 --- a/crates/ruff/src/rules/pyupgrade/mod.rs +++ b/crates/ruff/src/rules/pyupgrade/mod.rs @@ -77,11 +77,12 @@ mod tests { #[test_case(Rule::UselessObjectInheritance, Path::new("UP004.py"))] #[test_case(Rule::YieldInForLoop, Path::new("UP028_0.py"))] #[test_case(Rule::YieldInForLoop, Path::new("UP028_1.py"))] + #[test_case(Rule::NonPEP695TypeAlias, Path::new("UP040.py"))] fn rules(rule_code: Rule, path: &Path) -> Result<()> { let snapshot = path.to_string_lossy().to_string(); let diagnostics = test_path( Path::new("pyupgrade").join(path).as_path(), - &settings::Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), + &settings::Settings::for_rule(rule_code), )?; assert_messages!(snapshot, diagnostics); Ok(()) @@ -100,19 +101,6 @@ mod tests { Ok(()) } - #[test] - fn non_pep695_type_alias_py312() -> Result<()> { - let diagnostics = test_path( - Path::new("pyupgrade/UP040.py"), - &settings::Settings { - target_version: PythonVersion::Py312, - ..settings::Settings::for_rule(Rule::NonPEP695TypeAlias) - }, - )?; - assert_messages!(diagnostics); - Ok(()) - } - #[test] fn future_annotations_keep_runtime_typing_p37() -> Result<()> { let diagnostics = test_path( diff --git a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__non_pep695_type_alias_py312.snap b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP040.py.snap similarity index 100% rename from crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__non_pep695_type_alias_py312.snap rename to crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP040.py.snap diff --git a/crates/ruff/src/rules/ruff/mod.rs b/crates/ruff/src/rules/ruff/mod.rs index 1195b3b559..e49a97709e 100644 --- a/crates/ruff/src/rules/ruff/mod.rs +++ b/crates/ruff/src/rules/ruff/mod.rs @@ -44,7 +44,7 @@ mod tests { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( Path::new("ruff").join(path).as_path(), - &settings::Settings::for_rule(rule_code).with_target_version(PythonVersion::latest()), + &settings::Settings::for_rule(rule_code), )?; assert_messages!(snapshot, diagnostics); Ok(()) diff --git a/crates/ruff/src/settings/mod.rs b/crates/ruff/src/settings/mod.rs index 51aaed88dd..ffae78aa08 100644 --- a/crates/ruff/src/settings/mod.rs +++ b/crates/ruff/src/settings/mod.rs @@ -298,6 +298,7 @@ impl Settings { pub fn for_rule(rule_code: Rule) -> Self { Self { rules: RuleTable::from_iter([rule_code]), + target_version: PythonVersion::latest(), ..Self::default() } } @@ -305,6 +306,7 @@ impl Settings { pub fn for_rules(rules: impl IntoIterator) -> Self { Self { rules: RuleTable::from_iter(rules), + target_version: PythonVersion::latest(), ..Self::default() } } diff --git a/crates/ruff/src/settings/types.rs b/crates/ruff/src/settings/types.rs index 9e180882e5..8461604425 100644 --- a/crates/ruff/src/settings/types.rs +++ b/crates/ruff/src/settings/types.rs @@ -53,6 +53,7 @@ impl From for Pep440Version { } impl PythonVersion { + /// Return the latest supported Python version. pub const fn latest() -> Self { Self::Py312 } From 3ecd263b4d1af3935b0f58e8a1dd4f4d2d8007ff Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 9 Aug 2023 13:32:33 -0500 Subject: [PATCH 052/155] Bump version to 0.0.284 (#6453) ## What's Changed This release fixes a few bugs, notably the previous release announced a breaking change where the default target Python version changed from 3.10 to 3.8 but it was not applied. Thanks to @rco-ableton for fixing this in https://github.com/astral-sh/ruff/pull/6444 ### Bug Fixes * Do not trigger `S108` if path is inside `tempfile.*` call by @dhruvmanila in https://github.com/astral-sh/ruff/pull/6416 * Do not allow on zero tab width by @tjkuson in https://github.com/astral-sh/ruff/pull/6429 * Fix false-positive in submodule resolution by @charliermarsh in https://github.com/astral-sh/ruff/pull/6435 ## New Contributors * @rco-ableton made their first contribution in https://github.com/astral-sh/ruff/pull/6444 **Full Changelog**: https://github.com/astral-sh/ruff/compare/v0.0.283...v0.0.284 --- BREAKING_CHANGES.md | 4 +++- Cargo.lock | 6 +++--- README.md | 2 +- crates/flake8_to_ruff/Cargo.toml | 2 +- crates/ruff/Cargo.toml | 2 +- crates/ruff_cli/Cargo.toml | 2 +- docs/tutorial.md | 2 +- docs/usage.md | 6 +++--- pyproject.toml | 2 +- 9 files changed, 15 insertions(+), 13 deletions(-) diff --git a/BREAKING_CHANGES.md b/BREAKING_CHANGES.md index 8c68d5ccc2..c10e07250f 100644 --- a/BREAKING_CHANGES.md +++ b/BREAKING_CHANGES.md @@ -1,6 +1,6 @@ # Breaking Changes -## 0.0.283 +## 0.0.283 / 0.284 ### The target Python version now defaults to 3.8 instead of 3.10 ([#6397](https://github.com/astral-sh/ruff/pull/6397)) @@ -8,6 +8,8 @@ Previously, when a target Python version was not specified, Ruff would use a def (We still support Python 3.7 but since [it has reached EOL](https://devguide.python.org/versions/#unsupported-versions) we've decided not to make it the default here.) +Note this change was announced in 0.0.283 but not active until 0.0.284. + ## 0.0.277 ### `.ipynb_checkpoints`, `.pyenv`, `.pytest_cache`, and `.vscode` are now excluded by default ([#5513](https://github.com/astral-sh/ruff/pull/5513)) diff --git a/Cargo.lock b/Cargo.lock index 8707b07130..d83d108da5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -800,7 +800,7 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flake8-to-ruff" -version = "0.0.283" +version = "0.0.284" dependencies = [ "anyhow", "clap", @@ -2042,7 +2042,7 @@ dependencies = [ [[package]] name = "ruff" -version = "0.0.283" +version = "0.0.284" dependencies = [ "annotate-snippets 0.9.1", "anyhow", @@ -2141,7 +2141,7 @@ dependencies = [ [[package]] name = "ruff_cli" -version = "0.0.283" +version = "0.0.284" dependencies = [ "annotate-snippets 0.9.1", "anyhow", diff --git a/README.md b/README.md index a835da57db..b7439a603e 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Ruff can also be used as a [pre-commit](https://pre-commit.com) hook: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.283 + rev: v0.0.284 hooks: - id: ruff ``` diff --git a/crates/flake8_to_ruff/Cargo.toml b/crates/flake8_to_ruff/Cargo.toml index bb384cdedb..d14ebcc308 100644 --- a/crates/flake8_to_ruff/Cargo.toml +++ b/crates/flake8_to_ruff/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "flake8-to-ruff" -version = "0.0.283" +version = "0.0.284" description = """ Convert Flake8 configuration files to Ruff configuration files. """ diff --git a/crates/ruff/Cargo.toml b/crates/ruff/Cargo.toml index 9b2f2f7b87..89bd53ab00 100644 --- a/crates/ruff/Cargo.toml +++ b/crates/ruff/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ruff" -version = "0.0.283" +version = "0.0.284" publish = false authors = { workspace = true } edition = { workspace = true } diff --git a/crates/ruff_cli/Cargo.toml b/crates/ruff_cli/Cargo.toml index 2db8807199..ae0afe8e09 100644 --- a/crates/ruff_cli/Cargo.toml +++ b/crates/ruff_cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ruff_cli" -version = "0.0.283" +version = "0.0.284" publish = false authors = { workspace = true } edition = { workspace = true } diff --git a/docs/tutorial.md b/docs/tutorial.md index 39a9331536..15abe9b339 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -242,7 +242,7 @@ This tutorial has focused on Ruff's command-line interface, but Ruff can also be ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.283 + rev: v0.0.284 hooks: - id: ruff ``` diff --git a/docs/usage.md b/docs/usage.md index 7e695f9927..5fffdab953 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ Ruff can also be used as a [pre-commit](https://pre-commit.com) hook: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.283 + rev: v0.0.284 hooks: - id: ruff ``` @@ -32,7 +32,7 @@ Or, to enable autofix: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.283 + rev: v0.0.284 hooks: - id: ruff args: [ --fix, --exit-non-zero-on-fix ] @@ -43,7 +43,7 @@ Or, to run the hook on Jupyter Notebooks too: ```yaml - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.0.283 + rev: v0.0.284 hooks: - id: ruff types_or: [python, pyi, jupyter] diff --git a/pyproject.toml b/pyproject.toml index 497004e757..366670751d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "maturin" [project] name = "ruff" -version = "0.0.283" +version = "0.0.284" description = "An extremely fast Python linter, written in Rust." authors = [{ name = "Charlie Marsh", email = "charlie.r.marsh@gmail.com" }] maintainers = [{ name = "Charlie Marsh", email = "charlie.r.marsh@gmail.com" }] From 395bb3124702f363af5922d0906c2b241ba93584 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 9 Aug 2023 16:39:10 -0400 Subject: [PATCH 053/155] Improve counting of message arguments when msg is provided as a keyword (#6456) Closes https://github.com/astral-sh/ruff/issues/6454. --- .../fixtures/pylint/logging_too_few_args.py | 4 ++++ .../fixtures/pylint/logging_too_many_args.py | 4 ++++ crates/ruff/src/rules/pylint/rules/logging.rs | 4 ++-- crates/ruff_python_ast/src/nodes.rs | 22 +++++++++---------- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pylint/logging_too_few_args.py b/crates/ruff/resources/test/fixtures/pylint/logging_too_few_args.py index 2fc6f49ab5..65f021ea42 100644 --- a/crates/ruff/resources/test/fixtures/pylint/logging_too_few_args.py +++ b/crates/ruff/resources/test/fixtures/pylint/logging_too_few_args.py @@ -19,6 +19,10 @@ logging.error("Example log %s, %s", "foo", "bar", "baz", **kwargs) # do not handle keyword arguments logging.error("%(objects)d modifications: %(modifications)d errors: %(errors)d") +logging.info(msg="Hello %s") + +logging.info(msg="Hello %s %s") + import warning warning.warning("Hello %s %s", "World!") diff --git a/crates/ruff/resources/test/fixtures/pylint/logging_too_many_args.py b/crates/ruff/resources/test/fixtures/pylint/logging_too_many_args.py index c087b05c4e..c64641eaed 100644 --- a/crates/ruff/resources/test/fixtures/pylint/logging_too_many_args.py +++ b/crates/ruff/resources/test/fixtures/pylint/logging_too_many_args.py @@ -15,6 +15,10 @@ logging.error("Example log %s, %s", "foo", "bar", "baz", **kwargs) # do not handle keyword arguments logging.error("%(objects)d modifications: %(modifications)d errors: %(errors)d", {"objects": 1, "modifications": 1, "errors": 1}) +logging.info(msg="Hello") + +logging.info(msg="Hello", something="else") + import warning warning.warning("Hello %s", "World!", "again") diff --git a/crates/ruff/src/rules/pylint/rules/logging.rs b/crates/ruff/src/rules/pylint/rules/logging.rs index 5d2f0604ac..5f778ea5d6 100644 --- a/crates/ruff/src/rules/pylint/rules/logging.rs +++ b/crates/ruff/src/rules/pylint/rules/logging.rs @@ -111,8 +111,8 @@ pub(crate) fn logging_call(checker: &mut Checker, call: &ast::ExprCall) { let Some(Expr::Constant(ast::ExprConstant { value: Constant::Str(value), .. - })) = call.arguments.find_argument("msg", 0) - else { + })) = call.arguments + .find_positional( 0) else { return; }; diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs index 46efa5b098..5011ba76d9 100644 --- a/crates/ruff_python_ast/src/nodes.rs +++ b/crates/ruff_python_ast/src/nodes.rs @@ -2126,23 +2126,21 @@ impl Arguments { }) } + /// Return the positional argument at the given index, or `None` if no such argument exists. + pub fn find_positional(&self, position: usize) -> Option<&Expr> { + self.args + .iter() + .take_while(|expr| !expr.is_starred_expr()) + .nth(position) + } + /// Return the argument with the given name or at the given position, or `None` if no such /// argument exists. Used to retrieve arguments that can be provided _either_ as keyword or /// positional arguments. pub fn find_argument(&self, name: &str, position: usize) -> Option<&Expr> { - self.keywords - .iter() - .find(|keyword| { - let Keyword { arg, .. } = keyword; - arg.as_ref().is_some_and(|arg| arg == name) - }) + self.find_keyword(name) .map(|keyword| &keyword.value) - .or_else(|| { - self.args - .iter() - .take_while(|expr| !expr.is_starred_expr()) - .nth(position) - }) + .or_else(|| self.find_positional(position)) } } From 627f475b91c618b3e303f9497de3a089f16a9abd Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 9 Aug 2023 16:46:41 -0400 Subject: [PATCH 054/155] Avoid applying `PYI055` to runtime-evaluated annotations (#6457) ## Summary The use of `|` as a union operator is not always safe, if a type annotation is evaluated in a runtime context. For example, this code errors at runtime: ```python import httpretty import requests_mock item: type[requests_mock.Mocker | httpretty] = requests_mock.Mocker ``` However, it's fine in a `.pyi` file, with `__future__` annotations`, or if the annotation is in a non-evaluated context, like: ```python def func(): item: type[requests_mock.Mocker | httpretty] = requests_mock.Mocker ``` This PR modifies the rule to avoid enforcing in those invalid, runtime-evaluated contexts. Closes https://github.com/astral-sh/ruff/issues/6455. --- .../test/fixtures/flake8_pyi/PYI055.py | 17 +++- .../test/fixtures/flake8_pyi/PYI055.pyi | 10 ++- .../rules/unnecessary_type_union.rs | 5 ++ ...__flake8_pyi__tests__PYI055_PYI055.py.snap | 54 ++---------- ..._flake8_pyi__tests__PYI055_PYI055.pyi.snap | 87 ++++++++++++------- 5 files changed, 86 insertions(+), 87 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.py b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.py index 84b0caf2ad..adbc1f737a 100644 --- a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.py +++ b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.py @@ -1,7 +1,6 @@ import builtins from typing import Union - w: builtins.type[int] | builtins.type[str] | builtins.type[complex] x: type[int] | type[str] | type[float] y: builtins.type[int] | type[str] | builtins.type[complex] @@ -9,7 +8,9 @@ z: Union[type[float], type[complex]] z: Union[type[float, int], type[complex]] -def func(arg: type[int] | str | type[float]) -> None: ... +def func(arg: type[int] | str | type[float]) -> None: + ... + # OK x: type[int, str, float] @@ -17,4 +18,14 @@ y: builtins.type[int, str, complex] z: Union[float, complex] -def func(arg: type[int, float] | str) -> None: ... +def func(arg: type[int, float] | str) -> None: + ... + + +# OK +item: type[requests_mock.Mocker] | type[httpretty] = requests_mock.Mocker + + +def func(): + # PYI055 + item: type[requests_mock.Mocker] | type[httpretty] = requests_mock.Mocker diff --git a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.pyi b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.pyi index 84b0caf2ad..3cc530f770 100644 --- a/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.pyi +++ b/crates/ruff/resources/test/fixtures/flake8_pyi/PYI055.pyi @@ -1,14 +1,12 @@ import builtins from typing import Union - w: builtins.type[int] | builtins.type[str] | builtins.type[complex] x: type[int] | type[str] | type[float] y: builtins.type[int] | type[str] | builtins.type[complex] z: Union[type[float], type[complex]] z: Union[type[float, int], type[complex]] - def func(arg: type[int] | str | type[float]) -> None: ... # OK @@ -16,5 +14,11 @@ x: type[int, str, float] y: builtins.type[int, str, complex] z: Union[float, complex] - def func(arg: type[int, float] | str) -> None: ... + +# OK +item: type[requests_mock.Mocker] | type[httpretty] = requests_mock.Mocker + +def func(): + # PYI055 + item: type[requests_mock.Mocker] | type[httpretty] = requests_mock.Mocker diff --git a/crates/ruff/src/rules/flake8_pyi/rules/unnecessary_type_union.rs b/crates/ruff/src/rules/flake8_pyi/rules/unnecessary_type_union.rs index 488d7c9c8e..8c0cac5c97 100644 --- a/crates/ruff/src/rules/flake8_pyi/rules/unnecessary_type_union.rs +++ b/crates/ruff/src/rules/flake8_pyi/rules/unnecessary_type_union.rs @@ -43,6 +43,11 @@ impl Violation for UnnecessaryTypeUnion { /// PYI055 pub(crate) fn unnecessary_type_union<'a>(checker: &mut Checker, union: &'a Expr) { + // The `|` operator isn't always safe to allow to runtime-evaluated annotations. + if checker.semantic().execution_context().is_runtime() { + return; + } + let mut type_exprs = Vec::new(); // Check if `union` is a PEP604 union (e.g. `float | int`) or a `typing.Union[float, int]` diff --git a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.py.snap b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.py.snap index 78622d6f93..8f474e08d7 100644 --- a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.py.snap +++ b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.py.snap @@ -1,56 +1,12 @@ --- source: crates/ruff/src/rules/flake8_pyi/mod.rs --- -PYI055.py:5:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | complex]`. - | -5 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -6 | x: type[int] | type[str] | type[float] -7 | y: builtins.type[int] | type[str] | builtins.type[complex] - | - -PYI055.py:6:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | float]`. - | -5 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] -6 | x: type[int] | type[str] | type[float] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -7 | y: builtins.type[int] | type[str] | builtins.type[complex] -8 | z: Union[type[float], type[complex]] - | - -PYI055.py:7:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | complex]`. - | -5 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] -6 | x: type[int] | type[str] | type[float] -7 | y: builtins.type[int] | type[str] | builtins.type[complex] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -8 | z: Union[type[float], type[complex]] -9 | z: Union[type[float, int], type[complex]] - | - -PYI055.py:8:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[Union[float, complex]]`. - | -6 | x: type[int] | type[str] | type[float] -7 | y: builtins.type[int] | type[str] | builtins.type[complex] -8 | z: Union[type[float], type[complex]] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -9 | z: Union[type[float, int], type[complex]] - | - -PYI055.py:9:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[Union[float, int, complex]]`. - | -7 | y: builtins.type[int] | type[str] | builtins.type[complex] -8 | z: Union[type[float], type[complex]] -9 | z: Union[type[float, int], type[complex]] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 - | - -PYI055.py:12:15: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | float]`. +PYI055.py:31:11: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[requests_mock.Mocker | httpretty]`. | -12 | def func(arg: type[int] | str | type[float]) -> None: ... - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -13 | -14 | # OK +29 | def func(): +30 | # PYI055 +31 | item: type[requests_mock.Mocker] | type[httpretty] = requests_mock.Mocker + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 | diff --git a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.pyi.snap b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.pyi.snap index f0ab0f3f53..a8262366ed 100644 --- a/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.pyi.snap +++ b/crates/ruff/src/rules/flake8_pyi/snapshots/ruff__rules__flake8_pyi__tests__PYI055_PYI055.pyi.snap @@ -1,56 +1,79 @@ --- source: crates/ruff/src/rules/flake8_pyi/mod.rs --- -PYI055.pyi:5:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | complex]`. +PYI055.pyi:4:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | complex]`. | -5 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] +2 | from typing import Union +3 | +4 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -6 | x: type[int] | type[str] | type[float] -7 | y: builtins.type[int] | type[str] | builtins.type[complex] +5 | x: type[int] | type[str] | type[float] +6 | y: builtins.type[int] | type[str] | builtins.type[complex] | -PYI055.pyi:6:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | float]`. +PYI055.pyi:5:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | float]`. | -5 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] -6 | x: type[int] | type[str] | type[float] +4 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] +5 | x: type[int] | type[str] | type[float] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -7 | y: builtins.type[int] | type[str] | builtins.type[complex] -8 | z: Union[type[float], type[complex]] +6 | y: builtins.type[int] | type[str] | builtins.type[complex] +7 | z: Union[type[float], type[complex]] | -PYI055.pyi:7:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | complex]`. +PYI055.pyi:6:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | str | complex]`. | -5 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] -6 | x: type[int] | type[str] | type[float] -7 | y: builtins.type[int] | type[str] | builtins.type[complex] +4 | w: builtins.type[int] | builtins.type[str] | builtins.type[complex] +5 | x: type[int] | type[str] | type[float] +6 | y: builtins.type[int] | type[str] | builtins.type[complex] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -8 | z: Union[type[float], type[complex]] -9 | z: Union[type[float, int], type[complex]] +7 | z: Union[type[float], type[complex]] +8 | z: Union[type[float, int], type[complex]] | -PYI055.pyi:8:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[Union[float, complex]]`. +PYI055.pyi:7:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[Union[float, complex]]`. | -6 | x: type[int] | type[str] | type[float] -7 | y: builtins.type[int] | type[str] | builtins.type[complex] -8 | z: Union[type[float], type[complex]] +5 | x: type[int] | type[str] | type[float] +6 | y: builtins.type[int] | type[str] | builtins.type[complex] +7 | z: Union[type[float], type[complex]] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -9 | z: Union[type[float, int], type[complex]] +8 | z: Union[type[float, int], type[complex]] | -PYI055.pyi:9:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[Union[float, int, complex]]`. - | -7 | y: builtins.type[int] | type[str] | builtins.type[complex] -8 | z: Union[type[float], type[complex]] -9 | z: Union[type[float, int], type[complex]] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 - | - -PYI055.pyi:12:15: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | float]`. +PYI055.pyi:8:4: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[Union[float, int, complex]]`. | -12 | def func(arg: type[int] | str | type[float]) -> None: ... + 6 | y: builtins.type[int] | type[str] | builtins.type[complex] + 7 | z: Union[type[float], type[complex]] + 8 | z: Union[type[float, int], type[complex]] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 + 9 | +10 | def func(arg: type[int] | str | type[float]) -> None: ... + | + +PYI055.pyi:10:15: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[int | float]`. + | + 8 | z: Union[type[float, int], type[complex]] + 9 | +10 | def func(arg: type[int] | str | type[float]) -> None: ... | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 -13 | -14 | # OK +11 | +12 | # OK + | + +PYI055.pyi:20:7: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[requests_mock.Mocker | httpretty]`. + | +19 | # OK +20 | item: type[requests_mock.Mocker] | type[httpretty] = requests_mock.Mocker + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 +21 | +22 | def func(): + | + +PYI055.pyi:24:11: PYI055 Multiple `type` members in a union. Combine them into one, e.g., `type[requests_mock.Mocker | httpretty]`. + | +22 | def func(): +23 | # PYI055 +24 | item: type[requests_mock.Mocker] | type[httpretty] = requests_mock.Mocker + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI055 | From 0252995973aeaa1b565b05fbf0ddce8e37c6ac11 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 9 Aug 2023 18:13:29 -0400 Subject: [PATCH 055/155] Document `FormatSpec` fields (#6458) --- crates/ruff_python_literal/src/format.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/ruff_python_literal/src/format.rs b/crates/ruff_python_literal/src/format.rs index 43565966f2..89e7ef852a 100644 --- a/crates/ruff_python_literal/src/format.rs +++ b/crates/ruff_python_literal/src/format.rs @@ -188,14 +188,23 @@ impl FormatParse for FormatType { #[derive(Debug, PartialEq)] pub struct FormatSpec { + // Ex) `!s` in `'{!s}'` conversion: Option, + // Ex) `*` in `'{:*^30}'` fill: Option, + // Ex) `<` in `'{:<30}'` align: Option, + // Ex) `+` in `'{:+f}'` sign: Option, + // Ex) `#` in `'{:#x}'` alternate_form: bool, + // Ex) `30` in `'{:<30}'` width: Option, + // Ex) `,` in `'{:,}'` grouping_option: Option, + // Ex) `2` in `'{:.2}'` precision: Option, + // Ex) `f` in `'{:+f}'` format_type: Option, } From 7eea0e94a23b774ecadbb5a5e780933311c7bab3 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 9 Aug 2023 22:34:51 -0400 Subject: [PATCH 056/155] Add containers to E721 types (#6469) Related to https://github.com/astral-sh/ruff/issues/6465. --- .../src/rules/pycodestyle/rules/type_comparison.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/ruff/src/rules/pycodestyle/rules/type_comparison.rs b/crates/ruff/src/rules/pycodestyle/rules/type_comparison.rs index 2dc6887341..d0ae2d70a9 100644 --- a/crates/ruff/src/rules/pycodestyle/rules/type_comparison.rs +++ b/crates/ruff/src/rules/pycodestyle/rules/type_comparison.rs @@ -103,7 +103,15 @@ pub(crate) fn type_comparison(checker: &mut Checker, compare: &ast::ExprCompare) // Ex) `type(obj) is int` if matches!( id.as_str(), - "int" | "str" | "float" | "bool" | "complex" | "bytes" + "int" + | "str" + | "float" + | "bool" + | "complex" + | "bytes" + | "list" + | "dict" + | "set" ) && checker.semantic().is_builtin(id) { checker From c1bc67686c0712bf6f5e68a1e65abf10d3150e0f Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Thu, 10 Aug 2023 08:13:14 +0200 Subject: [PATCH 057/155] Use SimpleTokenizer in `max_lines` (#6451) --- .../src/comments/placement.rs | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 113b48ee93..686415efc9 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -3,11 +3,9 @@ use std::cmp::Ordering; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::whitespace::indentation; use ruff_python_ast::{self as ast, Comprehension, Expr, MatchCase, Parameters, Ranged}; -use ruff_python_trivia::{ - indentation_at_offset, PythonWhitespace, SimpleToken, SimpleTokenKind, SimpleTokenizer, -}; -use ruff_source_file::{Locator, UniversalNewlines}; -use ruff_text_size::TextRange; +use ruff_python_trivia::{indentation_at_offset, SimpleToken, SimpleTokenKind, SimpleTokenizer}; +use ruff_source_file::Locator; +use ruff_text_size::{TextLen, TextRange}; use crate::comments::visitor::{CommentPlacement, DecoratedComment}; use crate::expression::expr_slice::{assign_comment_in_slice, ExprSliceCommentSection}; @@ -1438,21 +1436,32 @@ fn is_first_statement_in_alternate_body(statement: AnyNodeRef, has_body: AnyNode } } -/// Counts the number of newlines in `contents`. -fn max_empty_lines(contents: &str) -> usize { - let mut empty_lines = 0; - let mut max_empty_lines = 0; +/// Counts the number of empty lines in `contents`. +fn max_empty_lines(contents: &str) -> u32 { + let mut newlines = 0u32; + let mut max_new_lines = 0; - for line in contents.universal_newlines().skip(1) { - if line.trim_whitespace().is_empty() { - empty_lines += 1; - } else { - max_empty_lines = max_empty_lines.max(empty_lines); - empty_lines = 0; + for token in SimpleTokenizer::new(contents, TextRange::up_to(contents.text_len())) { + match token.kind() { + SimpleTokenKind::Newline => { + newlines += 1; + } + + SimpleTokenKind::Whitespace => {} + + SimpleTokenKind::Comment => { + max_new_lines = newlines.max(max_new_lines); + newlines = 0; + } + + _ => { + max_new_lines = newlines.max(max_new_lines); + break; + } } } - max_empty_lines + max_new_lines.saturating_sub(1) } #[cfg(test)] From ac5c8bb3b683fb009b39098c00f9357e9aeb6e38 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Thu, 10 Aug 2023 08:35:09 +0200 Subject: [PATCH 058/155] Add `AnyNodeRef.visit_preorder` ## Summary This PR adds the `AnyNodeRef.visit_preorder` method. I'll need this method to mark all comments of a suppressed node's children as formatted (in debug builds). I'm not super happy with this because it now requires a double-dispatch where the `walk_*` methods call into `node.visit_preorder` and the `visit_preorder` then calls back into the visitor. Meaning, the new implementation now probably results in way more function calls. The other downside is that `AnyNodeRef` now contains code that is difficult to auto-generate. This could be mitigated by extracting the `visit_preorder` method into its own `VisitPreorder` trait. Anyway, this approach solves the need and avoids duplicating the visiting code once more. ## Test Plan `cargo test` --- crates/ruff_python_ast/src/node.rs | 1235 +++++++++++++++++ .../ruff_python_ast/src/visitor/preorder.rs | 726 ++-------- 2 files changed, 1321 insertions(+), 640 deletions(-) diff --git a/crates/ruff_python_ast/src/node.rs b/crates/ruff_python_ast/src/node.rs index 2bc1642af6..4f6798d07e 100644 --- a/crates/ruff_python_ast/src/node.rs +++ b/crates/ruff_python_ast/src/node.rs @@ -1,3 +1,4 @@ +use crate::visitor::preorder::PreorderVisitor; use crate::{ self as ast, Alias, Arguments, Comprehension, Decorator, ExceptHandler, Expr, Keyword, MatchCase, Mod, Parameter, ParameterWithDefault, Parameters, Pattern, Ranged, Stmt, TypeParam, @@ -17,6 +18,10 @@ pub trait AstNode: Ranged { /// Consumes `self` and returns its [`AnyNode`] representation. fn into_any_node(self) -> AnyNode; + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized; } #[derive(Clone, Debug, is_macro::Is, PartialEq)] @@ -672,7 +677,16 @@ impl AstNode for ast::ModModule { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ModModule { body, range: _ } = self; + visitor.visit_body(body); + } } + impl AstNode for ast::ModExpression { fn cast(kind: AnyNode) -> Option where @@ -700,6 +714,14 @@ impl AstNode for ast::ModExpression { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ModExpression { body, range: _ } = self; + visitor.visit_expr(body); + } } impl AstNode for ast::StmtFunctionDef { fn cast(kind: AnyNode) -> Option @@ -728,6 +750,36 @@ impl AstNode for ast::StmtFunctionDef { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtFunctionDef { + parameters, + body, + decorator_list, + returns, + type_params, + .. + } = self; + + for decorator in decorator_list { + visitor.visit_decorator(decorator); + } + + if let Some(type_params) = type_params { + visitor.visit_type_params(type_params); + } + + visitor.visit_parameters(parameters); + + for expr in returns { + visitor.visit_annotation(expr); + } + + visitor.visit_body(body); + } } impl AstNode for ast::StmtClassDef { fn cast(kind: AnyNode) -> Option @@ -756,6 +808,33 @@ impl AstNode for ast::StmtClassDef { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtClassDef { + arguments, + body, + decorator_list, + type_params, + .. + } = self; + + for decorator in decorator_list { + visitor.visit_decorator(decorator); + } + + if let Some(type_params) = type_params { + visitor.visit_type_params(type_params); + } + + if let Some(arguments) = arguments { + visitor.visit_arguments(arguments); + } + + visitor.visit_body(body); + } } impl AstNode for ast::StmtReturn { fn cast(kind: AnyNode) -> Option @@ -784,6 +863,16 @@ impl AstNode for ast::StmtReturn { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtReturn { value, range: _ } = self; + if let Some(expr) = value { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::StmtDelete { fn cast(kind: AnyNode) -> Option @@ -812,6 +901,16 @@ impl AstNode for ast::StmtDelete { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtDelete { targets, range: _ } = self; + for expr in targets { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::StmtTypeAlias { fn cast(kind: AnyNode) -> Option @@ -840,6 +939,24 @@ impl AstNode for ast::StmtTypeAlias { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtTypeAlias { + range: _, + name, + type_params, + value, + } = self; + + visitor.visit_expr(name); + if let Some(type_params) = type_params { + visitor.visit_type_params(type_params); + } + visitor.visit_expr(value); + } } impl AstNode for ast::StmtAssign { fn cast(kind: AnyNode) -> Option @@ -868,6 +985,23 @@ impl AstNode for ast::StmtAssign { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtAssign { + targets, + value, + range: _, + } = self; + + for expr in targets { + visitor.visit_expr(expr); + } + + visitor.visit_expr(value); + } } impl AstNode for ast::StmtAugAssign { fn cast(kind: AnyNode) -> Option @@ -896,6 +1030,22 @@ impl AstNode for ast::StmtAugAssign { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtAugAssign { + target, + op, + value, + range: _, + } = self; + + visitor.visit_expr(target); + visitor.visit_operator(op); + visitor.visit_expr(value); + } } impl AstNode for ast::StmtAnnAssign { fn cast(kind: AnyNode) -> Option @@ -924,6 +1074,25 @@ impl AstNode for ast::StmtAnnAssign { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtAnnAssign { + target, + annotation, + value, + range: _, + simple: _, + } = self; + + visitor.visit_expr(target); + visitor.visit_annotation(annotation); + if let Some(expr) = value { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::StmtFor { fn cast(kind: AnyNode) -> Option @@ -952,6 +1121,24 @@ impl AstNode for ast::StmtFor { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtFor { + target, + iter, + body, + orelse, + .. + } = self; + + visitor.visit_expr(target); + visitor.visit_expr(iter); + visitor.visit_body(body); + visitor.visit_body(orelse); + } } impl AstNode for ast::StmtWhile { fn cast(kind: AnyNode) -> Option @@ -980,6 +1167,22 @@ impl AstNode for ast::StmtWhile { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtWhile { + test, + body, + orelse, + range: _, + } = self; + + visitor.visit_expr(test); + visitor.visit_body(body); + visitor.visit_body(orelse); + } } impl AstNode for ast::StmtIf { fn cast(kind: AnyNode) -> Option @@ -1008,6 +1211,24 @@ impl AstNode for ast::StmtIf { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtIf { + test, + body, + elif_else_clauses, + range: _, + } = self; + + visitor.visit_expr(test); + visitor.visit_body(body); + for clause in elif_else_clauses { + visitor.visit_elif_else_clause(clause); + } + } } impl AstNode for ast::ElifElseClause { fn cast(kind: AnyNode) -> Option @@ -1036,6 +1257,21 @@ impl AstNode for ast::ElifElseClause { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ElifElseClause { + range: _, + test, + body, + } = self; + if let Some(test) = test { + visitor.visit_expr(test); + } + visitor.visit_body(body); + } } impl AstNode for ast::StmtWith { fn cast(kind: AnyNode) -> Option @@ -1064,6 +1300,23 @@ impl AstNode for ast::StmtWith { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtWith { + items, + body, + is_async: _, + range: _, + } = self; + + for with_item in items { + visitor.visit_with_item(with_item); + } + visitor.visit_body(body); + } } impl AstNode for ast::StmtMatch { fn cast(kind: AnyNode) -> Option @@ -1092,6 +1345,22 @@ impl AstNode for ast::StmtMatch { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtMatch { + subject, + cases, + range: _, + } = self; + + visitor.visit_expr(subject); + for match_case in cases { + visitor.visit_match_case(match_case); + } + } } impl AstNode for ast::StmtRaise { fn cast(kind: AnyNode) -> Option @@ -1120,6 +1389,24 @@ impl AstNode for ast::StmtRaise { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtRaise { + exc, + cause, + range: _, + } = self; + + if let Some(expr) = exc { + visitor.visit_expr(expr); + }; + if let Some(expr) = cause { + visitor.visit_expr(expr); + }; + } } impl AstNode for ast::StmtTry { fn cast(kind: AnyNode) -> Option @@ -1148,6 +1435,26 @@ impl AstNode for ast::StmtTry { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtTry { + body, + handlers, + orelse, + finalbody, + range: _, + } = self; + + visitor.visit_body(body); + for except_handler in handlers { + visitor.visit_except_handler(except_handler); + } + visitor.visit_body(orelse); + visitor.visit_body(finalbody); + } } impl AstNode for ast::StmtTryStar { fn cast(kind: AnyNode) -> Option @@ -1176,6 +1483,26 @@ impl AstNode for ast::StmtTryStar { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtTryStar { + body, + handlers, + orelse, + finalbody, + range: _, + } = self; + + visitor.visit_body(body); + for except_handler in handlers { + visitor.visit_except_handler(except_handler); + } + visitor.visit_body(orelse); + visitor.visit_body(finalbody); + } } impl AstNode for ast::StmtAssert { fn cast(kind: AnyNode) -> Option @@ -1204,6 +1531,21 @@ impl AstNode for ast::StmtAssert { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtAssert { + test, + msg, + range: _, + } = self; + visitor.visit_expr(test); + if let Some(expr) = msg { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::StmtImport { fn cast(kind: AnyNode) -> Option @@ -1232,6 +1574,17 @@ impl AstNode for ast::StmtImport { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtImport { names, range: _ } = self; + + for alias in names { + visitor.visit_alias(alias); + } + } } impl AstNode for ast::StmtImportFrom { fn cast(kind: AnyNode) -> Option @@ -1260,6 +1613,22 @@ impl AstNode for ast::StmtImportFrom { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtImportFrom { + range: _, + module: _, + names, + level: _, + } = self; + + for alias in names { + visitor.visit_alias(alias); + } + } } impl AstNode for ast::StmtGlobal { fn cast(kind: AnyNode) -> Option @@ -1288,6 +1657,13 @@ impl AstNode for ast::StmtGlobal { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + } } impl AstNode for ast::StmtNonlocal { fn cast(kind: AnyNode) -> Option @@ -1316,6 +1692,13 @@ impl AstNode for ast::StmtNonlocal { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + } } impl AstNode for ast::StmtExpr { fn cast(kind: AnyNode) -> Option @@ -1344,6 +1727,15 @@ impl AstNode for ast::StmtExpr { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::StmtExpr { value, range: _ } = self; + + visitor.visit_expr(value); + } } impl AstNode for ast::StmtPass { fn cast(kind: AnyNode) -> Option @@ -1372,6 +1764,13 @@ impl AstNode for ast::StmtPass { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + } } impl AstNode for ast::StmtBreak { fn cast(kind: AnyNode) -> Option @@ -1400,6 +1799,13 @@ impl AstNode for ast::StmtBreak { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + } } impl AstNode for ast::StmtContinue { fn cast(kind: AnyNode) -> Option @@ -1428,6 +1834,13 @@ impl AstNode for ast::StmtContinue { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + } } impl AstNode for ast::StmtIpyEscapeCommand { fn cast(kind: AnyNode) -> Option @@ -1456,6 +1869,13 @@ impl AstNode for ast::StmtIpyEscapeCommand { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + } } impl AstNode for ast::ExprBoolOp { fn cast(kind: AnyNode) -> Option @@ -1484,6 +1904,29 @@ impl AstNode for ast::ExprBoolOp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprBoolOp { + op, + values, + range: _, + } = self; + match values.as_slice() { + [left, rest @ ..] => { + visitor.visit_expr(left); + visitor.visit_bool_op(op); + for expr in rest { + visitor.visit_expr(expr); + } + } + [] => { + visitor.visit_bool_op(op); + } + } + } } impl AstNode for ast::ExprNamedExpr { fn cast(kind: AnyNode) -> Option @@ -1512,6 +1955,19 @@ impl AstNode for ast::ExprNamedExpr { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprNamedExpr { + target, + value, + range: _, + } = self; + visitor.visit_expr(target); + visitor.visit_expr(value); + } } impl AstNode for ast::ExprBinOp { fn cast(kind: AnyNode) -> Option @@ -1540,6 +1996,21 @@ impl AstNode for ast::ExprBinOp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprBinOp { + left, + op, + right, + range: _, + } = self; + visitor.visit_expr(left); + visitor.visit_operator(op); + visitor.visit_expr(right); + } } impl AstNode for ast::ExprUnaryOp { fn cast(kind: AnyNode) -> Option @@ -1568,6 +2039,20 @@ impl AstNode for ast::ExprUnaryOp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprUnaryOp { + op, + operand, + range: _, + } = self; + + visitor.visit_unary_op(op); + visitor.visit_expr(operand); + } } impl AstNode for ast::ExprLambda { fn cast(kind: AnyNode) -> Option @@ -1596,6 +2081,20 @@ impl AstNode for ast::ExprLambda { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprLambda { + parameters, + body, + range: _, + } = self; + + visitor.visit_parameters(parameters); + visitor.visit_expr(body); + } } impl AstNode for ast::ExprIfExp { fn cast(kind: AnyNode) -> Option @@ -1624,6 +2123,23 @@ impl AstNode for ast::ExprIfExp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprIfExp { + test, + body, + orelse, + range: _, + } = self; + + // `body if test else orelse` + visitor.visit_expr(body); + visitor.visit_expr(test); + visitor.visit_expr(orelse); + } } impl AstNode for ast::ExprDict { fn cast(kind: AnyNode) -> Option @@ -1652,6 +2168,24 @@ impl AstNode for ast::ExprDict { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprDict { + keys, + values, + range: _, + } = self; + + for (key, value) in keys.iter().zip(values) { + if let Some(key) = key { + visitor.visit_expr(key); + } + visitor.visit_expr(value); + } + } } impl AstNode for ast::ExprSet { fn cast(kind: AnyNode) -> Option @@ -1680,6 +2214,17 @@ impl AstNode for ast::ExprSet { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprSet { elts, range: _ } = self; + + for expr in elts { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::ExprListComp { fn cast(kind: AnyNode) -> Option @@ -1708,6 +2253,22 @@ impl AstNode for ast::ExprListComp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprListComp { + elt, + generators, + range: _, + } = self; + + visitor.visit_expr(elt); + for comprehension in generators { + visitor.visit_comprehension(comprehension); + } + } } impl AstNode for ast::ExprSetComp { fn cast(kind: AnyNode) -> Option @@ -1736,6 +2297,22 @@ impl AstNode for ast::ExprSetComp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprSetComp { + elt, + generators, + range: _, + } = self; + + visitor.visit_expr(elt); + for comprehension in generators { + visitor.visit_comprehension(comprehension); + } + } } impl AstNode for ast::ExprDictComp { fn cast(kind: AnyNode) -> Option @@ -1764,6 +2341,25 @@ impl AstNode for ast::ExprDictComp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprDictComp { + key, + value, + generators, + range: _, + } = self; + + visitor.visit_expr(key); + visitor.visit_expr(value); + + for comprehension in generators { + visitor.visit_comprehension(comprehension); + } + } } impl AstNode for ast::ExprGeneratorExp { fn cast(kind: AnyNode) -> Option @@ -1792,6 +2388,21 @@ impl AstNode for ast::ExprGeneratorExp { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprGeneratorExp { + elt, + generators, + range: _, + } = self; + visitor.visit_expr(elt); + for comprehension in generators { + visitor.visit_comprehension(comprehension); + } + } } impl AstNode for ast::ExprAwait { fn cast(kind: AnyNode) -> Option @@ -1820,6 +2431,14 @@ impl AstNode for ast::ExprAwait { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprAwait { value, range: _ } = self; + visitor.visit_expr(value); + } } impl AstNode for ast::ExprYield { fn cast(kind: AnyNode) -> Option @@ -1848,6 +2467,16 @@ impl AstNode for ast::ExprYield { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprYield { value, range: _ } = self; + if let Some(expr) = value { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::ExprYieldFrom { fn cast(kind: AnyNode) -> Option @@ -1876,6 +2505,14 @@ impl AstNode for ast::ExprYieldFrom { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprYieldFrom { value, range: _ } = self; + visitor.visit_expr(value); + } } impl AstNode for ast::ExprCompare { fn cast(kind: AnyNode) -> Option @@ -1904,6 +2541,25 @@ impl AstNode for ast::ExprCompare { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprCompare { + left, + ops, + comparators, + range: _, + } = self; + + visitor.visit_expr(left); + + for (op, comparator) in ops.iter().zip(comparators) { + visitor.visit_cmp_op(op); + visitor.visit_expr(comparator); + } + } } impl AstNode for ast::ExprCall { fn cast(kind: AnyNode) -> Option @@ -1932,6 +2588,19 @@ impl AstNode for ast::ExprCall { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprCall { + func, + arguments, + range: _, + } = self; + visitor.visit_expr(func); + visitor.visit_arguments(arguments); + } } impl AstNode for ast::ExprFormattedValue { fn cast(kind: AnyNode) -> Option @@ -1960,6 +2629,20 @@ impl AstNode for ast::ExprFormattedValue { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprFormattedValue { + value, format_spec, .. + } = self; + visitor.visit_expr(value); + + if let Some(expr) = format_spec { + visitor.visit_format_spec(expr); + } + } } impl AstNode for ast::ExprFString { fn cast(kind: AnyNode) -> Option @@ -1988,6 +2671,17 @@ impl AstNode for ast::ExprFString { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprFString { values, range: _ } = self; + + for expr in values { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::ExprConstant { fn cast(kind: AnyNode) -> Option @@ -2016,6 +2710,18 @@ impl AstNode for ast::ExprConstant { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprConstant { + value, + range: _, + kind: _, + } = self; + visitor.visit_constant(value); + } } impl AstNode for ast::ExprAttribute { fn cast(kind: AnyNode) -> Option @@ -2044,6 +2750,20 @@ impl AstNode for ast::ExprAttribute { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprAttribute { + value, + attr: _, + ctx: _, + range: _, + } = self; + + visitor.visit_expr(value); + } } impl AstNode for ast::ExprSubscript { fn cast(kind: AnyNode) -> Option @@ -2072,6 +2792,20 @@ impl AstNode for ast::ExprSubscript { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprSubscript { + value, + slice, + ctx: _, + range: _, + } = self; + visitor.visit_expr(value); + visitor.visit_expr(slice); + } } impl AstNode for ast::ExprStarred { fn cast(kind: AnyNode) -> Option @@ -2100,6 +2834,19 @@ impl AstNode for ast::ExprStarred { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprStarred { + value, + ctx: _, + range: _, + } = self; + + visitor.visit_expr(value); + } } impl AstNode for ast::ExprName { fn cast(kind: AnyNode) -> Option @@ -2128,6 +2875,18 @@ impl AstNode for ast::ExprName { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprName { + id: _, + ctx: _, + range: _, + } = self; + } } impl AstNode for ast::ExprList { fn cast(kind: AnyNode) -> Option @@ -2156,6 +2915,21 @@ impl AstNode for ast::ExprList { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprList { + elts, + ctx: _, + range: _, + } = self; + + for expr in elts { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::ExprTuple { fn cast(kind: AnyNode) -> Option @@ -2184,6 +2958,21 @@ impl AstNode for ast::ExprTuple { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprTuple { + elts, + ctx: _, + range: _, + } = self; + + for expr in elts { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::ExprSlice { fn cast(kind: AnyNode) -> Option @@ -2212,6 +3001,27 @@ impl AstNode for ast::ExprSlice { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprSlice { + lower, + upper, + step, + range: _, + } = self; + + if let Some(expr) = lower { + visitor.visit_expr(expr); + } + if let Some(expr) = upper { + visitor.visit_expr(expr); + } + if let Some(expr) = step { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::ExprIpyEscapeCommand { fn cast(kind: AnyNode) -> Option @@ -2240,6 +3050,18 @@ impl AstNode for ast::ExprIpyEscapeCommand { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExprIpyEscapeCommand { + range: _, + kind: _, + value: _, + } = self; + } } impl AstNode for ast::ExceptHandlerExceptHandler { fn cast(kind: AnyNode) -> Option @@ -2268,6 +3090,22 @@ impl AstNode for ast::ExceptHandlerExceptHandler { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ExceptHandlerExceptHandler { + range: _, + type_, + name: _, + body, + } = self; + if let Some(expr) = type_ { + visitor.visit_expr(expr); + } + visitor.visit_body(body); + } } impl AstNode for ast::PatternMatchValue { fn cast(kind: AnyNode) -> Option @@ -2296,6 +3134,14 @@ impl AstNode for ast::PatternMatchValue { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchValue { value, range: _ } = self; + visitor.visit_expr(value); + } } impl AstNode for ast::PatternMatchSingleton { fn cast(kind: AnyNode) -> Option @@ -2324,6 +3170,14 @@ impl AstNode for ast::PatternMatchSingleton { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchSingleton { value, range: _ } = self; + visitor.visit_constant(value); + } } impl AstNode for ast::PatternMatchSequence { fn cast(kind: AnyNode) -> Option @@ -2352,6 +3206,16 @@ impl AstNode for ast::PatternMatchSequence { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchSequence { patterns, range: _ } = self; + for pattern in patterns { + visitor.visit_pattern(pattern); + } + } } impl AstNode for ast::PatternMatchMapping { fn cast(kind: AnyNode) -> Option @@ -2380,6 +3244,22 @@ impl AstNode for ast::PatternMatchMapping { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchMapping { + keys, + patterns, + range: _, + rest: _, + } = self; + for (key, pattern) in keys.iter().zip(patterns) { + visitor.visit_expr(key); + visitor.visit_pattern(pattern); + } + } } impl AstNode for ast::PatternMatchClass { fn cast(kind: AnyNode) -> Option @@ -2408,6 +3288,27 @@ impl AstNode for ast::PatternMatchClass { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchClass { + cls, + patterns, + kwd_attrs: _, + kwd_patterns, + range: _, + } = self; + visitor.visit_expr(cls); + for pattern in patterns { + visitor.visit_pattern(pattern); + } + + for pattern in kwd_patterns { + visitor.visit_pattern(pattern); + } + } } impl AstNode for ast::PatternMatchStar { fn cast(kind: AnyNode) -> Option @@ -2436,6 +3337,14 @@ impl AstNode for ast::PatternMatchStar { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchStar { range: _, name: _ } = self; + } } impl AstNode for ast::PatternMatchAs { fn cast(kind: AnyNode) -> Option @@ -2464,6 +3373,20 @@ impl AstNode for ast::PatternMatchAs { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchAs { + pattern, + range: _, + name: _, + } = self; + if let Some(pattern) = pattern { + visitor.visit_pattern(pattern); + } + } } impl AstNode for ast::PatternMatchOr { fn cast(kind: AnyNode) -> Option @@ -2492,6 +3415,16 @@ impl AstNode for ast::PatternMatchOr { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::PatternMatchOr { patterns, range: _ } = self; + for pattern in patterns { + visitor.visit_pattern(pattern); + } + } } impl AstNode for Comprehension { @@ -2521,6 +3454,25 @@ impl AstNode for Comprehension { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::Comprehension { + range: _, + target, + iter, + ifs, + is_async: _, + } = self; + visitor.visit_expr(target); + visitor.visit_expr(iter); + + for expr in ifs { + visitor.visit_expr(expr); + } + } } impl AstNode for Arguments { fn cast(kind: AnyNode) -> Option @@ -2549,6 +3501,25 @@ impl AstNode for Arguments { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::Arguments { + range: _, + args, + keywords, + } = self; + + for arg in args { + visitor.visit_expr(arg); + } + + for keyword in keywords { + visitor.visit_keyword(keyword); + } + } } impl AstNode for Parameters { fn cast(kind: AnyNode) -> Option @@ -2577,6 +3548,35 @@ impl AstNode for Parameters { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::Parameters { + range: _, + posonlyargs, + args, + vararg, + kwonlyargs, + kwarg, + } = self; + for arg in posonlyargs.iter().chain(args) { + visitor.visit_parameter_with_default(arg); + } + + if let Some(arg) = vararg { + visitor.visit_parameter(arg); + } + + for arg in kwonlyargs { + visitor.visit_parameter_with_default(arg); + } + + if let Some(arg) = kwarg { + visitor.visit_parameter(arg); + } + } } impl AstNode for Parameter { fn cast(kind: AnyNode) -> Option @@ -2605,6 +3605,21 @@ impl AstNode for Parameter { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::Parameter { + range: _, + name: _, + annotation, + } = self; + + if let Some(expr) = annotation { + visitor.visit_annotation(expr); + } + } } impl AstNode for ParameterWithDefault { fn cast(kind: AnyNode) -> Option @@ -2633,6 +3648,21 @@ impl AstNode for ParameterWithDefault { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::ParameterWithDefault { + range: _, + parameter, + default, + } = self; + visitor.visit_parameter(parameter); + if let Some(expr) = default { + visitor.visit_expr(expr); + } + } } impl AstNode for Keyword { fn cast(kind: AnyNode) -> Option @@ -2661,6 +3691,19 @@ impl AstNode for Keyword { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::Keyword { + range: _, + arg: _, + value, + } = self; + + visitor.visit_expr(value); + } } impl AstNode for Alias { fn cast(kind: AnyNode) -> Option @@ -2689,6 +3732,18 @@ impl AstNode for Alias { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::Alias { + range: _, + name: _, + asname: _, + } = self; + } } impl AstNode for WithItem { fn cast(kind: AnyNode) -> Option @@ -2717,6 +3772,23 @@ impl AstNode for WithItem { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::WithItem { + range: _, + context_expr, + optional_vars, + } = self; + + visitor.visit_expr(context_expr); + + if let Some(expr) = optional_vars { + visitor.visit_expr(expr); + } + } } impl AstNode for MatchCase { fn cast(kind: AnyNode) -> Option @@ -2745,6 +3817,24 @@ impl AstNode for MatchCase { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::MatchCase { + range: _, + pattern, + guard, + body, + } = self; + + visitor.visit_pattern(pattern); + if let Some(expr) = guard { + visitor.visit_expr(expr); + } + visitor.visit_body(body); + } } impl AstNode for Decorator { @@ -2774,6 +3864,18 @@ impl AstNode for Decorator { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::Decorator { + range: _, + expression, + } = self; + + visitor.visit_expr(expression); + } } impl AstNode for ast::TypeParams { fn cast(kind: AnyNode) -> Option @@ -2802,6 +3904,20 @@ impl AstNode for ast::TypeParams { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::TypeParams { + range: _, + type_params, + } = self; + + for type_param in type_params { + visitor.visit_type_param(type_param); + } + } } impl AstNode for ast::TypeParamTypeVar { fn cast(kind: AnyNode) -> Option @@ -2830,6 +3946,21 @@ impl AstNode for ast::TypeParamTypeVar { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::TypeParamTypeVar { + bound, + name: _, + range: _, + } = self; + + if let Some(expr) = bound { + visitor.visit_expr(expr); + } + } } impl AstNode for ast::TypeParamTypeVarTuple { fn cast(kind: AnyNode) -> Option @@ -2858,6 +3989,14 @@ impl AstNode for ast::TypeParamTypeVarTuple { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::TypeParamTypeVarTuple { range: _, name: _ } = self; + } } impl AstNode for ast::TypeParamParamSpec { fn cast(kind: AnyNode) -> Option @@ -2886,6 +4025,14 @@ impl AstNode for ast::TypeParamParamSpec { fn into_any_node(self) -> AnyNode { AnyNode::from(self) } + + #[inline] + fn visit_preorder<'a, V>(&'a self, _visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + let ast::TypeParamParamSpec { range: _, name: _ } = self; + } } impl From for AnyNode { fn from(stmt: Stmt) -> Self { @@ -4259,6 +5406,94 @@ impl AnyNodeRef<'_> { AnyNodeRef::ExceptHandlerExceptHandler(_) | AnyNodeRef::ElifElseClause(_) ) } + + pub fn visit_preorder<'a, V>(&'a self, visitor: &mut V) + where + V: PreorderVisitor<'a> + ?Sized, + { + match self { + AnyNodeRef::ModModule(node) => node.visit_preorder(visitor), + AnyNodeRef::ModExpression(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtFunctionDef(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtClassDef(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtReturn(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtDelete(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtTypeAlias(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtAssign(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtAugAssign(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtAnnAssign(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtFor(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtWhile(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtIf(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtWith(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtMatch(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtRaise(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtTry(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtTryStar(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtAssert(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtImport(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtImportFrom(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtGlobal(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtNonlocal(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtExpr(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtPass(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtBreak(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtContinue(node) => node.visit_preorder(visitor), + AnyNodeRef::StmtIpyEscapeCommand(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprBoolOp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprNamedExpr(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprBinOp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprUnaryOp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprLambda(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprIfExp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprDict(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprSet(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprListComp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprSetComp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprDictComp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprGeneratorExp(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprAwait(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprYield(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprYieldFrom(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprCompare(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprCall(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprFormattedValue(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprFString(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprConstant(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprAttribute(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprSubscript(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprStarred(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprName(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprList(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprTuple(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprSlice(node) => node.visit_preorder(visitor), + AnyNodeRef::ExprIpyEscapeCommand(node) => node.visit_preorder(visitor), + AnyNodeRef::ExceptHandlerExceptHandler(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchValue(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchSingleton(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchSequence(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchMapping(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchClass(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchStar(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchAs(node) => node.visit_preorder(visitor), + AnyNodeRef::PatternMatchOr(node) => node.visit_preorder(visitor), + AnyNodeRef::Comprehension(node) => node.visit_preorder(visitor), + AnyNodeRef::Arguments(node) => node.visit_preorder(visitor), + AnyNodeRef::Parameters(node) => node.visit_preorder(visitor), + AnyNodeRef::Parameter(node) => node.visit_preorder(visitor), + AnyNodeRef::ParameterWithDefault(node) => node.visit_preorder(visitor), + AnyNodeRef::Keyword(node) => node.visit_preorder(visitor), + AnyNodeRef::Alias(node) => node.visit_preorder(visitor), + AnyNodeRef::WithItem(node) => node.visit_preorder(visitor), + AnyNodeRef::MatchCase(node) => node.visit_preorder(visitor), + AnyNodeRef::Decorator(node) => node.visit_preorder(visitor), + AnyNodeRef::TypeParams(node) => node.visit_preorder(visitor), + AnyNodeRef::TypeParamTypeVar(node) => node.visit_preorder(visitor), + AnyNodeRef::TypeParamTypeVarTuple(node) => node.visit_preorder(visitor), + AnyNodeRef::TypeParamParamSpec(node) => node.visit_preorder(visitor), + AnyNodeRef::ElifElseClause(node) => node.visit_preorder(visitor), + } + } } impl<'a> From<&'a ast::ModModule> for AnyNodeRef<'a> { diff --git a/crates/ruff_python_ast/src/visitor/preorder.rs b/crates/ruff_python_ast/src/visitor/preorder.rs index b96b5228b1..229f111a57 100644 --- a/crates/ruff_python_ast/src/visitor/preorder.rs +++ b/crates/ruff_python_ast/src/visitor/preorder.rs @@ -1,9 +1,8 @@ -use crate::node::AnyNodeRef; +use crate::node::{AnyNodeRef, AstNode}; use crate::{ - self as ast, Alias, Arguments, BoolOp, CmpOp, Comprehension, Constant, Decorator, - ElifElseClause, ExceptHandler, Expr, Keyword, MatchCase, Mod, Operator, Parameter, - ParameterWithDefault, Parameters, Pattern, Stmt, TypeParam, TypeParamTypeVar, TypeParams, - UnaryOp, WithItem, + Alias, Arguments, BoolOp, CmpOp, Comprehension, Constant, Decorator, ElifElseClause, + ExceptHandler, Expr, Keyword, MatchCase, Mod, Operator, Parameter, ParameterWithDefault, + Parameters, Pattern, Stmt, TypeParam, TypeParams, UnaryOp, WithItem, }; /// Visitor that traverses all nodes recursively in pre-order. @@ -152,10 +151,8 @@ where let node = AnyNodeRef::from(module); if visitor.enter_node(node).is_traverse() { match module { - Mod::Module(ast::ModModule { body, range: _ }) => { - visitor.visit_body(body); - } - Mod::Expression(ast::ModExpression { body, range: _ }) => visitor.visit_expr(body), + Mod::Module(module) => module.visit_preorder(visitor), + Mod::Expression(module) => module.visit_preorder(visitor), } } @@ -179,246 +176,32 @@ where if visitor.enter_node(node).is_traverse() { match stmt { - Stmt::Expr(ast::StmtExpr { value, range: _ }) => visitor.visit_expr(value), - - Stmt::FunctionDef(ast::StmtFunctionDef { - parameters, - body, - decorator_list, - returns, - type_params, - .. - }) => { - for decorator in decorator_list { - visitor.visit_decorator(decorator); - } - - if let Some(type_params) = type_params { - visitor.visit_type_params(type_params); - } - - visitor.visit_parameters(parameters); - - for expr in returns { - visitor.visit_annotation(expr); - } - - visitor.visit_body(body); - } - - Stmt::ClassDef(ast::StmtClassDef { - arguments, - body, - decorator_list, - type_params, - .. - }) => { - for decorator in decorator_list { - visitor.visit_decorator(decorator); - } - - if let Some(type_params) = type_params { - visitor.visit_type_params(type_params); - } - - if let Some(arguments) = arguments { - visitor.visit_arguments(arguments); - } - - visitor.visit_body(body); - } - - Stmt::Return(ast::StmtReturn { value, range: _ }) => { - if let Some(expr) = value { - visitor.visit_expr(expr); - } - } - - Stmt::Delete(ast::StmtDelete { targets, range: _ }) => { - for expr in targets { - visitor.visit_expr(expr); - } - } - - Stmt::TypeAlias(ast::StmtTypeAlias { - range: _, - name, - type_params, - value, - }) => { - visitor.visit_expr(name); - if let Some(type_params) = type_params { - visitor.visit_type_params(type_params); - } - visitor.visit_expr(value); - } - - Stmt::Assign(ast::StmtAssign { - targets, - value, - range: _, - }) => { - for expr in targets { - visitor.visit_expr(expr); - } - - visitor.visit_expr(value); - } - - Stmt::AugAssign(ast::StmtAugAssign { - target, - op, - value, - range: _, - }) => { - visitor.visit_expr(target); - visitor.visit_operator(op); - visitor.visit_expr(value); - } - - Stmt::AnnAssign(ast::StmtAnnAssign { - target, - annotation, - value, - range: _, - simple: _, - }) => { - visitor.visit_expr(target); - visitor.visit_annotation(annotation); - if let Some(expr) = value { - visitor.visit_expr(expr); - } - } - - Stmt::For(ast::StmtFor { - target, - iter, - body, - orelse, - .. - }) => { - visitor.visit_expr(target); - visitor.visit_expr(iter); - visitor.visit_body(body); - visitor.visit_body(orelse); - } - - Stmt::While(ast::StmtWhile { - test, - body, - orelse, - range: _, - }) => { - visitor.visit_expr(test); - visitor.visit_body(body); - visitor.visit_body(orelse); - } - - Stmt::If(ast::StmtIf { - test, - body, - elif_else_clauses, - range: _, - }) => { - visitor.visit_expr(test); - visitor.visit_body(body); - for clause in elif_else_clauses { - visitor.visit_elif_else_clause(clause); - } - } - - Stmt::With(ast::StmtWith { - items, - body, - is_async: _, - range: _, - }) => { - for with_item in items { - visitor.visit_with_item(with_item); - } - visitor.visit_body(body); - } - - Stmt::Match(ast::StmtMatch { - subject, - cases, - range: _, - }) => { - visitor.visit_expr(subject); - for match_case in cases { - visitor.visit_match_case(match_case); - } - } - - Stmt::Raise(ast::StmtRaise { - exc, - cause, - range: _, - }) => { - if let Some(expr) = exc { - visitor.visit_expr(expr); - }; - if let Some(expr) = cause { - visitor.visit_expr(expr); - }; - } - - Stmt::Try(ast::StmtTry { - body, - handlers, - orelse, - finalbody, - range: _, - }) - | Stmt::TryStar(ast::StmtTryStar { - body, - handlers, - orelse, - finalbody, - range: _, - }) => { - visitor.visit_body(body); - for except_handler in handlers { - visitor.visit_except_handler(except_handler); - } - visitor.visit_body(orelse); - visitor.visit_body(finalbody); - } - - Stmt::Assert(ast::StmtAssert { - test, - msg, - range: _, - }) => { - visitor.visit_expr(test); - if let Some(expr) = msg { - visitor.visit_expr(expr); - } - } - - Stmt::Import(ast::StmtImport { names, range: _ }) => { - for alias in names { - visitor.visit_alias(alias); - } - } - - Stmt::ImportFrom(ast::StmtImportFrom { - range: _, - module: _, - names, - level: _, - }) => { - for alias in names { - visitor.visit_alias(alias); - } - } - - Stmt::Pass(_) - | Stmt::Break(_) - | Stmt::Continue(_) - | Stmt::Global(_) - | Stmt::Nonlocal(_) - | Stmt::IpyEscapeCommand(_) => {} + Stmt::Expr(stmt) => stmt.visit_preorder(visitor), + Stmt::FunctionDef(stmt) => stmt.visit_preorder(visitor), + Stmt::ClassDef(stmt) => stmt.visit_preorder(visitor), + Stmt::Return(stmt) => stmt.visit_preorder(visitor), + Stmt::Delete(stmt) => stmt.visit_preorder(visitor), + Stmt::TypeAlias(stmt) => stmt.visit_preorder(visitor), + Stmt::Assign(stmt) => stmt.visit_preorder(visitor), + Stmt::AugAssign(stmt) => stmt.visit_preorder(visitor), + Stmt::AnnAssign(stmt) => stmt.visit_preorder(visitor), + Stmt::For(stmt) => stmt.visit_preorder(visitor), + Stmt::While(stmt) => stmt.visit_preorder(visitor), + Stmt::If(stmt) => stmt.visit_preorder(visitor), + Stmt::With(stmt) => stmt.visit_preorder(visitor), + Stmt::Match(stmt) => stmt.visit_preorder(visitor), + Stmt::Raise(stmt) => stmt.visit_preorder(visitor), + Stmt::Try(stmt) => stmt.visit_preorder(visitor), + Stmt::TryStar(stmt) => stmt.visit_preorder(visitor), + Stmt::Assert(stmt) => stmt.visit_preorder(visitor), + Stmt::Import(stmt) => stmt.visit_preorder(visitor), + Stmt::ImportFrom(stmt) => stmt.visit_preorder(visitor), + Stmt::Pass(stmt) => stmt.visit_preorder(visitor), + Stmt::Break(stmt) => stmt.visit_preorder(visitor), + Stmt::Continue(stmt) => stmt.visit_preorder(visitor), + Stmt::Global(stmt) => stmt.visit_preorder(visitor), + Stmt::Nonlocal(stmt) => stmt.visit_preorder(visitor), + Stmt::IpyEscapeCommand(stmt) => stmt.visit_preorder(visitor), } } @@ -452,7 +235,7 @@ where { let node = AnyNodeRef::from(decorator); if visitor.enter_node(node).is_traverse() { - visitor.visit_expr(&decorator.expression); + decorator.visit_preorder(visitor); } visitor.leave_node(node); @@ -465,261 +248,34 @@ where let node = AnyNodeRef::from(expr); if visitor.enter_node(node).is_traverse() { match expr { - Expr::BoolOp(ast::ExprBoolOp { - op, - values, - range: _, - }) => match values.as_slice() { - [left, rest @ ..] => { - visitor.visit_expr(left); - visitor.visit_bool_op(op); - for expr in rest { - visitor.visit_expr(expr); - } - } - [] => { - visitor.visit_bool_op(op); - } - }, - - Expr::NamedExpr(ast::ExprNamedExpr { - target, - value, - range: _, - }) => { - visitor.visit_expr(target); - visitor.visit_expr(value); - } - - Expr::BinOp(ast::ExprBinOp { - left, - op, - right, - range: _, - }) => { - visitor.visit_expr(left); - visitor.visit_operator(op); - visitor.visit_expr(right); - } - - Expr::UnaryOp(ast::ExprUnaryOp { - op, - operand, - range: _, - }) => { - visitor.visit_unary_op(op); - visitor.visit_expr(operand); - } - - Expr::Lambda(ast::ExprLambda { - parameters, - body, - range: _, - }) => { - visitor.visit_parameters(parameters); - visitor.visit_expr(body); - } - - Expr::IfExp(ast::ExprIfExp { - test, - body, - orelse, - range: _, - }) => { - // `body if test else orelse` - visitor.visit_expr(body); - visitor.visit_expr(test); - visitor.visit_expr(orelse); - } - - Expr::Dict(ast::ExprDict { - keys, - values, - range: _, - }) => { - for (key, value) in keys.iter().zip(values) { - if let Some(key) = key { - visitor.visit_expr(key); - } - visitor.visit_expr(value); - } - } - - Expr::Set(ast::ExprSet { elts, range: _ }) => { - for expr in elts { - visitor.visit_expr(expr); - } - } - - Expr::ListComp(ast::ExprListComp { - elt, - generators, - range: _, - }) => { - visitor.visit_expr(elt); - for comprehension in generators { - visitor.visit_comprehension(comprehension); - } - } - - Expr::SetComp(ast::ExprSetComp { - elt, - generators, - range: _, - }) => { - visitor.visit_expr(elt); - for comprehension in generators { - visitor.visit_comprehension(comprehension); - } - } - - Expr::DictComp(ast::ExprDictComp { - key, - value, - generators, - range: _, - }) => { - visitor.visit_expr(key); - visitor.visit_expr(value); - - for comprehension in generators { - visitor.visit_comprehension(comprehension); - } - } - - Expr::GeneratorExp(ast::ExprGeneratorExp { - elt, - generators, - range: _, - }) => { - visitor.visit_expr(elt); - for comprehension in generators { - visitor.visit_comprehension(comprehension); - } - } - - Expr::Await(ast::ExprAwait { value, range: _ }) - | Expr::YieldFrom(ast::ExprYieldFrom { value, range: _ }) => visitor.visit_expr(value), - - Expr::Yield(ast::ExprYield { value, range: _ }) => { - if let Some(expr) = value { - visitor.visit_expr(expr); - } - } - - Expr::Compare(ast::ExprCompare { - left, - ops, - comparators, - range: _, - }) => { - visitor.visit_expr(left); - - for (op, comparator) in ops.iter().zip(comparators) { - visitor.visit_cmp_op(op); - visitor.visit_expr(comparator); - } - } - - Expr::Call(ast::ExprCall { - func, - arguments, - range: _, - }) => { - visitor.visit_expr(func); - visitor.visit_arguments(arguments); - } - - Expr::FormattedValue(ast::ExprFormattedValue { - value, format_spec, .. - }) => { - visitor.visit_expr(value); - - if let Some(expr) = format_spec { - visitor.visit_format_spec(expr); - } - } - - Expr::FString(ast::ExprFString { values, range: _ }) => { - for expr in values { - visitor.visit_expr(expr); - } - } - - Expr::Constant(ast::ExprConstant { - value, - range: _, - kind: _, - }) => visitor.visit_constant(value), - - Expr::Attribute(ast::ExprAttribute { - value, - attr: _, - ctx: _, - range: _, - }) => { - visitor.visit_expr(value); - } - - Expr::Subscript(ast::ExprSubscript { - value, - slice, - ctx: _, - range: _, - }) => { - visitor.visit_expr(value); - visitor.visit_expr(slice); - } - Expr::Starred(ast::ExprStarred { - value, - ctx: _, - range: _, - }) => { - visitor.visit_expr(value); - } - - Expr::Name(ast::ExprName { - id: _, - ctx: _, - range: _, - }) => {} - - Expr::List(ast::ExprList { - elts, - ctx: _, - range: _, - }) => { - for expr in elts { - visitor.visit_expr(expr); - } - } - Expr::Tuple(ast::ExprTuple { - elts, - ctx: _, - range: _, - }) => { - for expr in elts { - visitor.visit_expr(expr); - } - } - - Expr::Slice(ast::ExprSlice { - lower, - upper, - step, - range: _, - }) => { - if let Some(expr) = lower { - visitor.visit_expr(expr); - } - if let Some(expr) = upper { - visitor.visit_expr(expr); - } - if let Some(expr) = step { - visitor.visit_expr(expr); - } - } - Expr::IpyEscapeCommand(_) => (), + Expr::BoolOp(expr) => expr.visit_preorder(visitor), + Expr::NamedExpr(expr) => expr.visit_preorder(visitor), + Expr::BinOp(expr) => expr.visit_preorder(visitor), + Expr::UnaryOp(expr) => expr.visit_preorder(visitor), + Expr::Lambda(expr) => expr.visit_preorder(visitor), + Expr::IfExp(expr) => expr.visit_preorder(visitor), + Expr::Dict(expr) => expr.visit_preorder(visitor), + Expr::Set(expr) => expr.visit_preorder(visitor), + Expr::ListComp(expr) => expr.visit_preorder(visitor), + Expr::SetComp(expr) => expr.visit_preorder(visitor), + Expr::DictComp(expr) => expr.visit_preorder(visitor), + Expr::GeneratorExp(expr) => expr.visit_preorder(visitor), + Expr::Await(expr) => expr.visit_preorder(visitor), + Expr::Yield(expr) => expr.visit_preorder(visitor), + Expr::YieldFrom(expr) => expr.visit_preorder(visitor), + Expr::Compare(expr) => expr.visit_preorder(visitor), + Expr::Call(expr) => expr.visit_preorder(visitor), + Expr::FormattedValue(expr) => expr.visit_preorder(visitor), + Expr::FString(expr) => expr.visit_preorder(visitor), + Expr::Constant(expr) => expr.visit_preorder(visitor), + Expr::Attribute(expr) => expr.visit_preorder(visitor), + Expr::Subscript(expr) => expr.visit_preorder(visitor), + Expr::Starred(expr) => expr.visit_preorder(visitor), + Expr::Name(expr) => expr.visit_preorder(visitor), + Expr::List(expr) => expr.visit_preorder(visitor), + Expr::Tuple(expr) => expr.visit_preorder(visitor), + Expr::Slice(expr) => expr.visit_preorder(visitor), + Expr::IpyEscapeCommand(expr) => expr.visit_preorder(visitor), } } @@ -732,12 +288,7 @@ where { let node = AnyNodeRef::from(comprehension); if visitor.enter_node(node).is_traverse() { - visitor.visit_expr(&comprehension.target); - visitor.visit_expr(&comprehension.iter); - - for expr in &comprehension.ifs { - visitor.visit_expr(expr); - } + comprehension.visit_preorder(visitor); } visitor.leave_node(node); @@ -749,10 +300,7 @@ where { let node = AnyNodeRef::from(elif_else_clause); if visitor.enter_node(node).is_traverse() { - if let Some(test) = &elif_else_clause.test { - visitor.visit_expr(test); - } - visitor.visit_body(&elif_else_clause.body); + elif_else_clause.visit_preorder(visitor); } visitor.leave_node(node); @@ -765,17 +313,7 @@ where let node = AnyNodeRef::from(except_handler); if visitor.enter_node(node).is_traverse() { match except_handler { - ExceptHandler::ExceptHandler(ast::ExceptHandlerExceptHandler { - range: _, - type_, - name: _, - body, - }) => { - if let Some(expr) = type_ { - visitor.visit_expr(expr); - } - visitor.visit_body(body); - } + ExceptHandler::ExceptHandler(except_handler) => except_handler.visit_preorder(visitor), } } visitor.leave_node(node); @@ -799,13 +337,7 @@ where { let node = AnyNodeRef::from(arguments); if visitor.enter_node(node).is_traverse() { - for arg in &arguments.args { - visitor.visit_expr(arg); - } - - for keyword in &arguments.keywords { - visitor.visit_keyword(keyword); - } + arguments.visit_preorder(visitor); } visitor.leave_node(node); @@ -817,21 +349,7 @@ where { let node = AnyNodeRef::from(parameters); if visitor.enter_node(node).is_traverse() { - for arg in parameters.posonlyargs.iter().chain(¶meters.args) { - visitor.visit_parameter_with_default(arg); - } - - if let Some(arg) = ¶meters.vararg { - visitor.visit_parameter(arg); - } - - for arg in ¶meters.kwonlyargs { - visitor.visit_parameter_with_default(arg); - } - - if let Some(arg) = ¶meters.kwarg { - visitor.visit_parameter(arg); - } + parameters.visit_preorder(visitor); } visitor.leave_node(node); @@ -844,9 +362,7 @@ where let node = AnyNodeRef::from(parameter); if visitor.enter_node(node).is_traverse() { - if let Some(expr) = ¶meter.annotation { - visitor.visit_annotation(expr); - } + parameter.visit_preorder(visitor); } visitor.leave_node(node); } @@ -859,10 +375,7 @@ pub fn walk_parameter_with_default<'a, V>( { let node = AnyNodeRef::from(parameter_with_default); if visitor.enter_node(node).is_traverse() { - visitor.visit_parameter(¶meter_with_default.parameter); - if let Some(expr) = ¶meter_with_default.default { - visitor.visit_expr(expr); - } + parameter_with_default.visit_preorder(visitor); } visitor.leave_node(node); @@ -876,7 +389,7 @@ where let node = AnyNodeRef::from(keyword); if visitor.enter_node(node).is_traverse() { - visitor.visit_expr(&keyword.value); + keyword.visit_preorder(visitor); } visitor.leave_node(node); } @@ -887,11 +400,7 @@ where { let node = AnyNodeRef::from(with_item); if visitor.enter_node(node).is_traverse() { - visitor.visit_expr(&with_item.context_expr); - - if let Some(expr) = &with_item.optional_vars { - visitor.visit_expr(expr); - } + with_item.visit_preorder(visitor); } visitor.leave_node(node); } @@ -902,9 +411,7 @@ where { let node = AnyNodeRef::from(type_params); if visitor.enter_node(node).is_traverse() { - for type_param in &type_params.type_params { - visitor.visit_type_param(type_param); - } + type_params.visit_preorder(visitor); } visitor.leave_node(node); } @@ -916,16 +423,9 @@ where let node = AnyNodeRef::from(type_param); if visitor.enter_node(node).is_traverse() { match type_param { - TypeParam::TypeVar(TypeParamTypeVar { - bound, - name: _, - range: _, - }) => { - if let Some(expr) = bound { - visitor.visit_expr(expr); - } - } - TypeParam::TypeVarTuple(_) | TypeParam::ParamSpec(_) => {} + TypeParam::TypeVar(type_param) => type_param.visit_preorder(visitor), + TypeParam::TypeVarTuple(type_param) => type_param.visit_preorder(visitor), + TypeParam::ParamSpec(type_param) => type_param.visit_preorder(visitor), } } visitor.leave_node(node); @@ -937,11 +437,7 @@ where { let node = AnyNodeRef::from(match_case); if visitor.enter_node(node).is_traverse() { - visitor.visit_pattern(&match_case.pattern); - if let Some(expr) = &match_case.guard { - visitor.visit_expr(expr); - } - visitor.visit_body(&match_case.body); + match_case.visit_preorder(visitor); } visitor.leave_node(node); } @@ -953,66 +449,14 @@ where let node = AnyNodeRef::from(pattern); if visitor.enter_node(node).is_traverse() { match pattern { - Pattern::MatchValue(ast::PatternMatchValue { value, range: _ }) => { - visitor.visit_expr(value); - } - - Pattern::MatchSingleton(ast::PatternMatchSingleton { value, range: _ }) => { - visitor.visit_constant(value); - } - - Pattern::MatchSequence(ast::PatternMatchSequence { patterns, range: _ }) => { - for pattern in patterns { - visitor.visit_pattern(pattern); - } - } - - Pattern::MatchMapping(ast::PatternMatchMapping { - keys, - patterns, - range: _, - rest: _, - }) => { - for (key, pattern) in keys.iter().zip(patterns) { - visitor.visit_expr(key); - visitor.visit_pattern(pattern); - } - } - - Pattern::MatchClass(ast::PatternMatchClass { - cls, - patterns, - kwd_attrs: _, - kwd_patterns, - range: _, - }) => { - visitor.visit_expr(cls); - for pattern in patterns { - visitor.visit_pattern(pattern); - } - - for pattern in kwd_patterns { - visitor.visit_pattern(pattern); - } - } - - Pattern::MatchStar(_) => {} - - Pattern::MatchAs(ast::PatternMatchAs { - pattern, - range: _, - name: _, - }) => { - if let Some(pattern) = pattern { - visitor.visit_pattern(pattern); - } - } - - Pattern::MatchOr(ast::PatternMatchOr { patterns, range: _ }) => { - for pattern in patterns { - visitor.visit_pattern(pattern); - } - } + Pattern::MatchValue(pattern) => pattern.visit_preorder(visitor), + Pattern::MatchSingleton(pattern) => pattern.visit_preorder(visitor), + Pattern::MatchSequence(pattern) => pattern.visit_preorder(visitor), + Pattern::MatchMapping(pattern) => pattern.visit_preorder(visitor), + Pattern::MatchClass(pattern) => pattern.visit_preorder(visitor), + Pattern::MatchStar(pattern) => pattern.visit_preorder(visitor), + Pattern::MatchAs(pattern) => pattern.visit_preorder(visitor), + Pattern::MatchOr(pattern) => pattern.visit_preorder(visitor), } } visitor.leave_node(node); @@ -1051,6 +495,8 @@ where V: PreorderVisitor<'a> + ?Sized, { let node = AnyNodeRef::from(alias); - visitor.enter_node(node); + if visitor.enter_node(node).is_traverse() { + alias.visit_preorder(visitor); + } visitor.leave_node(node); } From e2f7862404e1741a0c65fa716818e59282de161a Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Thu, 10 Aug 2023 09:11:25 +0200 Subject: [PATCH 059/155] Preserve dangling f-string comments ## Summary This PR fixes the issue where the FString formatting dropped dangling comments between the string parts. ```python result_f = ( f' File "{__file__}", line {lineno_f+1}, in f\n' ' f()\n' # XXX: The following line changes depending on whether the tests # are run through the interactive interpreter or with -m # It also varies depending on the platform (stack size) # Fortunately, we don't care about exactness here, so we use regex r' \[Previous line repeated (\d+) more times\]' '\n' 'RecursionError: maximum recursion depth exceeded\n' ) ``` The solution here isn't ideal because it re-introduces the `enclosing_parent` on `DecoratedComment` but it is the easiest fix that I could come up. I didn't spend more time finding another solution becaues I think we have to re-write most of the fstring formatting with the upcoming Python 3.12 support (because lexing the individual parts as we do now will no longer work). closes #6440 ## Test Plan `cargo test` The child PR testing that all comments are formatted should now pass --- .../test/fixtures/ruff/expression/fstring.py | 26 ++++++++ .../fixtures/ruff/expression/joined_string.py | 7 -- .../src/comments/placement.rs | 7 ++ .../src/comments/visitor.rs | 8 +++ .../format@expression__fstring.py.snap | 64 +++++++++++++++++++ .../format@expression__joined_string.py.snap | 25 -------- 6 files changed, 105 insertions(+), 32 deletions(-) create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py delete mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/joined_string.py create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap delete mode 100644 crates/ruff_python_formatter/tests/snapshots/format@expression__joined_string.py.snap diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py new file mode 100644 index 0000000000..2769203823 --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py @@ -0,0 +1,26 @@ +( + f'{one}' + f'{two}' +) + + +rf"Not-so-tricky \"quote" + +# Regression test for fstrings dropping comments +result_f = ( + 'Traceback (most recent call last):\n' + f' File "{__file__}", line {lineno_f+5}, in _check_recursive_traceback_display\n' + ' f()\n' + f' File "{__file__}", line {lineno_f+1}, in f\n' + ' f()\n' + f' File "{__file__}", line {lineno_f+1}, in f\n' + ' f()\n' + f' File "{__file__}", line {lineno_f+1}, in f\n' + ' f()\n' + # XXX: The following line changes depending on whether the tests + # are run through the interactive interpreter or with -m + # It also varies depending on the platform (stack size) + # Fortunately, we don't care about exactness here, so we use regex + r' \[Previous line repeated (\d+) more times\]' '\n' + 'RecursionError: maximum recursion depth exceeded\n' +) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/joined_string.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/joined_string.py deleted file mode 100644 index 8b6af32d0b..0000000000 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/joined_string.py +++ /dev/null @@ -1,7 +0,0 @@ -( - f'{one}' - f'{two}' -) - - -rf"Not-so-tricky \"quote" diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 686415efc9..855930ba7c 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -73,6 +73,13 @@ pub(super) fn place_comment<'a>( handle_leading_class_with_decorators_comment(comment, class_def) } AnyNodeRef::StmtImportFrom(import_from) => handle_import_from_comment(comment, import_from), + AnyNodeRef::ExprConstant(_) => { + if let Some(AnyNodeRef::ExprFString(fstring)) = comment.enclosing_parent() { + CommentPlacement::dangling(fstring, comment) + } else { + CommentPlacement::Default(comment) + } + } AnyNodeRef::ExprList(_) | AnyNodeRef::ExprSet(_) | AnyNodeRef::ExprGeneratorExp(_) diff --git a/crates/ruff_python_formatter/src/comments/visitor.rs b/crates/ruff_python_formatter/src/comments/visitor.rs index a70b62d0fd..f779820a35 100644 --- a/crates/ruff_python_formatter/src/comments/visitor.rs +++ b/crates/ruff_python_formatter/src/comments/visitor.rs @@ -77,6 +77,7 @@ impl<'ast> PreorderVisitor<'ast> for CommentsVisitor<'ast> { enclosing: enclosing_node, preceding: self.preceding_node, following: Some(node), + parent: self.parents.iter().rev().nth(1).copied(), line_position: text_position(*comment_range, self.source_code), slice: self.source_code.slice(*comment_range), }; @@ -117,6 +118,7 @@ impl<'ast> PreorderVisitor<'ast> for CommentsVisitor<'ast> { let comment = DecoratedComment { enclosing: node, + parent: self.parents.last().copied(), preceding: self.preceding_node, following: None, line_position: text_position(*comment_range, self.source_code), @@ -179,6 +181,7 @@ pub(super) struct DecoratedComment<'a> { enclosing: AnyNodeRef<'a>, preceding: Option>, following: Option>, + parent: Option>, line_position: CommentLinePosition, slice: SourceCodeSlice, } @@ -204,6 +207,11 @@ impl<'a> DecoratedComment<'a> { self.enclosing } + /// Returns the parent of the enclosing node, if any + pub(super) fn enclosing_parent(&self) -> Option> { + self.parent + } + /// Returns the slice into the source code. pub(super) fn slice(&self) -> &SourceCodeSlice { &self.slice diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap new file mode 100644 index 0000000000..90a4b1e396 --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap @@ -0,0 +1,64 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py +--- +## Input +```py +( + f'{one}' + f'{two}' +) + + +rf"Not-so-tricky \"quote" + +# Regression test for fstrings dropping comments +result_f = ( + 'Traceback (most recent call last):\n' + f' File "{__file__}", line {lineno_f+5}, in _check_recursive_traceback_display\n' + ' f()\n' + f' File "{__file__}", line {lineno_f+1}, in f\n' + ' f()\n' + f' File "{__file__}", line {lineno_f+1}, in f\n' + ' f()\n' + f' File "{__file__}", line {lineno_f+1}, in f\n' + ' f()\n' + # XXX: The following line changes depending on whether the tests + # are run through the interactive interpreter or with -m + # It also varies depending on the platform (stack size) + # Fortunately, we don't care about exactness here, so we use regex + r' \[Previous line repeated (\d+) more times\]' '\n' + 'RecursionError: maximum recursion depth exceeded\n' +) +``` + +## Output +```py +(f"{one}" f"{two}") + + +rf'Not-so-tricky "quote' + +# Regression test for fstrings dropping comments +result_f = ( + "Traceback (most recent call last):\n" + f' File "{__file__}", line {lineno_f+5}, in _check_recursive_traceback_display\n' + " f()\n" + f' File "{__file__}", line {lineno_f+1}, in f\n' + " f()\n" + f' File "{__file__}", line {lineno_f+1}, in f\n' + " f()\n" + f' File "{__file__}", line {lineno_f+1}, in f\n' + " f()\n" + # XXX: The following line changes depending on whether the tests + # are run through the interactive interpreter or with -m + # It also varies depending on the platform (stack size) + # Fortunately, we don't care about exactness here, so we use regex + r" \[Previous line repeated (\d+) more times\]" + "\n" + "RecursionError: maximum recursion depth exceeded\n" +) +``` + + + diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__joined_string.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__joined_string.py.snap deleted file mode 100644 index d9f8f4313d..0000000000 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__joined_string.py.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/ruff_python_formatter/tests/fixtures.rs -input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/joined_string.py ---- -## Input -```py -( - f'{one}' - f'{two}' -) - - -rf"Not-so-tricky \"quote" -``` - -## Output -```py -(f"{one}" f"{two}") - - -rf'Not-so-tricky "quote' -``` - - - From 39beeb61f75938ce0ddcc40eec0dd468f6a2a1c1 Mon Sep 17 00:00:00 2001 From: konsti Date: Thu, 10 Aug 2023 09:19:27 +0200 Subject: [PATCH 060/155] Track formatting all comments We currently don't format all comments as match statements are not yet implemented. We can work around this for the top level match statement by setting them manually formatted but the mocked-out top level match doesn't call into its children so they would still have unformatted comments --- .../ruff_python_formatter/src/comments/mod.rs | 31 +++++++++ .../src/expression/expr_formatted_value.rs | 8 +-- crates/ruff_python_formatter/src/lib.rs | 63 +++++++++++++------ .../src/other/match_case.rs | 14 ++++- 4 files changed, 91 insertions(+), 25 deletions(-) diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs index 141a7e2c3e..ae855c82b6 100644 --- a/crates/ruff_python_formatter/src/comments/mod.rs +++ b/crates/ruff_python_formatter/src/comments/mod.rs @@ -101,6 +101,7 @@ pub(crate) use format::{ }; use ruff_formatter::{SourceCode, SourceCodeSlice}; use ruff_python_ast::node::AnyNodeRef; +use ruff_python_ast::visitor::preorder::{PreorderVisitor, TraversalSignal}; use ruff_python_index::CommentRanges; use crate::comments::debug::{DebugComment, DebugComments}; @@ -401,6 +402,24 @@ impl<'a> Comments<'a> { ); } + #[inline(always)] + #[cfg(not(debug_assertions))] + pub(crate) fn mark_verbatim_node_comments_formatted(&self, node: AnyNodeRef) {} + + /// Marks the comments of a node printed in verbatim (suppressed) as formatted. + /// + /// Marks the dangling comments and the comments of all descendants as formatted. + /// The leading and trailing comments are not marked as formatted because they are formatted + /// normally if `node` is the first or last node of a suppression range. + #[cfg(debug_assertions)] + pub(crate) fn mark_verbatim_node_comments_formatted(&self, node: AnyNodeRef) { + for dangling in self.dangling_comments(node) { + dangling.mark_formatted(); + } + + node.visit_preorder(&mut MarkVerbatimCommentsAsFormattedVisitor(self)); + } + /// Returns an object that implements [Debug] for nicely printing the [`Comments`]. pub(crate) fn debug(&'a self, source_code: SourceCode<'a>) -> DebugComments<'a> { DebugComments::new(&self.data.comments, source_code) @@ -412,6 +431,18 @@ struct CommentsData<'a> { comments: CommentsMap<'a>, } +struct MarkVerbatimCommentsAsFormattedVisitor<'a>(&'a Comments<'a>); + +impl<'a> PreorderVisitor<'a> for MarkVerbatimCommentsAsFormattedVisitor<'a> { + fn enter_node(&mut self, node: AnyNodeRef<'a>) -> TraversalSignal { + for comment in self.0.leading_dangling_trailing_comments(node) { + comment.mark_formatted(); + } + + TraversalSignal::Traverse + } +} + #[cfg(test)] mod tests { use insta::assert_debug_snapshot; diff --git a/crates/ruff_python_formatter/src/expression/expr_formatted_value.rs b/crates/ruff_python_formatter/src/expression/expr_formatted_value.rs index 34b7fb1f65..12c1a8e0e5 100644 --- a/crates/ruff_python_formatter/src/expression/expr_formatted_value.rs +++ b/crates/ruff_python_formatter/src/expression/expr_formatted_value.rs @@ -1,7 +1,7 @@ use crate::context::PyFormatContext; use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses}; -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; -use ruff_formatter::{write, Buffer, FormatResult}; +use crate::{FormatNodeRule, PyFormatter}; +use ruff_formatter::FormatResult; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprFormattedValue; @@ -9,8 +9,8 @@ use ruff_python_ast::ExprFormattedValue; pub struct FormatExprFormattedValue; impl FormatNodeRule for FormatExprFormattedValue { - fn fmt_fields(&self, item: &ExprFormattedValue, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + fn fmt_fields(&self, _item: &ExprFormattedValue, _f: &mut PyFormatter) -> FormatResult<()> { + unreachable!("Handled inside of `FormatExprFString"); } } diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs index 0ade2fad54..5e3213ae95 100644 --- a/crates/ruff_python_formatter/src/lib.rs +++ b/crates/ruff_python_formatter/src/lib.rs @@ -12,7 +12,7 @@ use ruff_formatter::{ PrintError, }; use ruff_formatter::{Formatted, Printed, SourceCode}; -use ruff_python_ast::node::{AnyNodeRef, AstNode, NodeKind}; +use ruff_python_ast::node::{AnyNodeRef, AstNode}; use ruff_python_ast::{Mod, Ranged}; use ruff_python_index::{CommentRanges, CommentRangesBuilder}; use ruff_python_parser::lexer::{lex, LexicalError}; @@ -150,25 +150,30 @@ pub fn format_node<'a>( let locator = Locator::new(source); - format!( + let formatted = format!( PyFormatContext::new(options, locator.contents(), comments), [root.format()] - ) + )?; + formatted + .context() + .comments() + .assert_formatted_all_comments(SourceCode::new(source)); + Ok(formatted) } -pub(crate) struct NotYetImplemented(NodeKind); +pub(crate) struct NotYetImplemented<'a>(AnyNodeRef<'a>); /// Formats a placeholder for nodes that have not yet been implemented -pub(crate) fn not_yet_implemented<'a, T>(node: T) -> NotYetImplemented +pub(crate) fn not_yet_implemented<'a, T>(node: T) -> NotYetImplemented<'a> where T: Into>, { - NotYetImplemented(node.into().kind()) + NotYetImplemented(node.into()) } -impl Format> for NotYetImplemented { +impl Format> for NotYetImplemented<'_> { fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { - let text = std::format!("NOT_YET_IMPLEMENTED_{:?}", self.0); + let text = std::format!("NOT_YET_IMPLEMENTED_{:?}", self.0.kind()); f.write_element(FormatElement::Tag(Tag::StartVerbatim( tag::VerbatimKind::Verbatim { @@ -181,31 +186,51 @@ impl Format> for NotYetImplemented { })?; f.write_element(FormatElement::Tag(Tag::EndVerbatim))?; + + f.context() + .comments() + .mark_verbatim_node_comments_formatted(self.0); + Ok(()) } } -pub(crate) struct NotYetImplementedCustomText(&'static str); - -/// Formats a placeholder for nodes that have not yet been implemented -#[allow(dead_code)] -pub(crate) const fn not_yet_implemented_custom_text( +pub(crate) struct NotYetImplementedCustomText<'a> { text: &'static str, -) -> NotYetImplementedCustomText { - NotYetImplementedCustomText(text) + node: AnyNodeRef<'a>, } -impl Format> for NotYetImplementedCustomText { +/// Formats a placeholder for nodes that have not yet been implemented +pub(crate) fn not_yet_implemented_custom_text<'a, T>( + text: &'static str, + node: T, +) -> NotYetImplementedCustomText<'a> +where + T: Into>, +{ + NotYetImplementedCustomText { + text, + node: node.into(), + } +} + +impl Format> for NotYetImplementedCustomText<'_> { fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { f.write_element(FormatElement::Tag(Tag::StartVerbatim( tag::VerbatimKind::Verbatim { - length: self.0.text_len(), + length: self.text.text_len(), }, )))?; - text(self.0).fmt(f)?; + text(self.text).fmt(f)?; - f.write_element(FormatElement::Tag(Tag::EndVerbatim)) + f.write_element(FormatElement::Tag(Tag::EndVerbatim))?; + + f.context() + .comments() + .mark_verbatim_node_comments_formatted(self.node); + + Ok(()) } } diff --git a/crates/ruff_python_formatter/src/other/match_case.rs b/crates/ruff_python_formatter/src/other/match_case.rs index 0bbe0572bc..f2dc80f93a 100644 --- a/crates/ruff_python_formatter/src/other/match_case.rs +++ b/crates/ruff_python_formatter/src/other/match_case.rs @@ -14,7 +14,7 @@ impl FormatNodeRule for FormatMatchCase { fn fmt_fields(&self, item: &MatchCase, f: &mut PyFormatter) -> FormatResult<()> { let MatchCase { range: _, - pattern: _, + pattern, guard, body, } = item; @@ -24,7 +24,17 @@ impl FormatNodeRule for FormatMatchCase { [ text("case"), space(), - not_yet_implemented_custom_text("NOT_YET_IMPLEMENTED_Pattern"), + format_with(|f: &mut PyFormatter| { + let comments = f.context().comments(); + + for comment in comments.leading_trailing_comments(pattern) { + // This is a lie, but let's go with it. + comment.mark_formatted(); + } + + // Replace the whole `format_with` with `pattern.format()` once pattern formatting is implemented. + not_yet_implemented_custom_text("NOT_YET_IMPLEMENTED_Pattern", pattern).fmt(f) + }), ] )?; From 4811af0f0bc6e4a3511d3e43c7514e3add69eabd Mon Sep 17 00:00:00 2001 From: konsti Date: Thu, 10 Aug 2023 10:34:03 +0200 Subject: [PATCH 061/155] Formatter: Add test cases for comments after opening parentheses (#6420) **Summary** I collected all examples of end-of-line comments after opening parentheses that i could think of so we get a comprehensive view at the state of their formatting (#6390). This PR intentionally only adds tests cases without any changes in formatting. We need to decide which exact formatting we want, ideally in terms of these test files, and implement this in follow-up PRs. ~~One stability check is still deactivated pending https://github.com/astral-sh/ruff/pull/6386.~~ --- .../ruff/{ => parentheses}/call_chains.py | 0 .../test/fixtures/ruff/parentheses/nested.py | 53 ++++ .../opening_parentheses_comment_empty.py | 86 ++++++ .../opening_parentheses_comment_value.py | 108 +++++++ ...> format@parentheses__call_chains.py.snap} | 2 +- .../format@parentheses__nested.py.snap | 136 +++++++++ ..._opening_parentheses_comment_empty.py.snap | 192 +++++++++++++ ..._opening_parentheses_comment_value.py.snap | 266 ++++++++++++++++++ 8 files changed, 842 insertions(+), 1 deletion(-) rename crates/ruff_python_formatter/resources/test/fixtures/ruff/{ => parentheses}/call_chains.py (100%) create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/nested.py create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_empty.py create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py rename crates/ruff_python_formatter/tests/snapshots/{format@call_chains.py.snap => format@parentheses__call_chains.py.snap} (99%) create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/call_chains.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/call_chains.py similarity index 100% rename from crates/ruff_python_formatter/resources/test/fixtures/ruff/call_chains.py rename to crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/call_chains.py diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/nested.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/nested.py new file mode 100644 index 0000000000..dbe1a487e9 --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/nested.py @@ -0,0 +1,53 @@ +a1 = f( # 1 + g( # 2 + ) +) +a2 = f( # 1 + g( # 2 + x + ) +) +a3 = f( + ( + # + () + ) +) + + +call( + a, + b, + [ # Empty because of + ] +) + +a = a + b + c + d + ( # Hello + e + f + g +) + +a = int( # type: ignore + int( # type: ignore + int( # type: ignore + 6 + ) + ) +) + +# Stability and correctness checks +b1 = () - ( # +) +() - ( # +) +b2 = () - f( # +) +() - f( # +) +b3 = ( + # + () +) +( + # + () +) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_empty.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_empty.py new file mode 100644 index 0000000000..68c76585bb --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_empty.py @@ -0,0 +1,86 @@ +# Opening parentheses end-of-line comment without a value in the parentheses + +( # a 1 +) +a2 = ( # a 2 +) +a3 = f( # a 3 +) +a4 = ( # a 4 +) = a4 +a5: List( # a 5 +) = 5 + +raise ( # b 1a +) +raise b1b from ( # b 1b +) +raise ( # b 1c +) from b1c +del ( # b 2 +) +assert ( # b 3 +), ( #b 4 +) + +def g(): + """Statements that are only allowed in function bodies""" + return ( # c 1 + ) + yield ( # c 2 + ) +async def h(): + """Statements that are only allowed in async function bodies""" + await ( # c 3 + ) + +with ( # d 1 +): pass +match ( # d 2 +): + case d2: + pass +match d3: + case ( # d 3 + ): + pass +while ( # d 4 +): + pass +if ( # d 5 +): + pass +elif ( # d 6 +): + pass +for ( # d 7 +) in ( # d 8 +): + pass +try: + pass +except ( # d 9 +): + pass + + +def e1( # e 1 +): pass + + +def e2() -> ( # e 2 +): pass + + +class E3( # e 3 +): pass + + +f1 = [ # f 1 +] +[ # f 2 +] +f3 = { # f3 +} +{ # f 4 +} diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py new file mode 100644 index 0000000000..c0117cbbbe --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py @@ -0,0 +1,108 @@ +# Opening parentheses end-of-line comment with value in the parentheses + +( # a 1 +x) +a2 = ( # a 2 +x) +a3 = f( # a 3 +x) +a4 = ( # a 4 +x) = a4 +a5: List( # a 5 +x) = 5 + +raise ( # b 1a +x) +raise b1b from ( # b 1b +x) +raise ( # b 1c +x) from b1c +del ( # b 2 +x) +assert ( # b 3 +x), ( #b 4 +x) + +def g(): + """Statements that are only allowed in function bodies""" + return ( # c 1 + x) + yield ( # c 2 + x) +async def h(): + """Statements that are only allowed in async function bodies""" + await ( # c 3 + x) + +with ( # d 1 +x): pass +match ( # d 2 +x): + case d2: + pass +match d3: + case ( # d 3 + x): + pass +while ( # d 4 +x): + pass +if ( # d 5 +x): + pass +elif ( # d 6 +y): + pass +for ( # d 7 +x) in ( # d 8 +y): + pass +try: + pass +except ( # d 9 + x +): + pass + + +def e1( # e 1 +x): pass + + +def e2() -> ( # e 2 +x): pass + + +class E3( # e 3 +x): pass + + +f1 = [ # f 1 +x] +[ # f 2 +x] +f3 = { # f3 +x} +{ # f 4 +x} + + + +# Non-empty parentheses: These are not allowed without a value +def f1[ # f1 + T +](): pass +f2 = ( # f2 + i for i in range(10) +) +f3 = [ # f3 + i for i in range(10) +] +f4 = { # f4 + i for i in range(10) +} +f5 = { # f5 + i: i**2 for i in range(10) +} + + diff --git a/crates/ruff_python_formatter/tests/snapshots/format@call_chains.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__call_chains.py.snap similarity index 99% rename from crates/ruff_python_formatter/tests/snapshots/format@call_chains.py.snap rename to crates/ruff_python_formatter/tests/snapshots/format@parentheses__call_chains.py.snap index cca9b84a2f..f6b2f7d35c 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@call_chains.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__call_chains.py.snap @@ -1,6 +1,6 @@ --- source: crates/ruff_python_formatter/tests/fixtures.rs -input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/call_chains.py +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/call_chains.py --- ## Input ```py diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap new file mode 100644 index 0000000000..872ea15653 --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap @@ -0,0 +1,136 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/nested.py +--- +## Input +```py +a1 = f( # 1 + g( # 2 + ) +) +a2 = f( # 1 + g( # 2 + x + ) +) +a3 = f( + ( + # + () + ) +) + + +call( + a, + b, + [ # Empty because of + ] +) + +a = a + b + c + d + ( # Hello + e + f + g +) + +a = int( # type: ignore + int( # type: ignore + int( # type: ignore + 6 + ) + ) +) + +# Stability and correctness checks +b1 = () - ( # +) +() - ( # +) +b2 = () - f( # +) +() - f( # +) +b3 = ( + # + () +) +( + # + () +) +``` + +## Output +```py +a1 = f( # 1 + g( # 2 + ) +) +a2 = f( # 1 + g( # 2 + x + ) +) +a3 = f( + ( + # + () + ) +) + + +call( + a, + b, + [ # Empty because of + ], +) + +a = ( + a + + b + + c + + d # Hello + + (e + f + g) +) + +a = int( # type: ignore + int( # type: ignore + int( # type: ignore + 6 + ) + ) +) + +# Stability and correctness checks +b1 = ( + () + - ( # + ) +) +( + () + - ( # + ) +) +b2 = ( + () + - f( # + ) +) +( + () + - f( # + ) +) +b3 = ( + # + () +) +( + # + () +) +``` + + + diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap new file mode 100644 index 0000000000..c4e92285b8 --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap @@ -0,0 +1,192 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_empty.py +--- +## Input +```py +# Opening parentheses end-of-line comment without a value in the parentheses + +( # a 1 +) +a2 = ( # a 2 +) +a3 = f( # a 3 +) +a4 = ( # a 4 +) = a4 +a5: List( # a 5 +) = 5 + +raise ( # b 1a +) +raise b1b from ( # b 1b +) +raise ( # b 1c +) from b1c +del ( # b 2 +) +assert ( # b 3 +), ( #b 4 +) + +def g(): + """Statements that are only allowed in function bodies""" + return ( # c 1 + ) + yield ( # c 2 + ) +async def h(): + """Statements that are only allowed in async function bodies""" + await ( # c 3 + ) + +with ( # d 1 +): pass +match ( # d 2 +): + case d2: + pass +match d3: + case ( # d 3 + ): + pass +while ( # d 4 +): + pass +if ( # d 5 +): + pass +elif ( # d 6 +): + pass +for ( # d 7 +) in ( # d 8 +): + pass +try: + pass +except ( # d 9 +): + pass + + +def e1( # e 1 +): pass + + +def e2() -> ( # e 2 +): pass + + +class E3( # e 3 +): pass + + +f1 = [ # f 1 +] +[ # f 2 +] +f3 = { # f3 +} +{ # f 4 +} +``` + +## Output +```py +# Opening parentheses end-of-line comment without a value in the parentheses + +( # a 1 +) +a2 = ( # a 2 +) +a3 = f( # a 3 +) +a4 = ( # a 4 +) = a4 +a5: List( # a 5 +) = 5 + +raise ( # b 1a +) +raise b1b from ( # b 1b +) +raise ( # b 1c +) from b1c +del ( # b 2 +) +assert ( # b 3 +), ( # b 4 +) + + +def g(): + """Statements that are only allowed in function bodies""" + return ( # c 1 + ) + yield ( # c 2 + ) + + +async def h(): + """Statements that are only allowed in async function bodies""" + await ( # c 3 + ) + + +with ( # d 1 +): + pass +match ( # d 2 +): + case NOT_YET_IMPLEMENTED_Pattern: + pass +match d3: + case NOT_YET_IMPLEMENTED_Pattern: + pass +while ( # d 4 +): + pass +if ( # d 5 +): + pass +elif ( # d 6 +): + pass +for ( # d 7 +) in ( # d 8 +): + pass +try: + pass +except ( # d 9 +): + pass + + +def e1( # e 1 +): + pass + + +def e2() -> ( # e 2 +): + pass + + +class E3: # e 3 + pass + + +f1 = [ # f 1 +] +[ # f 2 +] +f3 = { # f3 +} +{ # f 4 +} +``` + + + diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap new file mode 100644 index 0000000000..9ba9c4892c --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap @@ -0,0 +1,266 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py +--- +## Input +```py +# Opening parentheses end-of-line comment with value in the parentheses + +( # a 1 +x) +a2 = ( # a 2 +x) +a3 = f( # a 3 +x) +a4 = ( # a 4 +x) = a4 +a5: List( # a 5 +x) = 5 + +raise ( # b 1a +x) +raise b1b from ( # b 1b +x) +raise ( # b 1c +x) from b1c +del ( # b 2 +x) +assert ( # b 3 +x), ( #b 4 +x) + +def g(): + """Statements that are only allowed in function bodies""" + return ( # c 1 + x) + yield ( # c 2 + x) +async def h(): + """Statements that are only allowed in async function bodies""" + await ( # c 3 + x) + +with ( # d 1 +x): pass +match ( # d 2 +x): + case d2: + pass +match d3: + case ( # d 3 + x): + pass +while ( # d 4 +x): + pass +if ( # d 5 +x): + pass +elif ( # d 6 +y): + pass +for ( # d 7 +x) in ( # d 8 +y): + pass +try: + pass +except ( # d 9 + x +): + pass + + +def e1( # e 1 +x): pass + + +def e2() -> ( # e 2 +x): pass + + +class E3( # e 3 +x): pass + + +f1 = [ # f 1 +x] +[ # f 2 +x] +f3 = { # f3 +x} +{ # f 4 +x} + + + +# Non-empty parentheses: These are not allowed without a value +def f1[ # f1 + T +](): pass +f2 = ( # f2 + i for i in range(10) +) +f3 = [ # f3 + i for i in range(10) +] +f4 = { # f4 + i for i in range(10) +} +f5 = { # f5 + i: i**2 for i in range(10) +} + + +``` + +## Output +```py +# Opening parentheses end-of-line comment with value in the parentheses + +( + # a 1 + x +) +a2 = x # a 2 +a3 = f( # a 3 + x +) +a4 = x = a4 # a 4 +a5: List( # a 5 + x +) = 5 + +raise ( + # b 1a + x +) +raise b1b from (x) # b 1b +raise ( + # b 1c + x +) from b1c +del ( + # b 2 + x +) +assert ( + # b 3 + x # b 4 +), x + + +def g(): + """Statements that are only allowed in function bodies""" + return ( + # c 1 + x + ) + yield ( + # c 2 + x + ) + + +async def h(): + """Statements that are only allowed in async function bodies""" + await ( + # c 3 + x + ) + + +with ( + # d 1 + x +): + pass +match ( + # d 2 + x +): + case NOT_YET_IMPLEMENTED_Pattern: + pass +match d3: + case NOT_YET_IMPLEMENTED_Pattern: + pass +while ( + # d 4 + x +): + pass +if ( + # d 5 + x +): + pass +elif ( + # d 6 + y +): + pass +for ( + # d 7 + x # d 8 +) in y: + pass +try: + pass +except ( + # d 9 + x +): + pass + + +def e1( # e 1 + x +): + pass + + +def e2() -> x: # e 2 + pass + + +class E3( # e 3 + x +): + pass + + +f1 = [ # f 1 + x +] +[ # f 2 + x +] +f3 = { # f3 + x +} +{ # f 4 + x +} + + +# Non-empty parentheses: These are not allowed without a value +def f1[T](): # f1 + pass + + +f2 = ( # f2 + i for i in range(10) +) +f3 = [ # f3 + i for i in range(10) +] +f4 = { # f4 + i for i in range(10) +} +f5 = { # f5 + i: i**2 for i in range(10) +} +``` + + + From 50dab9cea6988fc8cbe51b598c811731bd61e654 Mon Sep 17 00:00:00 2001 From: qdegraaf <34540841+qdegraaf@users.noreply.github.com> Date: Thu, 10 Aug 2023 13:06:40 +0200 Subject: [PATCH 062/155] [`flake8-bugbear`] Add autofix for B006 (#6131) ## Summary Reopening of https://github.com/astral-sh/ruff/pull/4880 One open TODO as described in: https://github.com/astral-sh/ruff/pull/4880#discussion_r1265110215 FYI @charliermarsh seeing as you commented you wanted to do final review and merge. @konstin @dhruvmanila @MichaReiser as previous reviewers. # Old Description ## Summary Adds an autofix for B006 turning mutable argument defaults into None and setting their original value back in the function body if still `None` at runtime like so: ```python def before(x=[]): pass def after(x=None): if x is None: x = [] pass ``` ## Test Plan Added an extra test case to existing fixture with more indentation. Checked results for all old examples. NOTE: Also adapted the jupyter notebook test as this checked for B006 as well. ## Issue link Closes: https://github.com/charliermarsh/ruff/issues/4693 --------- Co-authored-by: konstin --- .../test/fixtures/flake8_bugbear/B006_B008.py | 14 + .../src/checkers/ast/analyze/parameters.rs | 3 - .../src/checkers/ast/analyze/statement.rs | 5 +- .../rules/mutable_argument_default.rs | 76 +++- ...ke8_bugbear__tests__B006_B006_B008.py.snap | 393 ++++++++++++++---- ...ke8_bugbear__tests__B008_B006_B008.py.snap | 102 ++--- 6 files changed, 461 insertions(+), 132 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py b/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py index e104189015..71146ea184 100644 --- a/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py +++ b/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py @@ -68,6 +68,20 @@ def this_is_also_wrong(value={}): ... +class Foo: + @staticmethod + def this_is_also_wrong_and_more_indented(value={}): + pass + + +def multiline_arg_wrong(value={ + +}): + ... + +def single_line_func_wrong(value = {}): ... + + def and_this(value=set()): ... diff --git a/crates/ruff/src/checkers/ast/analyze/parameters.rs b/crates/ruff/src/checkers/ast/analyze/parameters.rs index fe300a8ea1..41d525197b 100644 --- a/crates/ruff/src/checkers/ast/analyze/parameters.rs +++ b/crates/ruff/src/checkers/ast/analyze/parameters.rs @@ -6,9 +6,6 @@ use crate::rules::{flake8_bugbear, flake8_pyi, ruff}; /// Run lint rules over a [`Parameters`] syntax node. pub(crate) fn parameters(parameters: &Parameters, checker: &mut Checker) { - if checker.enabled(Rule::MutableArgumentDefault) { - flake8_bugbear::rules::mutable_argument_default(checker, parameters); - } if checker.enabled(Rule::FunctionCallInDefaultArgument) { flake8_bugbear::rules::function_call_in_argument_default(checker, parameters); } diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index db0fa91f56..366f324511 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -77,7 +77,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { parameters, body, type_params, - range: _, + range, }) => { if checker.enabled(Rule::DjangoNonLeadingReceiverDecorator) { flake8_django::rules::non_leading_receiver_decorator(checker, decorator_list); @@ -204,6 +204,9 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.enabled(Rule::CachedInstanceMethod) { flake8_bugbear::rules::cached_instance_method(checker, decorator_list); } + if checker.enabled(Rule::MutableArgumentDefault) { + flake8_bugbear::rules::mutable_argument_default(checker, parameters, body, *range); + } if checker.any_enabled(&[ Rule::UnnecessaryReturnNone, Rule::ImplicitReturnValue, diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs b/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs index e19d7930dc..d6de9e965a 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs @@ -1,10 +1,16 @@ -use ruff_python_ast::{ParameterWithDefault, Parameters, Ranged}; - -use ruff_diagnostics::{Diagnostic, Violation}; +use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; +use ruff_python_ast::docstrings::leading_space; +use ruff_python_ast::{ParameterWithDefault, Parameters, Ranged, Stmt}; +use ruff_python_parser::lexer::lex_starts_at; +use ruff_python_parser::{Mode, Tok}; use ruff_python_semantic::analyze::typing::{is_immutable_annotation, is_mutable_expr}; +use ruff_python_trivia::indentation_at_offset; +use ruff_source_file::Locator; +use ruff_text_size::TextRange; use crate::checkers::ast::Checker; +use crate::registry::AsRule; /// ## What it does /// Checks for uses of mutable objects as function argument defaults. @@ -50,14 +56,26 @@ use crate::checkers::ast::Checker; pub struct MutableArgumentDefault; impl Violation for MutableArgumentDefault { + const AUTOFIX: AutofixKind = AutofixKind::Sometimes; + #[derive_message_formats] fn message(&self) -> String { format!("Do not use mutable data structures for argument defaults") } + fn autofix_title(&self) -> Option { + Some(format!( + "Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None`" + )) + } } /// B006 -pub(crate) fn mutable_argument_default(checker: &mut Checker, parameters: &Parameters) { +pub(crate) fn mutable_argument_default( + checker: &mut Checker, + parameters: &Parameters, + body: &[Stmt], + func_range: TextRange, +) { // Scan in reverse order to right-align zip(). for ParameterWithDefault { parameter, @@ -79,9 +97,53 @@ pub(crate) fn mutable_argument_default(checker: &mut Checker, parameters: &Param .as_ref() .is_some_and(|expr| is_immutable_annotation(expr, checker.semantic())) { - checker - .diagnostics - .push(Diagnostic::new(MutableArgumentDefault, default.range())); + let mut diagnostic = Diagnostic::new(MutableArgumentDefault, default.range()); + + // If the function body is on the same line as the function def, do not fix + if checker.patch(diagnostic.kind.rule()) + && !is_single_line(checker.locator(), func_range, body) + { + // Set the default arg value to None + let arg_edit = Edit::range_replacement("None".to_string(), default.range()); + + // Add conditional check to set the default arg to its original value if still None + let mut check_lines = String::new(); + let indentation = + indentation_at_offset(body[0].start(), checker.locator()).unwrap_or_default(); + let indentation = leading_space(indentation); + // body[0].start() starts at correct indentation so we do need to add indentation + // before pushing the if statement + check_lines.push_str(format!("if {} is None:\n", parameter.name.as_str()).as_str()); + check_lines.push_str(indentation); + check_lines.push_str(checker.stylist().indentation()); + check_lines.push_str( + format!( + "{} = {}", + parameter.name.as_str(), + checker.generator().expr(default), + ) + .as_str(), + ); + check_lines.push_str(&checker.stylist().line_ending()); + check_lines.push_str(indentation); + let check_edit = Edit::insertion(check_lines, body[0].start()); + + diagnostic.set_fix(Fix::manual_edits(arg_edit, [check_edit])); + } + checker.diagnostics.push(diagnostic); } } } + +fn is_single_line(locator: &Locator, func_range: TextRange, body: &[Stmt]) -> bool { + let arg_string = locator.slice(func_range); + for (tok, range) in lex_starts_at(arg_string, Mode::Module, func_range.start()).flatten() { + match tok { + Tok::Colon => { + return !locator.contains_line_break(TextRange::new(range.end(), body[0].start())); + } + _ => continue, + } + } + false +} diff --git a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap index abac933f98..dd5f00fbec 100644 --- a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap +++ b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap @@ -1,123 +1,376 @@ --- source: crates/ruff/src/rules/flake8_bugbear/mod.rs --- -B006_B008.py:63:25: B006 Do not use mutable data structures for argument defaults +B006_B008.py:63:25: B006 [*] Do not use mutable data structures for argument defaults | 63 | def this_is_wrong(value=[1, 2, 3]): | ^^^^^^^^^ B006 64 | ... | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:67:30: B006 Do not use mutable data structures for argument defaults +ℹ Possible fix +60 60 | # Flag mutable literals/comprehensions +61 61 | +62 62 | +63 |-def this_is_wrong(value=[1, 2, 3]): + 63 |+def this_is_wrong(value=None): + 64 |+ if value is None: + 65 |+ value = [1, 2, 3] +64 66 | ... +65 67 | +66 68 | + +B006_B008.py:67:30: B006 [*] Do not use mutable data structures for argument defaults | 67 | def this_is_also_wrong(value={}): | ^^ B006 68 | ... | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:71:20: B006 Do not use mutable data structures for argument defaults - | -71 | def and_this(value=set()): - | ^^^^^ B006 -72 | ... - | +ℹ Possible fix +64 64 | ... +65 65 | +66 66 | +67 |-def this_is_also_wrong(value={}): + 67 |+def this_is_also_wrong(value=None): + 68 |+ if value is None: + 69 |+ value = {} +68 70 | ... +69 71 | +70 72 | -B006_B008.py:75:20: B006 Do not use mutable data structures for argument defaults +B006_B008.py:73:52: B006 [*] Do not use mutable data structures for argument defaults | -75 | def this_too(value=collections.OrderedDict()): - | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 -76 | ... +71 | class Foo: +72 | @staticmethod +73 | def this_is_also_wrong_and_more_indented(value={}): + | ^^ B006 +74 | pass | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:79:32: B006 Do not use mutable data structures for argument defaults +ℹ Possible fix +70 70 | +71 71 | class Foo: +72 72 | @staticmethod +73 |- def this_is_also_wrong_and_more_indented(value={}): + 73 |+ def this_is_also_wrong_and_more_indented(value=None): + 74 |+ if value is None: + 75 |+ value = {} +74 76 | pass +75 77 | +76 78 | + +B006_B008.py:77:31: B006 [*] Do not use mutable data structures for argument defaults + | +77 | def multiline_arg_wrong(value={ + | _______________________________^ +78 | | +79 | | }): + | |_^ B006 +80 | ... + | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +74 74 | pass +75 75 | +76 76 | +77 |-def multiline_arg_wrong(value={ +78 |- +79 |-}): + 77 |+def multiline_arg_wrong(value=None): + 78 |+ if value is None: + 79 |+ value = {} +80 80 | ... +81 81 | +82 82 | def single_line_func_wrong(value = {}): ... + +B006_B008.py:82:36: B006 Do not use mutable data structures for argument defaults | -79 | async def async_this_too(value=collections.defaultdict()): - | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 80 | ... +81 | +82 | def single_line_func_wrong(value = {}): ... + | ^^ B006 | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:83:26: B006 Do not use mutable data structures for argument defaults +B006_B008.py:85:20: B006 [*] Do not use mutable data structures for argument defaults | -83 | def dont_forget_me(value=collections.deque()): +85 | def and_this(value=set()): + | ^^^^^ B006 +86 | ... + | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +82 82 | def single_line_func_wrong(value = {}): ... +83 83 | +84 84 | +85 |-def and_this(value=set()): + 85 |+def and_this(value=None): + 86 |+ if value is None: + 87 |+ value = set() +86 88 | ... +87 89 | +88 90 | + +B006_B008.py:89:20: B006 [*] Do not use mutable data structures for argument defaults + | +89 | def this_too(value=collections.OrderedDict()): + | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 +90 | ... + | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +86 86 | ... +87 87 | +88 88 | +89 |-def this_too(value=collections.OrderedDict()): + 89 |+def this_too(value=None): + 90 |+ if value is None: + 91 |+ value = collections.OrderedDict() +90 92 | ... +91 93 | +92 94 | + +B006_B008.py:93:32: B006 [*] Do not use mutable data structures for argument defaults + | +93 | async def async_this_too(value=collections.defaultdict()): + | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 +94 | ... + | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +90 90 | ... +91 91 | +92 92 | +93 |-async def async_this_too(value=collections.defaultdict()): + 93 |+async def async_this_too(value=None): + 94 |+ if value is None: + 95 |+ value = collections.defaultdict() +94 96 | ... +95 97 | +96 98 | + +B006_B008.py:97:26: B006 [*] Do not use mutable data structures for argument defaults + | +97 | def dont_forget_me(value=collections.deque()): | ^^^^^^^^^^^^^^^^^^^ B006 -84 | ... +98 | ... | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:88:46: B006 Do not use mutable data structures for argument defaults - | -87 | # N.B. we're also flagging the function call in the comprehension -88 | def list_comprehension_also_not_okay(default=[i**2 for i in range(3)]): - | ^^^^^^^^^^^^^^^^^^^^^^^^ B006 -89 | pass - | +ℹ Possible fix +94 94 | ... +95 95 | +96 96 | +97 |-def dont_forget_me(value=collections.deque()): + 97 |+def dont_forget_me(value=None): + 98 |+ if value is None: + 99 |+ value = collections.deque() +98 100 | ... +99 101 | +100 102 | -B006_B008.py:92:46: B006 Do not use mutable data structures for argument defaults - | -92 | def dict_comprehension_also_not_okay(default={i: i**2 for i in range(3)}): - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ B006 -93 | pass - | - -B006_B008.py:96:45: B006 Do not use mutable data structures for argument defaults - | -96 | def set_comprehension_also_not_okay(default={i**2 for i in range(3)}): - | ^^^^^^^^^^^^^^^^^^^^^^^^ B006 -97 | pass - | - -B006_B008.py:100:33: B006 Do not use mutable data structures for argument defaults +B006_B008.py:102:46: B006 [*] Do not use mutable data structures for argument defaults | -100 | def kwonlyargs_mutable(*, value=[]): +101 | # N.B. we're also flagging the function call in the comprehension +102 | def list_comprehension_also_not_okay(default=[i**2 for i in range(3)]): + | ^^^^^^^^^^^^^^^^^^^^^^^^ B006 +103 | pass + | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +99 99 | +100 100 | +101 101 | # N.B. we're also flagging the function call in the comprehension +102 |-def list_comprehension_also_not_okay(default=[i**2 for i in range(3)]): + 102 |+def list_comprehension_also_not_okay(default=None): + 103 |+ if default is None: + 104 |+ default = [i ** 2 for i in range(3)] +103 105 | pass +104 106 | +105 107 | + +B006_B008.py:106:46: B006 [*] Do not use mutable data structures for argument defaults + | +106 | def dict_comprehension_also_not_okay(default={i: i**2 for i in range(3)}): + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ B006 +107 | pass + | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +103 103 | pass +104 104 | +105 105 | +106 |-def dict_comprehension_also_not_okay(default={i: i**2 for i in range(3)}): + 106 |+def dict_comprehension_also_not_okay(default=None): + 107 |+ if default is None: + 108 |+ default = {i: i ** 2 for i in range(3)} +107 109 | pass +108 110 | +109 111 | + +B006_B008.py:110:45: B006 [*] Do not use mutable data structures for argument defaults + | +110 | def set_comprehension_also_not_okay(default={i**2 for i in range(3)}): + | ^^^^^^^^^^^^^^^^^^^^^^^^ B006 +111 | pass + | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +107 107 | pass +108 108 | +109 109 | +110 |-def set_comprehension_also_not_okay(default={i**2 for i in range(3)}): + 110 |+def set_comprehension_also_not_okay(default=None): + 111 |+ if default is None: + 112 |+ default = {i ** 2 for i in range(3)} +111 113 | pass +112 114 | +113 115 | + +B006_B008.py:114:33: B006 [*] Do not use mutable data structures for argument defaults + | +114 | def kwonlyargs_mutable(*, value=[]): | ^^ B006 -101 | ... +115 | ... | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:221:20: B006 Do not use mutable data structures for argument defaults +ℹ Possible fix +111 111 | pass +112 112 | +113 113 | +114 |-def kwonlyargs_mutable(*, value=[]): + 114 |+def kwonlyargs_mutable(*, value=None): + 115 |+ if value is None: + 116 |+ value = [] +115 117 | ... +116 118 | +117 119 | + +B006_B008.py:235:20: B006 [*] Do not use mutable data structures for argument defaults | -219 | # B006 and B008 -220 | # We should handle arbitrary nesting of these B008. -221 | def nested_combo(a=[float(3), dt.datetime.now()]): +233 | # B006 and B008 +234 | # We should handle arbitrary nesting of these B008. +235 | def nested_combo(a=[float(3), dt.datetime.now()]): | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ B006 -222 | pass +236 | pass | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:258:27: B006 Do not use mutable data structures for argument defaults +ℹ Possible fix +232 232 | +233 233 | # B006 and B008 +234 234 | # We should handle arbitrary nesting of these B008. +235 |-def nested_combo(a=[float(3), dt.datetime.now()]): + 235 |+def nested_combo(a=None): + 236 |+ if a is None: + 237 |+ a = [float(3), dt.datetime.now()] +236 238 | pass +237 239 | +238 240 | + +B006_B008.py:272:27: B006 [*] Do not use mutable data structures for argument defaults | -257 | def mutable_annotations( -258 | a: list[int] | None = [], +271 | def mutable_annotations( +272 | a: list[int] | None = [], | ^^ B006 -259 | b: Optional[Dict[int, int]] = {}, -260 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +273 | b: Optional[Dict[int, int]] = {}, +274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:259:35: B006 Do not use mutable data structures for argument defaults +ℹ Possible fix +269 269 | +270 270 | +271 271 | def mutable_annotations( +272 |- a: list[int] | None = [], + 272 |+ a: list[int] | None = None, +273 273 | b: Optional[Dict[int, int]] = {}, +274 274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +275 275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +276 276 | ): + 277 |+ if a is None: + 278 |+ a = [] +277 279 | pass + +B006_B008.py:273:35: B006 [*] Do not use mutable data structures for argument defaults | -257 | def mutable_annotations( -258 | a: list[int] | None = [], -259 | b: Optional[Dict[int, int]] = {}, +271 | def mutable_annotations( +272 | a: list[int] | None = [], +273 | b: Optional[Dict[int, int]] = {}, | ^^ B006 -260 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), -261 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:260:62: B006 Do not use mutable data structures for argument defaults +ℹ Possible fix +270 270 | +271 271 | def mutable_annotations( +272 272 | a: list[int] | None = [], +273 |- b: Optional[Dict[int, int]] = {}, + 273 |+ b: Optional[Dict[int, int]] = None, +274 274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +275 275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +276 276 | ): + 277 |+ if b is None: + 278 |+ b = {} +277 279 | pass + +B006_B008.py:274:62: B006 [*] Do not use mutable data structures for argument defaults | -258 | a: list[int] | None = [], -259 | b: Optional[Dict[int, int]] = {}, -260 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +272 | a: list[int] | None = [], +273 | b: Optional[Dict[int, int]] = {}, +274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), | ^^^^^ B006 -261 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), -262 | ): +275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +276 | ): | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` -B006_B008.py:261:80: B006 Do not use mutable data structures for argument defaults +ℹ Possible fix +271 271 | def mutable_annotations( +272 272 | a: list[int] | None = [], +273 273 | b: Optional[Dict[int, int]] = {}, +274 |- c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), + 274 |+ c: Annotated[Union[Set[str], abc.Sized], "annotation"] = None, +275 275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +276 276 | ): + 277 |+ if c is None: + 278 |+ c = set() +277 279 | pass + +B006_B008.py:275:80: B006 [*] Do not use mutable data structures for argument defaults | -259 | b: Optional[Dict[int, int]] = {}, -260 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), -261 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +273 | b: Optional[Dict[int, int]] = {}, +274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), | ^^^^^ B006 -262 | ): -263 | pass +276 | ): +277 | pass | + = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + +ℹ Possible fix +272 272 | a: list[int] | None = [], +273 273 | b: Optional[Dict[int, int]] = {}, +274 274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), +275 |- d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), + 275 |+ d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = None, +276 276 | ): + 277 |+ if d is None: + 278 |+ d = set() +277 279 | pass diff --git a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B008_B006_B008.py.snap b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B008_B006_B008.py.snap index 36a464813a..dc747bc5b4 100644 --- a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B008_B006_B008.py.snap +++ b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B008_B006_B008.py.snap @@ -1,83 +1,83 @@ --- source: crates/ruff/src/rules/flake8_bugbear/mod.rs --- -B006_B008.py:88:61: B008 Do not perform function call `range` in argument defaults - | -87 | # N.B. we're also flagging the function call in the comprehension -88 | def list_comprehension_also_not_okay(default=[i**2 for i in range(3)]): - | ^^^^^^^^ B008 -89 | pass - | - -B006_B008.py:92:64: B008 Do not perform function call `range` in argument defaults - | -92 | def dict_comprehension_also_not_okay(default={i: i**2 for i in range(3)}): - | ^^^^^^^^ B008 -93 | pass - | - -B006_B008.py:96:60: B008 Do not perform function call `range` in argument defaults - | -96 | def set_comprehension_also_not_okay(default={i**2 for i in range(3)}): - | ^^^^^^^^ B008 -97 | pass - | - -B006_B008.py:112:39: B008 Do not perform function call `time.time` in argument defaults +B006_B008.py:102:61: B008 Do not perform function call `range` in argument defaults | -110 | # B008 -111 | # Flag function calls as default args (including if they are part of a sub-expression) -112 | def in_fact_all_calls_are_wrong(value=time.time()): +101 | # N.B. we're also flagging the function call in the comprehension +102 | def list_comprehension_also_not_okay(default=[i**2 for i in range(3)]): + | ^^^^^^^^ B008 +103 | pass + | + +B006_B008.py:106:64: B008 Do not perform function call `range` in argument defaults + | +106 | def dict_comprehension_also_not_okay(default={i: i**2 for i in range(3)}): + | ^^^^^^^^ B008 +107 | pass + | + +B006_B008.py:110:60: B008 Do not perform function call `range` in argument defaults + | +110 | def set_comprehension_also_not_okay(default={i**2 for i in range(3)}): + | ^^^^^^^^ B008 +111 | pass + | + +B006_B008.py:126:39: B008 Do not perform function call `time.time` in argument defaults + | +124 | # B008 +125 | # Flag function calls as default args (including if they are part of a sub-expression) +126 | def in_fact_all_calls_are_wrong(value=time.time()): | ^^^^^^^^^^^ B008 -113 | ... +127 | ... | -B006_B008.py:116:12: B008 Do not perform function call `dt.datetime.now` in argument defaults +B006_B008.py:130:12: B008 Do not perform function call `dt.datetime.now` in argument defaults | -116 | def f(when=dt.datetime.now() + dt.timedelta(days=7)): +130 | def f(when=dt.datetime.now() + dt.timedelta(days=7)): | ^^^^^^^^^^^^^^^^^ B008 -117 | pass +131 | pass | -B006_B008.py:120:30: B008 Do not perform function call in argument defaults +B006_B008.py:134:30: B008 Do not perform function call in argument defaults | -120 | def can_even_catch_lambdas(a=(lambda x: x)()): +134 | def can_even_catch_lambdas(a=(lambda x: x)()): | ^^^^^^^^^^^^^^^ B008 -121 | ... +135 | ... | -B006_B008.py:221:31: B008 Do not perform function call `dt.datetime.now` in argument defaults +B006_B008.py:235:31: B008 Do not perform function call `dt.datetime.now` in argument defaults | -219 | # B006 and B008 -220 | # We should handle arbitrary nesting of these B008. -221 | def nested_combo(a=[float(3), dt.datetime.now()]): +233 | # B006 and B008 +234 | # We should handle arbitrary nesting of these B008. +235 | def nested_combo(a=[float(3), dt.datetime.now()]): | ^^^^^^^^^^^^^^^^^ B008 -222 | pass +236 | pass | -B006_B008.py:227:22: B008 Do not perform function call `map` in argument defaults +B006_B008.py:241:22: B008 Do not perform function call `map` in argument defaults | -225 | # Don't flag nested B006 since we can't guarantee that -226 | # it isn't made mutable by the outer operation. -227 | def no_nested_b006(a=map(lambda s: s.upper(), ["a", "b", "c"])): +239 | # Don't flag nested B006 since we can't guarantee that +240 | # it isn't made mutable by the outer operation. +241 | def no_nested_b006(a=map(lambda s: s.upper(), ["a", "b", "c"])): | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ B008 -228 | pass +242 | pass | -B006_B008.py:232:19: B008 Do not perform function call `random.randint` in argument defaults +B006_B008.py:246:19: B008 Do not perform function call `random.randint` in argument defaults | -231 | # B008-ception. -232 | def nested_b008(a=random.randint(0, dt.datetime.now().year)): +245 | # B008-ception. +246 | def nested_b008(a=random.randint(0, dt.datetime.now().year)): | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ B008 -233 | pass +247 | pass | -B006_B008.py:232:37: B008 Do not perform function call `dt.datetime.now` in argument defaults +B006_B008.py:246:37: B008 Do not perform function call `dt.datetime.now` in argument defaults | -231 | # B008-ception. -232 | def nested_b008(a=random.randint(0, dt.datetime.now().year)): +245 | # B008-ception. +246 | def nested_b008(a=random.randint(0, dt.datetime.now().year)): | ^^^^^^^^^^^^^^^^^ B008 -233 | pass +247 | pass | From dc3275fe7f1a6b3f611613d08e69c084dcf5a3e5 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Thu, 10 Aug 2023 20:39:53 +0800 Subject: [PATCH 063/155] Improve Ruff Formatter Interoperability (#6472) --- crates/ruff_formatter/src/lib.rs | 8 ++++- crates/ruff_python_formatter/src/options.rs | 39 +++++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/crates/ruff_formatter/src/lib.rs b/crates/ruff_formatter/src/lib.rs index 9034e271d9..7ca7c5c7df 100644 --- a/crates/ruff_formatter/src/lib.rs +++ b/crates/ruff_formatter/src/lib.rs @@ -92,7 +92,13 @@ impl FromStr for IndentStyle { "tab" | "Tabs" => Ok(Self::Tab), "space" | "Spaces" => Ok(Self::Space(IndentStyle::DEFAULT_SPACES)), // TODO: replace this error with a diagnostic - _ => Err("Value not supported for IndentStyle"), + v => { + let v = v.strip_prefix("Spaces, size: ").unwrap_or(v); + + u8::from_str(v) + .map(Self::Space) + .map_err(|_| "Value not supported for IndentStyle") + } } } } diff --git a/crates/ruff_python_formatter/src/options.rs b/crates/ruff_python_formatter/src/options.rs index e5aef3dc35..ef2d84ca79 100644 --- a/crates/ruff_python_formatter/src/options.rs +++ b/crates/ruff_python_formatter/src/options.rs @@ -2,6 +2,7 @@ use ruff_formatter::printer::{LineEnding, PrinterOptions}; use ruff_formatter::{FormatOptions, IndentStyle, LineWidth}; use ruff_python_ast::PySourceType; use std::path::Path; +use std::str::FromStr; #[derive(Clone, Debug)] #[cfg_attr( @@ -16,6 +17,7 @@ pub struct PyFormatOptions { /// Specifies the indent style: /// * Either a tab /// * or a specific amount of spaces + #[cfg_attr(feature = "serde", serde(default = "default_indent_style"))] indent_style: IndentStyle, /// The preferred line width at which the formatter should wrap lines. @@ -33,12 +35,16 @@ fn default_line_width() -> LineWidth { LineWidth::try_from(88).unwrap() } +fn default_indent_style() -> IndentStyle { + IndentStyle::Space(4) +} + impl Default for PyFormatOptions { fn default() -> Self { Self { source_type: PySourceType::default(), - indent_style: IndentStyle::Space(4), - line_width: LineWidth::try_from(88).unwrap(), + indent_style: default_indent_style(), + line_width: default_line_width(), quote_style: QuoteStyle::default(), magic_trailing_comma: MagicTrailingComma::default(), } @@ -66,7 +72,8 @@ impl PyFormatOptions { self.quote_style } - pub fn with_quote_style(&mut self, style: QuoteStyle) -> &mut Self { + #[must_use] + pub fn with_quote_style(mut self, style: QuoteStyle) -> Self { self.quote_style = style; self } @@ -150,6 +157,19 @@ impl TryFrom for QuoteStyle { } } +impl FromStr for QuoteStyle { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + match s { + "\"" | "double" | "Double" => Ok(Self::Double), + "'" | "single" | "Single" => Ok(Self::Single), + // TODO: replace this error with a diagnostic + _ => Err("Value not supported for QuoteStyle"), + } + } +} + #[derive(Copy, Clone, Debug, Default)] #[cfg_attr( feature = "serde", @@ -167,3 +187,16 @@ impl MagicTrailingComma { matches!(self, Self::Respect) } } + +impl FromStr for MagicTrailingComma { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + match s { + "respect" | "Respect" => Ok(Self::Respect), + "ignore" | "Ignore" => Ok(Self::Ignore), + // TODO: replace this error with a diagnostic + _ => Err("Value not supported for MagicTrailingComma"), + } + } +} From 6706ae48286bd1efd5d750d4d8103658e9cfe8cd Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 10 Aug 2023 10:20:09 -0400 Subject: [PATCH 064/155] Respect scoping rules when identifying builtins (#6468) ## Summary Our `is_builtin` check did a naive walk over the parent scopes; instead, it needs to (e.g.) skip symbols in a class scope if being called outside of the class scope itself. Closes https://github.com/astral-sh/ruff/issues/6466. ## Test Plan `cargo test` --- .../test/fixtures/pycodestyle/E721.py | 27 +++++++++++++++++++ ...les__pycodestyle__tests__E721_E721.py.snap | 18 +++++++++++++ crates/ruff_python_semantic/src/model.rs | 6 +++-- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pycodestyle/E721.py b/crates/ruff/resources/test/fixtures/pycodestyle/E721.py index 5f07803832..6eacc0cb0c 100644 --- a/crates/ruff/resources/test/fixtures/pycodestyle/E721.py +++ b/crates/ruff/resources/test/fixtures/pycodestyle/E721.py @@ -61,3 +61,30 @@ if x == types.X: #: E721 assert type(res) is int + + +class Foo: + def asdf(self, value: str | None): + #: E721 + if type(value) is str: + ... + + +class Foo: + def type(self): + pass + + def asdf(self, value: str | None): + #: E721 + if type(value) is str: + ... + + +class Foo: + def asdf(self, value: str | None): + def type(): + pass + + # Okay + if type(value) is str: + ... diff --git a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E721_E721.py.snap b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E721_E721.py.snap index 1979999384..50476a5090 100644 --- a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E721_E721.py.snap +++ b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E721_E721.py.snap @@ -152,4 +152,22 @@ E721.py:63:8: E721 Do not compare types, use `isinstance()` | ^^^^^^^^^^^^^^^^ E721 | +E721.py:69:12: E721 Do not compare types, use `isinstance()` + | +67 | def asdf(self, value: str | None): +68 | #: E721 +69 | if type(value) is str: + | ^^^^^^^^^^^^^^^^^^ E721 +70 | ... + | + +E721.py:79:12: E721 Do not compare types, use `isinstance()` + | +77 | def asdf(self, value: str | None): +78 | #: E721 +79 | if type(value) is str: + | ^^^^^^^^^^^^^^^^^^ E721 +80 | ... + | + diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs index b6e7faa3db..0a97a0a638 100644 --- a/crates/ruff_python_semantic/src/model.rs +++ b/crates/ruff_python_semantic/src/model.rs @@ -249,14 +249,16 @@ impl<'a> SemanticModel<'a> { /// Return `true` if `member` is bound as a builtin. pub fn is_builtin(&self, member: &str) -> bool { - self.find_binding(member) + self.lookup_symbol(member) + .map(|binding_id| &self.bindings[binding_id]) .is_some_and(|binding| binding.kind.is_builtin()) } /// Return `true` if `member` is an "available" symbol, i.e., a symbol that has not been bound /// in the current scope, or in any containing scope. pub fn is_available(&self, member: &str) -> bool { - self.find_binding(member) + self.lookup_symbol(member) + .map(|binding_id| &self.bindings[binding_id]) .map_or(true, |binding| binding.kind.is_builtin()) } From 1050c4e104a8735ffb254434e2ca64007a37d85e Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Thu, 10 Aug 2023 12:11:37 -0500 Subject: [PATCH 065/155] Extend `target-version` documentation (#6482) Closes https://github.com/astral-sh/ruff/issues/6462 --- crates/ruff/src/settings/options.rs | 6 +++++- ruff.schema.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/ruff/src/settings/options.rs b/crates/ruff/src/settings/options.rs index 7ed6ae20ac..d7e6c67edf 100644 --- a/crates/ruff/src/settings/options.rs +++ b/crates/ruff/src/settings/options.rs @@ -464,7 +464,11 @@ pub struct Options { "# )] /// The minimum Python version to target, e.g., when considering automatic - /// code upgrades, like rewriting type annotations. + /// code upgrades, like rewriting type annotations. Ruff will not propose + /// changes using features that are not available in the given version. + /// + /// For example, to represent supporting Python >=3.10 or ==3.10 + /// specify `target-version = "py310"`. /// /// If omitted, and Ruff is configured via a `pyproject.toml` file, the /// target version will be inferred from its `project.requires-python` diff --git a/ruff.schema.json b/ruff.schema.json index 9d47d617dc..98c3518fe9 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -560,7 +560,7 @@ ] }, "target-version": { - "description": "The minimum Python version to target, e.g., when considering automatic code upgrades, like rewriting type annotations.\n\nIf omitted, and Ruff is configured via a `pyproject.toml` file, the target version will be inferred from its `project.requires-python` field (e.g., `requires-python = \">=3.8\"`). If Ruff is configured via `ruff.toml` or `.ruff.toml`, no such inference will be performed.", + "description": "The minimum Python version to target, e.g., when considering automatic code upgrades, like rewriting type annotations. Ruff will not propose changes using features that are not available in the given version.\n\nFor example, to represent supporting Python >=3.10 or ==3.10 specify `target-version = \"py310\"`.\n\nIf omitted, and Ruff is configured via a `pyproject.toml` file, the target version will be inferred from its `project.requires-python` field (e.g., `requires-python = \">=3.8\"`). If Ruff is configured via `ruff.toml` or `.ruff.toml`, no such inference will be performed.", "anyOf": [ { "$ref": "#/definitions/PythonVersion" From 84ae00c39512ae24423ddbd2e13b06cedc4eddeb Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 10 Aug 2023 20:54:38 -0400 Subject: [PATCH 066/155] Allow `os._exit` accesses in `SLF001` (#6490) Closes https://github.com/astral-sh/ruff/issues/6483. --- .../test/fixtures/flake8_self/SLF001.py | 4 + .../rules/private_member_access.rs | 240 +++++++++--------- crates/ruff/src/rules/pylint/rules/logging.rs | 4 +- 3 files changed, 131 insertions(+), 117 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_self/SLF001.py b/crates/ruff/resources/test/fixtures/flake8_self/SLF001.py index 5735e63751..0a5a560182 100644 --- a/crates/ruff/resources/test/fixtures/flake8_self/SLF001.py +++ b/crates/ruff/resources/test/fixtures/flake8_self/SLF001.py @@ -73,3 +73,7 @@ print(foo.__dict__) print(foo.__str__()) print(foo().__class__) print(foo._asdict()) + +import os + +os._exit() diff --git a/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs b/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs index 1f259e51c6..4a3c0cafc3 100644 --- a/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs +++ b/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs @@ -1,8 +1,7 @@ -use ruff_python_ast::{self as ast, Expr, Ranged}; - use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::call_path::collect_call_path; +use ruff_python_ast::{self as ast, Expr, Ranged}; use ruff_python_semantic::ScopeKind; use crate::checkers::ast::Checker; @@ -62,125 +61,136 @@ impl Violation for PrivateMemberAccess { /// SLF001 pub(crate) fn private_member_access(checker: &mut Checker, expr: &Expr) { - if let Expr::Attribute(ast::ExprAttribute { value, attr, .. }) = expr { - if (attr.starts_with("__") && !attr.ends_with("__")) - || (attr.starts_with('_') && !attr.starts_with("__")) + let Expr::Attribute(ast::ExprAttribute { value, attr, .. }) = expr else { + return; + }; + + if (attr.starts_with("__") && !attr.ends_with("__")) + || (attr.starts_with('_') && !attr.starts_with("__")) + { + if checker + .settings + .flake8_self + .ignore_names + .contains(attr.as_ref()) { - if checker - .settings - .flake8_self - .ignore_names - .contains(attr.as_ref()) - { + return; + } + + // Ignore accesses on instances within special methods (e.g., `__eq__`). + if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) = + checker.semantic().current_scope().kind + { + if matches!( + name.as_str(), + "__lt__" + | "__le__" + | "__eq__" + | "__ne__" + | "__gt__" + | "__ge__" + | "__add__" + | "__sub__" + | "__mul__" + | "__matmul__" + | "__truediv__" + | "__floordiv__" + | "__mod__" + | "__divmod__" + | "__pow__" + | "__lshift__" + | "__rshift__" + | "__and__" + | "__xor__" + | "__or__" + | "__radd__" + | "__rsub__" + | "__rmul__" + | "__rmatmul__" + | "__rtruediv__" + | "__rfloordiv__" + | "__rmod__" + | "__rdivmod__" + | "__rpow__" + | "__rlshift__" + | "__rrshift__" + | "__rand__" + | "__rxor__" + | "__ror__" + | "__iadd__" + | "__isub__" + | "__imul__" + | "__imatmul__" + | "__itruediv__" + | "__ifloordiv__" + | "__imod__" + | "__ipow__" + | "__ilshift__" + | "__irshift__" + | "__iand__" + | "__ixor__" + | "__ior__" + ) { + return; + } + } + + // Allow some documented private methods, like `os._exit()`. + if let Some(call_path) = checker.semantic().resolve_call_path(expr) { + if matches!(call_path.as_slice(), ["os", "_exit"]) { + return; + } + } + + if let Expr::Call(ast::ExprCall { func, .. }) = value.as_ref() { + // Ignore `super()` calls. + if let Some(call_path) = collect_call_path(func) { + if matches!(call_path.as_slice(), ["super"]) { + return; + } + } + } + + if let Some(call_path) = collect_call_path(value) { + // Ignore `self` and `cls` accesses. + if matches!(call_path.as_slice(), ["self" | "cls" | "mcs"]) { return; } - // Ignore accesses on instances within special methods (e.g., `__eq__`). - if let ScopeKind::Function(ast::StmtFunctionDef { name, .. }) = - checker.semantic().current_scope().kind - { - if matches!( - name.as_str(), - "__lt__" - | "__le__" - | "__eq__" - | "__ne__" - | "__gt__" - | "__ge__" - | "__add__" - | "__sub__" - | "__mul__" - | "__matmul__" - | "__truediv__" - | "__floordiv__" - | "__mod__" - | "__divmod__" - | "__pow__" - | "__lshift__" - | "__rshift__" - | "__and__" - | "__xor__" - | "__or__" - | "__radd__" - | "__rsub__" - | "__rmul__" - | "__rmatmul__" - | "__rtruediv__" - | "__rfloordiv__" - | "__rmod__" - | "__rdivmod__" - | "__rpow__" - | "__rlshift__" - | "__rrshift__" - | "__rand__" - | "__rxor__" - | "__ror__" - | "__iadd__" - | "__isub__" - | "__imul__" - | "__imatmul__" - | "__itruediv__" - | "__ifloordiv__" - | "__imod__" - | "__ipow__" - | "__ilshift__" - | "__irshift__" - | "__iand__" - | "__ixor__" - | "__ior__" - ) { - return; - } - } - - if let Expr::Call(ast::ExprCall { func, .. }) = value.as_ref() { - // Ignore `super()` calls. - if let Some(call_path) = collect_call_path(func) { - if matches!(call_path.as_slice(), ["super"]) { - return; + // Ignore accesses on class members from _within_ the class. + if checker + .semantic() + .scopes + .iter() + .rev() + .find_map(|scope| match &scope.kind { + ScopeKind::Class(ast::StmtClassDef { name, .. }) => Some(name), + _ => None, + }) + .is_some_and(|name| { + if call_path.as_slice() == [name.as_str()] { + checker + .semantic() + .find_binding(name) + .is_some_and(|binding| { + // TODO(charlie): Could the name ever be bound to a + // _different_ class here? + binding.kind.is_class_definition() + }) + } else { + false } - } - } else if let Some(call_path) = collect_call_path(value) { - // Ignore `self` and `cls` accesses. - if matches!(call_path.as_slice(), ["self" | "cls" | "mcs"]) { - return; - } - - // Ignore accesses on class members from _within_ the class. - if checker - .semantic() - .scopes - .iter() - .rev() - .find_map(|scope| match &scope.kind { - ScopeKind::Class(ast::StmtClassDef { name, .. }) => Some(name), - _ => None, - }) - .is_some_and(|name| { - if call_path.as_slice() == [name.as_str()] { - checker - .semantic() - .find_binding(name) - .is_some_and(|binding| { - // TODO(charlie): Could the name ever be bound to a - // _different_ class here? - binding.kind.is_class_definition() - }) - } else { - false - } - }) - { - return; - } + }) + { + return; } - - checker.diagnostics.push(Diagnostic::new( - PrivateMemberAccess { - access: attr.to_string(), - }, - expr.range(), - )); } + + checker.diagnostics.push(Diagnostic::new( + PrivateMemberAccess { + access: attr.to_string(), + }, + expr.range(), + )); } } diff --git a/crates/ruff/src/rules/pylint/rules/logging.rs b/crates/ruff/src/rules/pylint/rules/logging.rs index 5f778ea5d6..5bbc56b4c2 100644 --- a/crates/ruff/src/rules/pylint/rules/logging.rs +++ b/crates/ruff/src/rules/pylint/rules/logging.rs @@ -111,8 +111,8 @@ pub(crate) fn logging_call(checker: &mut Checker, call: &ast::ExprCall) { let Some(Expr::Constant(ast::ExprConstant { value: Constant::Str(value), .. - })) = call.arguments - .find_positional( 0) else { + })) = call.arguments.find_positional(0) + else { return; }; From 9ff80a82b48401c0ff87fc97fa20c960b4e80dc9 Mon Sep 17 00:00:00 2001 From: Tom Kuson Date: Fri, 11 Aug 2023 01:54:53 +0100 Subject: [PATCH 067/155] [`pylint`] Implement `subprocess-run-check` (`W1510`) (#6487) ## Summary Implements [`subprocess-run-check` (`W1510`)](https://pylint.readthedocs.io/en/latest/user_guide/messages/warning/subprocess-run-check.html) as `subprocess-run-without-check` (`PLW1510`). Includes documentation. Related to #970. ## Test Plan `cargo test` --- .../pylint/subprocess_run_without_check.py | 13 ++++ .../src/checkers/ast/analyze/expression.rs | 3 + crates/ruff/src/codes.rs | 1 + crates/ruff/src/rules/pylint/mod.rs | 4 ++ crates/ruff/src/rules/pylint/rules/mod.rs | 2 + .../rules/subprocess_run_without_check.rs | 65 +++++++++++++++++++ ...W1510_subprocess_run_without_check.py.snap | 22 +++++++ ruff.schema.json | 2 + 8 files changed, 112 insertions(+) create mode 100644 crates/ruff/resources/test/fixtures/pylint/subprocess_run_without_check.py create mode 100644 crates/ruff/src/rules/pylint/rules/subprocess_run_without_check.rs create mode 100644 crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW1510_subprocess_run_without_check.py.snap diff --git a/crates/ruff/resources/test/fixtures/pylint/subprocess_run_without_check.py b/crates/ruff/resources/test/fixtures/pylint/subprocess_run_without_check.py new file mode 100644 index 0000000000..b329ba4510 --- /dev/null +++ b/crates/ruff/resources/test/fixtures/pylint/subprocess_run_without_check.py @@ -0,0 +1,13 @@ +import subprocess + +# Errors. +subprocess.run("ls") +subprocess.run("ls", shell=True) + +# Non-errors. +subprocess.run("ls", check=True) +subprocess.run("ls", check=False) +subprocess.run("ls", shell=True, check=True) +subprocess.run("ls", shell=True, check=False) +foo.run("ls") # Not a subprocess.run call. +subprocess.bar("ls") # Not a subprocess.run call. diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index 8589509796..d452a718a3 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -763,6 +763,9 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { if checker.enabled(Rule::SubprocessPopenPreexecFn) { pylint::rules::subprocess_popen_preexec_fn(checker, call); } + if checker.enabled(Rule::SubprocessRunWithoutCheck) { + pylint::rules::subprocess_run_without_check(checker, call); + } if checker.any_enabled(&[ Rule::PytestRaisesWithoutException, Rule::PytestRaisesTooBroad, diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs index 5e3cfe478a..f7e3499fc8 100644 --- a/crates/ruff/src/codes.rs +++ b/crates/ruff/src/codes.rs @@ -226,6 +226,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { (Pylint, "W0711") => (RuleGroup::Unspecified, rules::pylint::rules::BinaryOpException), (Pylint, "W1508") => (RuleGroup::Unspecified, rules::pylint::rules::InvalidEnvvarDefault), (Pylint, "W1509") => (RuleGroup::Unspecified, rules::pylint::rules::SubprocessPopenPreexecFn), + (Pylint, "W1510") => (RuleGroup::Unspecified, rules::pylint::rules::SubprocessRunWithoutCheck), (Pylint, "W1641") => (RuleGroup::Nursery, rules::pylint::rules::EqWithoutHash), (Pylint, "W2901") => (RuleGroup::Unspecified, rules::pylint::rules::RedefinedLoopName), (Pylint, "W3301") => (RuleGroup::Unspecified, rules::pylint::rules::NestedMinMax), diff --git a/crates/ruff/src/rules/pylint/mod.rs b/crates/ruff/src/rules/pylint/mod.rs index fbbb859126..d1dbf89901 100644 --- a/crates/ruff/src/rules/pylint/mod.rs +++ b/crates/ruff/src/rules/pylint/mod.rs @@ -126,6 +126,10 @@ mod tests { Rule::SubprocessPopenPreexecFn, Path::new("subprocess_popen_preexec_fn.py") )] + #[test_case( + Rule::SubprocessRunWithoutCheck, + Path::new("subprocess_run_without_check.py") + )] fn rules(rule_code: Rule, path: &Path) -> Result<()> { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( diff --git a/crates/ruff/src/rules/pylint/rules/mod.rs b/crates/ruff/src/rules/pylint/rules/mod.rs index bfd44d030e..c84dd03b3b 100644 --- a/crates/ruff/src/rules/pylint/rules/mod.rs +++ b/crates/ruff/src/rules/pylint/rules/mod.rs @@ -37,6 +37,7 @@ pub(crate) use return_in_init::*; pub(crate) use self_assigning_variable::*; pub(crate) use single_string_slots::*; pub(crate) use subprocess_popen_preexec_fn::*; +pub(crate) use subprocess_run_without_check::*; pub(crate) use sys_exit_alias::*; pub(crate) use too_many_arguments::*; pub(crate) use too_many_branches::*; @@ -92,6 +93,7 @@ mod return_in_init; mod self_assigning_variable; mod single_string_slots; mod subprocess_popen_preexec_fn; +mod subprocess_run_without_check; mod sys_exit_alias; mod too_many_arguments; mod too_many_branches; diff --git a/crates/ruff/src/rules/pylint/rules/subprocess_run_without_check.rs b/crates/ruff/src/rules/pylint/rules/subprocess_run_without_check.rs new file mode 100644 index 0000000000..f147e8446c --- /dev/null +++ b/crates/ruff/src/rules/pylint/rules/subprocess_run_without_check.rs @@ -0,0 +1,65 @@ +use ruff_diagnostics::{Diagnostic, Violation}; +use ruff_macros::{derive_message_formats, violation}; +use ruff_python_ast as ast; +use ruff_python_ast::Ranged; + +use crate::checkers::ast::Checker; + +/// ## What it does +/// Checks for uses of `subprocess.run` without an explicit `check` argument. +/// +/// ## Why is this bad? +/// By default, `subprocess.run` does not check the return code of the process +/// it runs. This can lead to silent failures. +/// +/// Instead, consider using `check=True` to raise an exception if the process +/// fails, or set `check=False` explicitly to mark the behavior as intentional. +/// +/// ## Example +/// ```python +/// import subprocess +/// +/// subprocess.run(["ls", "nonexistent"]) # No exception raised. +/// ``` +/// +/// Use instead: +/// ```python +/// import subprocess +/// +/// subprocess.run(["ls", "nonexistent"], check=True) # Raises exception. +/// ``` +/// +/// Or: +/// ```python +/// import subprocess +/// +/// subprocess.run(["ls", "nonexistent"], check=False) # Explicitly no check. +/// ``` +/// +/// ## References +/// - [Python documentation: `subprocess.run`](https://docs.python.org/3/library/subprocess.html#subprocess.run) +#[violation] +pub struct SubprocessRunWithoutCheck; + +impl Violation for SubprocessRunWithoutCheck { + #[derive_message_formats] + fn message(&self) -> String { + format!("`subprocess.run` without explicit `check` argument") + } +} + +/// PLW1510 +pub(crate) fn subprocess_run_without_check(checker: &mut Checker, call: &ast::ExprCall) { + if checker + .semantic() + .resolve_call_path(&call.func) + .is_some_and(|call_path| matches!(call_path.as_slice(), ["subprocess", "run"])) + { + if call.arguments.find_keyword("check").is_none() { + checker.diagnostics.push(Diagnostic::new( + SubprocessRunWithoutCheck, + call.func.range(), + )); + } + } +} diff --git a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW1510_subprocess_run_without_check.py.snap b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW1510_subprocess_run_without_check.py.snap new file mode 100644 index 0000000000..481f380608 --- /dev/null +++ b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW1510_subprocess_run_without_check.py.snap @@ -0,0 +1,22 @@ +--- +source: crates/ruff/src/rules/pylint/mod.rs +--- +subprocess_run_without_check.py:4:1: PLW1510 `subprocess.run` without explicit `check` argument + | +3 | # Errors. +4 | subprocess.run("ls") + | ^^^^^^^^^^^^^^ PLW1510 +5 | subprocess.run("ls", shell=True) + | + +subprocess_run_without_check.py:5:1: PLW1510 `subprocess.run` without explicit `check` argument + | +3 | # Errors. +4 | subprocess.run("ls") +5 | subprocess.run("ls", shell=True) + | ^^^^^^^^^^^^^^ PLW1510 +6 | +7 | # Non-errors. + | + + diff --git a/ruff.schema.json b/ruff.schema.json index 98c3518fe9..ac9a08c559 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -2283,6 +2283,8 @@ "PLW150", "PLW1508", "PLW1509", + "PLW151", + "PLW1510", "PLW1641", "PLW2", "PLW29", From eb68addf97c0b84e0a34d2e6b1bd03b3cf2f9664 Mon Sep 17 00:00:00 2001 From: Victor Hugo Gomes Date: Thu, 10 Aug 2023 22:31:16 -0300 Subject: [PATCH 068/155] [`pylint`] Implement `bad-dunder-name` (`W3201`) (#6486) ## Summary Checks for any misspelled dunder name method and for any method defined with `__...__` that's not one of the pre-defined methods. The pre-defined methods encompass all of Python's standard dunder methods. ref: #970 ## Test Plan Snapshots and manual runs of pylint. --- .../fixtures/pylint/bad_dunder_method_name.py | 46 +++++ .../src/checkers/ast/analyze/statement.rs | 3 + crates/ruff/src/codes.rs | 1 + crates/ruff/src/rules/pylint/mod.rs | 1 + .../pylint/rules/bad_dunder_method_name.rs | 192 ++++++++++++++++++ crates/ruff/src/rules/pylint/rules/mod.rs | 2 + ...ts__PLW3201_bad_dunder_method_name.py.snap | 61 ++++++ ruff.schema.json | 1 + 8 files changed, 307 insertions(+) create mode 100644 crates/ruff/resources/test/fixtures/pylint/bad_dunder_method_name.py create mode 100644 crates/ruff/src/rules/pylint/rules/bad_dunder_method_name.rs create mode 100644 crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW3201_bad_dunder_method_name.py.snap diff --git a/crates/ruff/resources/test/fixtures/pylint/bad_dunder_method_name.py b/crates/ruff/resources/test/fixtures/pylint/bad_dunder_method_name.py new file mode 100644 index 0000000000..46d8be249b --- /dev/null +++ b/crates/ruff/resources/test/fixtures/pylint/bad_dunder_method_name.py @@ -0,0 +1,46 @@ +class Apples: + def _init_(self): # [bad-dunder-name] + pass + + def __hello__(self): # [bad-dunder-name] + print("hello") + + def __init_(self): # [bad-dunder-name] + # author likely unintentionally misspelled the correct init dunder. + pass + + def _init_(self): # [bad-dunder-name] + # author likely unintentionally misspelled the correct init dunder. + pass + + def ___neg__(self): # [bad-dunder-name] + # author likely accidentally added an additional `_` + pass + + def __inv__(self): # [bad-dunder-name] + # author likely meant to call the invert dunder method + pass + + def hello(self): + print("hello") + + def __init__(self): + pass + + def init(self): + # valid name even though someone could accidentally mean __init__ + pass + + def _protected_method(self): + print("Protected") + + def __private_method(self): + print("Private") + + @property + def __doc__(self): + return "Docstring" + + +def __foo_bar__(): # this is not checked by the [bad-dunder-name] rule + ... diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index 366f324511..25b96d7126 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -509,6 +509,9 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.enabled(Rule::SingleStringSlots) { pylint::rules::single_string_slots(checker, class_def); } + if checker.enabled(Rule::BadDunderMethodName) { + pylint::rules::bad_dunder_method_name(checker, body); + } } Stmt::Import(ast::StmtImport { names, range: _ }) => { if checker.enabled(Rule::MultipleImportsOnOneLine) { diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs index f7e3499fc8..d7bb7cf7a5 100644 --- a/crates/ruff/src/codes.rs +++ b/crates/ruff/src/codes.rs @@ -229,6 +229,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { (Pylint, "W1510") => (RuleGroup::Unspecified, rules::pylint::rules::SubprocessRunWithoutCheck), (Pylint, "W1641") => (RuleGroup::Nursery, rules::pylint::rules::EqWithoutHash), (Pylint, "W2901") => (RuleGroup::Unspecified, rules::pylint::rules::RedefinedLoopName), + (Pylint, "W3201") => (RuleGroup::Nursery, rules::pylint::rules::BadDunderMethodName), (Pylint, "W3301") => (RuleGroup::Unspecified, rules::pylint::rules::NestedMinMax), // flake8-async diff --git a/crates/ruff/src/rules/pylint/mod.rs b/crates/ruff/src/rules/pylint/mod.rs index d1dbf89901..7611f18fba 100644 --- a/crates/ruff/src/rules/pylint/mod.rs +++ b/crates/ruff/src/rules/pylint/mod.rs @@ -130,6 +130,7 @@ mod tests { Rule::SubprocessRunWithoutCheck, Path::new("subprocess_run_without_check.py") )] + #[test_case(Rule::BadDunderMethodName, Path::new("bad_dunder_method_name.py"))] fn rules(rule_code: Rule, path: &Path) -> Result<()> { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( diff --git a/crates/ruff/src/rules/pylint/rules/bad_dunder_method_name.rs b/crates/ruff/src/rules/pylint/rules/bad_dunder_method_name.rs new file mode 100644 index 0000000000..3887ab252a --- /dev/null +++ b/crates/ruff/src/rules/pylint/rules/bad_dunder_method_name.rs @@ -0,0 +1,192 @@ +use ruff_diagnostics::{Diagnostic, Violation}; +use ruff_macros::{derive_message_formats, violation}; +use ruff_python_ast::identifier::Identifier; +use ruff_python_ast::Stmt; + +use crate::checkers::ast::Checker; + +/// ## What it does +/// Checks for any misspelled dunder name method and for any method +/// defined with `__...__` that's not one of the pre-defined methods. +/// +/// The pre-defined methods encompass all of Python's standard dunder +/// methods. +/// +/// ## Why is this bad? +/// Misspelled dunder name methods may cause your code to not function +/// as expected. +/// +/// Since dunder methods are associated with customizing the behavior +/// of a class in Python, introducing a dunder method such as `__foo__` +/// that diverges from standard Python dunder methods could potentially +/// confuse someone reading the code. +/// +/// ## Example +/// ```python +/// class Foo: +/// def __init_(self): +/// ... +/// ``` +/// +/// Use instead: +/// ```python +/// class Foo: +/// def __init__(self): +/// ... +/// ``` +#[violation] +pub struct BadDunderMethodName { + name: String, +} + +impl Violation for BadDunderMethodName { + #[derive_message_formats] + fn message(&self) -> String { + let BadDunderMethodName { name } = self; + format!("Bad or misspelled dunder method name `{name}`. (bad-dunder-name)") + } +} + +/// PLW3201 +pub(crate) fn bad_dunder_method_name(checker: &mut Checker, class_body: &[Stmt]) { + for method in class_body + .iter() + .filter_map(ruff_python_ast::Stmt::as_function_def_stmt) + .filter(|method| { + if is_known_dunder_method(&method.name) { + return false; + } + method.name.starts_with('_') && method.name.ends_with('_') + }) + { + checker.diagnostics.push(Diagnostic::new( + BadDunderMethodName { + name: method.name.to_string(), + }, + method.identifier(), + )); + } +} + +/// Returns `true` if a method is a known dunder method. +fn is_known_dunder_method(method: &str) -> bool { + matches!( + method, + "__abs__" + | "__add__" + | "__aenter__" + | "__aexit__" + | "__aiter__" + | "__and__" + | "__anext__" + | "__await__" + | "__bool__" + | "__bytes__" + | "__call__" + | "__ceil__" + | "__class__" + | "__class_getitem__" + | "__complex__" + | "__contains__" + | "__copy__" + | "__deepcopy__" + | "__del__" + | "__delattr__" + | "__delete__" + | "__delitem__" + | "__dict__" + | "__dir__" + | "__divmod__" + | "__doc__" + | "__enter__" + | "__eq__" + | "__exit__" + | "__float__" + | "__floor__" + | "__floordiv__" + | "__format__" + | "__fspath__" + | "__ge__" + | "__get__" + | "__getattr__" + | "__getattribute__" + | "__getitem__" + | "__getnewargs__" + | "__getnewargs_ex__" + | "__getstate__" + | "__gt__" + | "__hash__" + | "__iadd__" + | "__iand__" + | "__ifloordiv__" + | "__ilshift__" + | "__imatmul__" + | "__imod__" + | "__imul__" + | "__init__" + | "__init_subclass__" + | "__instancecheck__" + | "__int__" + | "__invert__" + | "__ior__" + | "__ipow__" + | "__irshift__" + | "__isub__" + | "__iter__" + | "__itruediv__" + | "__ixor__" + | "__le__" + | "__len__" + | "__length_hint__" + | "__lshift__" + | "__lt__" + | "__matmul__" + | "__missing__" + | "__mod__" + | "__module__" + | "__mul__" + | "__ne__" + | "__neg__" + | "__new__" + | "__next__" + | "__or__" + | "__pos__" + | "__post_init__" + | "__pow__" + | "__radd__" + | "__rand__" + | "__rdivmod__" + | "__reduce__" + | "__reduce_ex__" + | "__repr__" + | "__reversed__" + | "__rfloordiv__" + | "__rlshift__" + | "__rmatmul__" + | "__rmod__" + | "__rmul__" + | "__ror__" + | "__round__" + | "__rpow__" + | "__rrshift__" + | "__rshift__" + | "__rsub__" + | "__rtruediv__" + | "__rxor__" + | "__set__" + | "__set_name__" + | "__setattr__" + | "__setitem__" + | "__setstate__" + | "__sizeof__" + | "__str__" + | "__sub__" + | "__subclasscheck__" + | "__subclasses__" + | "__subclasshook__" + | "__truediv__" + | "__trunc__" + | "__weakref__" + | "__xor__" + ) +} diff --git a/crates/ruff/src/rules/pylint/rules/mod.rs b/crates/ruff/src/rules/pylint/rules/mod.rs index c84dd03b3b..a2a498cb87 100644 --- a/crates/ruff/src/rules/pylint/rules/mod.rs +++ b/crates/ruff/src/rules/pylint/rules/mod.rs @@ -1,5 +1,6 @@ pub(crate) use assert_on_string_literal::*; pub(crate) use await_outside_async::*; +pub(crate) use bad_dunder_method_name::*; pub(crate) use bad_str_strip_call::*; pub(crate) use bad_string_format_character::BadStringFormatCharacter; pub(crate) use bad_string_format_type::*; @@ -56,6 +57,7 @@ pub(crate) use yield_in_init::*; mod assert_on_string_literal; mod await_outside_async; +mod bad_dunder_method_name; mod bad_str_strip_call; pub(crate) mod bad_string_format_character; mod bad_string_format_type; diff --git a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW3201_bad_dunder_method_name.py.snap b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW3201_bad_dunder_method_name.py.snap new file mode 100644 index 0000000000..f3c6b81661 --- /dev/null +++ b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLW3201_bad_dunder_method_name.py.snap @@ -0,0 +1,61 @@ +--- +source: crates/ruff/src/rules/pylint/mod.rs +--- +bad_dunder_method_name.py:2:9: PLW3201 Bad or misspelled dunder method name `_init_`. (bad-dunder-name) + | +1 | class Apples: +2 | def _init_(self): # [bad-dunder-name] + | ^^^^^^ PLW3201 +3 | pass + | + +bad_dunder_method_name.py:5:9: PLW3201 Bad or misspelled dunder method name `__hello__`. (bad-dunder-name) + | +3 | pass +4 | +5 | def __hello__(self): # [bad-dunder-name] + | ^^^^^^^^^ PLW3201 +6 | print("hello") + | + +bad_dunder_method_name.py:8:9: PLW3201 Bad or misspelled dunder method name `__init_`. (bad-dunder-name) + | + 6 | print("hello") + 7 | + 8 | def __init_(self): # [bad-dunder-name] + | ^^^^^^^ PLW3201 + 9 | # author likely unintentionally misspelled the correct init dunder. +10 | pass + | + +bad_dunder_method_name.py:12:9: PLW3201 Bad or misspelled dunder method name `_init_`. (bad-dunder-name) + | +10 | pass +11 | +12 | def _init_(self): # [bad-dunder-name] + | ^^^^^^ PLW3201 +13 | # author likely unintentionally misspelled the correct init dunder. +14 | pass + | + +bad_dunder_method_name.py:16:9: PLW3201 Bad or misspelled dunder method name `___neg__`. (bad-dunder-name) + | +14 | pass +15 | +16 | def ___neg__(self): # [bad-dunder-name] + | ^^^^^^^^ PLW3201 +17 | # author likely accidentally added an additional `_` +18 | pass + | + +bad_dunder_method_name.py:20:9: PLW3201 Bad or misspelled dunder method name `__inv__`. (bad-dunder-name) + | +18 | pass +19 | +20 | def __inv__(self): # [bad-dunder-name] + | ^^^^^^^ PLW3201 +21 | # author likely meant to call the invert dunder method +22 | pass + | + + diff --git a/ruff.schema.json b/ruff.schema.json index ac9a08c559..d28a8b49d5 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -2291,6 +2291,7 @@ "PLW290", "PLW2901", "PLW3", + "PLW3201", "PLW33", "PLW330", "PLW3301", From 95dea5c8683cf4a9508b52b07951b9e2db3e0ac7 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 10 Aug 2023 22:28:25 -0400 Subject: [PATCH 069/155] Respect tab width in line-length heuristic (#6491) ## Summary In https://github.com/astral-sh/ruff/pull/5811, I suggested that we add a heuristic to the overlong-lines check such that if the line had fewer bytes than the character limit, we return early -- the idea being that a single byte per character was the "worst case". I overlooked that this isn't true for tabs -- with tabs, the "worst case" scenario is that every byte is a tab, which can have a width greater than 1. Closes https://github.com/astral-sh/ruff/issues/6425. ## Test Plan `cargo test` with a new fixture borrowed from the issue, plus manual testing. --- .../test/fixtures/pycodestyle/E501_2.py | 25 ++-- crates/ruff/src/line_width.rs | 4 +- crates/ruff/src/rules/pycodestyle/helpers.rs | 7 +- crates/ruff/src/rules/pycodestyle/mod.rs | 1 + ...rules__pycodestyle__tests__tab_size_1.snap | 75 +++++------ ...rules__pycodestyle__tests__tab_size_2.snap | 108 ++++++++++----- ...rules__pycodestyle__tests__tab_size_4.snap | 125 +++++++++++------ ...rules__pycodestyle__tests__tab_size_8.snap | 126 ++++++++++++------ 8 files changed, 296 insertions(+), 175 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pycodestyle/E501_2.py b/crates/ruff/resources/test/fixtures/pycodestyle/E501_2.py index 18ea839392..617b3ad7dc 100644 --- a/crates/ruff/resources/test/fixtures/pycodestyle/E501_2.py +++ b/crates/ruff/resources/test/fixtures/pycodestyle/E501_2.py @@ -1,11 +1,16 @@ -a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +# aaaa +# aaaaa + # a + # a + # aa + # aaa + # aaaa + # a + # aa + # aaa -b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - -c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - -d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +if True: # noqa: E501 + [12] + [12 ] + [1,2] + [1, 2] diff --git a/crates/ruff/src/line_width.rs b/crates/ruff/src/line_width.rs index a3db08416c..8c1844185d 100644 --- a/crates/ruff/src/line_width.rs +++ b/crates/ruff/src/line_width.rs @@ -145,10 +145,10 @@ impl PartialOrd for LineWidth { /// The size of a tab. #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, CacheKey)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -pub struct TabSize(pub NonZeroU8); +pub struct TabSize(NonZeroU8); impl TabSize { - fn as_usize(self) -> usize { + pub(crate) fn as_usize(self) -> usize { self.0.get() as usize } } diff --git a/crates/ruff/src/rules/pycodestyle/helpers.rs b/crates/ruff/src/rules/pycodestyle/helpers.rs index 12ae3a0a39..eee48f336e 100644 --- a/crates/ruff/src/rules/pycodestyle/helpers.rs +++ b/crates/ruff/src/rules/pycodestyle/helpers.rs @@ -52,8 +52,11 @@ pub(super) fn is_overlong( task_tags: &[String], tab_size: TabSize, ) -> Option { - // Each character is between 1-4 bytes. If the number of bytes is smaller than the limit, it cannot be overlong. - if line.len() < limit.get() { + // The maximum width of the line is the number of bytes multiplied by the tab size (the + // worst-case scenario is that the line is all tabs). If the maximum width is less than the + // limit, then the line is not overlong. + let max_width = line.len() * tab_size.as_usize(); + if max_width < limit.get() { return None; } diff --git a/crates/ruff/src/rules/pycodestyle/mod.rs b/crates/ruff/src/rules/pycodestyle/mod.rs index 86eb5925c6..95495cbae7 100644 --- a/crates/ruff/src/rules/pycodestyle/mod.rs +++ b/crates/ruff/src/rules/pycodestyle/mod.rs @@ -206,6 +206,7 @@ mod tests { Path::new("pycodestyle/E501_2.py"), &settings::Settings { tab_size: NonZeroU8::new(tab_size).unwrap().into(), + line_length: LineLength::from(6), ..settings::Settings::for_rule(Rule::LineTooLong) }, )?; diff --git a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_1.snap b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_1.snap index 46f4bc8f55..b20cb9ecbf 100644 --- a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_1.snap +++ b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_1.snap @@ -1,56 +1,51 @@ --- source: crates/ruff/src/rules/pycodestyle/mod.rs --- -E501_2.py:1:81: E501 Line too long (89 > 88 characters) +E501_2.py:2:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa + | ^ E501 +3 | # a +4 | # a | -E501_2.py:2:81: E501 Line too long (89 > 88 characters) +E501_2.py:3:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa +3 | # a + | ^ E501 +4 | # a +5 | # aa | -E501_2.py:4:81: E501 Line too long (89 > 88 characters) +E501_2.py:7:7: E501 Line too long (7 > 6 characters) | -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +5 | # aa +6 | # aaa +7 | # aaaa + | ^ E501 +8 | # a +9 | # aa | -E501_2.py:5:81: E501 Line too long (89 > 88 characters) - | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | - -E501_2.py:7:82: E501 Line too long (89 > 88 characters) - | -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | - -E501_2.py:10:82: E501 Line too long (89 > 88 characters) +E501_2.py:10:7: E501 Line too long (7 > 6 characters) | - 8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - 9 | -10 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -11 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" + 8 | # a + 9 | # aa +10 | # aaa + | ^ E501 +11 | +12 | if True: # noqa: E501 + | + +E501_2.py:16:7: E501 Line too long (7 > 6 characters) + | +14 | [12 ] +15 | [1,2] +16 | [1, 2] + | ^ E501 | diff --git a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_2.snap b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_2.snap index 46f4bc8f55..e2f7159f9c 100644 --- a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_2.snap +++ b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_2.snap @@ -1,56 +1,90 @@ --- source: crates/ruff/src/rules/pycodestyle/mod.rs --- -E501_2.py:1:81: E501 Line too long (89 > 88 characters) +E501_2.py:2:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa + | ^ E501 +3 | # a +4 | # a | -E501_2.py:2:81: E501 Line too long (89 > 88 characters) +E501_2.py:3:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa +3 | # a + | ^ E501 +4 | # a +5 | # aa | -E501_2.py:4:81: E501 Line too long (89 > 88 characters) +E501_2.py:6:6: E501 Line too long (7 > 6 characters) | -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +4 | # a +5 | # aa +6 | # aaa + | ^ E501 +7 | # aaaa +8 | # a | -E501_2.py:5:81: E501 Line too long (89 > 88 characters) +E501_2.py:7:6: E501 Line too long (8 > 6 characters) | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +5 | # aa +6 | # aaa +7 | # aaaa + | ^^ E501 +8 | # a +9 | # aa | -E501_2.py:7:82: E501 Line too long (89 > 88 characters) - | -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | - -E501_2.py:10:82: E501 Line too long (89 > 88 characters) +E501_2.py:8:5: E501 Line too long (7 > 6 characters) | - 8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - 9 | -10 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -11 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" + 6 | # aaa + 7 | # aaaa + 8 | # a + | ^ E501 + 9 | # aa +10 | # aaa + | + +E501_2.py:9:5: E501 Line too long (8 > 6 characters) + | + 7 | # aaaa + 8 | # a + 9 | # aa + | ^^ E501 +10 | # aaa + | + +E501_2.py:10:5: E501 Line too long (9 > 6 characters) + | + 8 | # a + 9 | # aa +10 | # aaa + | ^^^ E501 +11 | +12 | if True: # noqa: E501 + | + +E501_2.py:14:6: E501 Line too long (7 > 6 characters) + | +12 | if True: # noqa: E501 +13 | [12] +14 | [12 ] + | ^ E501 +15 | [1,2] +16 | [1, 2] + | + +E501_2.py:16:6: E501 Line too long (8 > 6 characters) + | +14 | [12 ] +15 | [1,2] +16 | [1, 2] + | ^^ E501 | diff --git a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_4.snap b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_4.snap index dc40a96154..3fd272e5d0 100644 --- a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_4.snap +++ b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_4.snap @@ -1,65 +1,110 @@ --- source: crates/ruff/src/rules/pycodestyle/mod.rs --- -E501_2.py:1:81: E501 Line too long (89 > 88 characters) +E501_2.py:2:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa + | ^ E501 +3 | # a +4 | # a | -E501_2.py:2:77: E501 Line too long (93 > 88 characters) +E501_2.py:3:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^^^^^ E501 -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa +3 | # a + | ^ E501 +4 | # a +5 | # aa | -E501_2.py:4:81: E501 Line too long (89 > 88 characters) +E501_2.py:4:4: E501 Line too long (7 > 6 characters) | -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +2 | # aaaaa +3 | # a +4 | # a + | ^ E501 +5 | # aa +6 | # aaa | -E501_2.py:5:77: E501 Line too long (93 > 88 characters) +E501_2.py:5:4: E501 Line too long (8 > 6 characters) | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^^^^^ E501 -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +3 | # a +4 | # a +5 | # aa + | ^^ E501 +6 | # aaa +7 | # aaaa | -E501_2.py:7:82: E501 Line too long (89 > 88 characters) +E501_2.py:6:4: E501 Line too long (9 > 6 characters) | -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +4 | # a +5 | # aa +6 | # aaa + | ^^^ E501 +7 | # aaaa +8 | # a | -E501_2.py:8:78: E501 Line too long (89 > 88 characters) +E501_2.py:7:4: E501 Line too long (10 > 6 characters) + | +5 | # aa +6 | # aaa +7 | # aaaa + | ^^^^ E501 +8 | # a +9 | # aa + | + +E501_2.py:8:3: E501 Line too long (11 > 6 characters) | - 7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - 8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 - 9 | -10 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" + 6 | # aaa + 7 | # aaaa + 8 | # a + | ^^^ E501 + 9 | # aa +10 | # aaa | -E501_2.py:10:82: E501 Line too long (89 > 88 characters) +E501_2.py:9:3: E501 Line too long (12 > 6 characters) | - 8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - 9 | -10 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -11 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" + 7 | # aaaa + 8 | # a + 9 | # aa + | ^^^^ E501 +10 | # aaa + | + +E501_2.py:10:3: E501 Line too long (13 > 6 characters) + | + 8 | # a + 9 | # aa +10 | # aaa + | ^^^^^ E501 +11 | +12 | if True: # noqa: E501 + | + +E501_2.py:14:4: E501 Line too long (9 > 6 characters) + | +12 | if True: # noqa: E501 +13 | [12] +14 | [12 ] + | ^^^ E501 +15 | [1,2] +16 | [1, 2] + | + +E501_2.py:16:4: E501 Line too long (10 > 6 characters) + | +14 | [12 ] +15 | [1,2] +16 | [1, 2] + | ^^^^ E501 | diff --git a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_8.snap b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_8.snap index bce5eac6e3..7b2dd3f8f9 100644 --- a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_8.snap +++ b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__tab_size_8.snap @@ -1,72 +1,110 @@ --- source: crates/ruff/src/rules/pycodestyle/mod.rs --- -E501_2.py:1:81: E501 Line too long (89 > 88 characters) +E501_2.py:2:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa + | ^ E501 +3 | # a +4 | # a | -E501_2.py:2:70: E501 Line too long (101 > 88 characters) +E501_2.py:3:7: E501 Line too long (7 > 6 characters) | -1 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^^^^^^^^^^^^^ E501 -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +1 | # aaaa +2 | # aaaaa +3 | # a + | ^ E501 +4 | # a +5 | # aa | -E501_2.py:4:81: E501 Line too long (89 > 88 characters) +E501_2.py:4:2: E501 Line too long (11 > 6 characters) | -2 | a = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -3 | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +2 | # aaaaa +3 | # a +4 | # a + | ^^^ E501 +5 | # aa +6 | # aaa | -E501_2.py:5:70: E501 Line too long (101 > 88 characters) +E501_2.py:5:2: E501 Line too long (12 > 6 characters) | -4 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^^^^^^^^^^^^^ E501 -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +3 | # a +4 | # a +5 | # aa + | ^^^^ E501 +6 | # aaa +7 | # aaaa | -E501_2.py:7:82: E501 Line too long (89 > 88 characters) +E501_2.py:6:2: E501 Line too long (13 > 6 characters) | -5 | b = """ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -6 | -7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" +4 | # a +5 | # aa +6 | # aaa + | ^^^^^ E501 +7 | # aaaa +8 | # a | -E501_2.py:8:71: E501 Line too long (97 > 88 characters) +E501_2.py:7:2: E501 Line too long (14 > 6 characters) + | +5 | # aa +6 | # aaa +7 | # aaaa + | ^^^^^^ E501 +8 | # a +9 | # aa + | + +E501_2.py:8:2: E501 Line too long (19 > 6 characters) | - 7 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - 8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^^^^^^^^ E501 - 9 | -10 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" + 6 | # aaa + 7 | # aaaa + 8 | # a + | ^^^^^^^ E501 + 9 | # aa +10 | # aaa | -E501_2.py:10:82: E501 Line too long (89 > 88 characters) +E501_2.py:9:2: E501 Line too long (20 > 6 characters) | - 8 | c = """2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - 9 | -10 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 -11 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" + 7 | # aaaa + 8 | # a + 9 | # aa + | ^^^^^^^^ E501 +10 | # aaa | -E501_2.py:11:70: E501 Line too long (89 > 88 characters) +E501_2.py:10:2: E501 Line too long (21 > 6 characters) | -10 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" -11 | d = """💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A67ß9💣2ℝ4A6""" - | ^ E501 + 8 | # a + 9 | # aa +10 | # aaa + | ^^^^^^^^^ E501 +11 | +12 | if True: # noqa: E501 + | + +E501_2.py:14:2: E501 Line too long (13 > 6 characters) + | +12 | if True: # noqa: E501 +13 | [12] +14 | [12 ] + | ^^^^^ E501 +15 | [1,2] +16 | [1, 2] + | + +E501_2.py:16:2: E501 Line too long (14 > 6 characters) + | +14 | [12 ] +15 | [1,2] +16 | [1, 2] + | ^^^^^^ E501 | From 563374503fa5a41f1560eb1e8bdf27c1043cc2d2 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 10 Aug 2023 22:31:09 -0400 Subject: [PATCH 070/155] Enable short URLs in the playground (#6383) ## Summary This PR adds a [Workers KV](https://developers.cloudflare.com/workers/runtime-apis/kv/)-based database to the playground, which enables us to associate shared snippets with a stable ID, which in turn allows us to generate short URLs, rather than our existing extremely-long URLs. For now, the URLs are based on UUID, so they look like https://play.ruff.rs/a1c40d58-f643-4a3e-bc23-15021e16acef. (This URL isn't expected to work, as the playground isn't deployed; it's only included as an example.) There are no visible changes in the UI here -- you still click the "Share" button, which copies the link to your URL. There's no user-visible latency either -- KV is very fast. For context, with Workers KV, we provision a Workers KV store in our Cloudflare account (`wrangler kv:namespace create "PLAYGROUND"`), and then create a Cloudflare Worker that's bound to the KV store via the `wrangler.toml`: ```toml name = "db" main = "src/index.ts" compatibility_date = "2023-08-07" kv_namespaces = [ { binding = "PLAYGROUND", id = "672e16c4fb5e4887845973bf0e9f6021", preview_id = "0a96477e116540e5a6e1eab6d6e7523e" } ] ``` The KV store exists in perpetuity, while the Worker can be updated, deployed, removed, etc. independently of the KV store. The Worker itself has unfettered access to the KV store. The Worker is exposed publicly, and just does some basic verification against the request host. --- playground/README.md | 27 +- playground/api/.dev.vars | 2 + playground/api/README.md | 5 + playground/api/package-lock.json | 2369 +++++++++++++++++++++++++++++ playground/api/package.json | 20 + playground/api/src/index.ts | 91 ++ playground/api/tsconfig.json | 105 ++ playground/api/wrangler.toml | 7 + playground/package-lock.json | 2 +- playground/package.json | 2 +- playground/src/Editor/Editor.tsx | 15 +- playground/src/Editor/api.ts | 33 + playground/src/Editor/settings.ts | 45 +- 13 files changed, 2693 insertions(+), 30 deletions(-) create mode 100644 playground/api/.dev.vars create mode 100644 playground/api/README.md create mode 100644 playground/api/package-lock.json create mode 100644 playground/api/package.json create mode 100644 playground/api/src/index.ts create mode 100644 playground/api/tsconfig.json create mode 100644 playground/api/wrangler.toml create mode 100644 playground/src/Editor/api.ts diff --git a/playground/README.md b/playground/README.md index 83d302fa8a..4be032034f 100644 --- a/playground/README.md +++ b/playground/README.md @@ -4,11 +4,26 @@ In-browser playground for Ruff. Available [https://play.ruff.rs/](https://play.r ## Getting started -- To build the WASM module, run `npm run build:wasm` - from the `./playground` directory. -- Install TypeScript dependencies with: `npm install`. -- Start the development server with: `npm run dev`. +First, build the WASM module by running `npm run build:wasm` from the `./playground` directory. -## Implementation +Then, install TypeScript dependencies with `npm install`, and run the development server with +`npm run dev`. -Design based on [Tailwind Play](https://play.tailwindcss.com/). Themed with [`ayu`](https://github.com/dempfi/ayu). +To run the datastore, which is based on [Workers KV](https://developers.cloudflare.com/workers/runtime-apis/kv/), +install the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/), +then run `npx wrangler dev --local` from the `./playground/db` directory. Note that the datastore is +only required to generate shareable URLs for code snippets. The development datastore does not +require Cloudflare authentication or login, but in turn only persists data locally. + +## Architecture + +The playground is implemented as a single-page React application powered by +[Vite](https://vitejs.dev/), with the editor experience itself powered by +[Monaco](https://github.com/microsoft/monaco-editor). + +The playground stores state in `localStorage`, but can supports persisting code snippets to +a persistent datastore based on [Workers KV](https://developers.cloudflare.com/workers/runtime-apis/kv/) +and exposed via a [Cloudflare Worker](https://developers.cloudflare.com/workers/learning/how-workers-works/). + +The playground design is originally based on [Tailwind Play](https://play.tailwindcss.com/), with +additional inspiration from the [Rome Tools Playground](https://docs.rome.tools/playground/). diff --git a/playground/api/.dev.vars b/playground/api/.dev.vars new file mode 100644 index 0000000000..e9d4d6b874 --- /dev/null +++ b/playground/api/.dev.vars @@ -0,0 +1,2 @@ +# See: https://developers.cloudflare.com/workers/wrangler/configuration/#environmental-variables +DEV=1 diff --git a/playground/api/README.md b/playground/api/README.md new file mode 100644 index 0000000000..6e3535e33d --- /dev/null +++ b/playground/api/README.md @@ -0,0 +1,5 @@ +# api + +Key-value store based on [Workers KV](https://developers.cloudflare.com/workers/runtime-apis/kv/). + +Used to persist code snippets in the playground and generate shareable URLs. diff --git a/playground/api/package-lock.json b/playground/api/package-lock.json new file mode 100644 index 0000000000..ee9aa442de --- /dev/null +++ b/playground/api/package-lock.json @@ -0,0 +1,2369 @@ +{ + "name": "api", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "api", + "version": "0.0.0", + "dependencies": { + "@miniflare/kv": "^2.14.0", + "@miniflare/storage-memory": "^2.14.0", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20230801.0", + "miniflare": "^3.20230801.1", + "typescript": "^5.1.6", + "wrangler": "2.0.27" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", + "integrity": "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==", + "dev": true, + "dependencies": { + "mime": "^3.0.0" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20230801.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20230801.0.tgz", + "integrity": "sha512-f/HaLoQzw0qusw+MXxc4mheFCERj64iJ74EK7klms+Ruv4lGYN2PqoUMAQ8Vq5RqXb/B3nfg3+DUmSP7nbc0Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20230801.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20230801.0.tgz", + "integrity": "sha512-VgfBuT43uN+WOQjVfu96lKcmydQtB08AGG3CxtTLDbbJ36kRUq9lLu2lwhu67GS3264xq2cQngeSx+s6pObHKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20230801.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20230801.0.tgz", + "integrity": "sha512-DVlac5QhxhpmPFC9m4Ztg7La6g5R9uB4dg4C6+8cTckUtAfkXEwO7GIAvsfsumIP6XVOGg58qf/bCzqmJVN62g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20230801.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20230801.0.tgz", + "integrity": "sha512-jbF4sK5x9+w4ovaycfXyOtxe6IK2m0c33hxjmsMYDPGCWfWs6ZOacgFjGwnGG0HirYBv1cglJVMFsnCHoWI4mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20230801.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20230801.0.tgz", + "integrity": "sha512-qTn6cyFUmz3zr0Vr+Y3p2UXdUAV6CB76kD28S+yIqW5nzZYSH5islASeMD9d1NdXhdd1kaAs1t2+1OkGxBP8aw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workers-types": { + "version": "4.20230801.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230801.0.tgz", + "integrity": "sha512-RzRUR+J/T3h58qbTZHYntYsnZXu3JnrlZIhqP2hhdyfoZAZ/+ko4wX0foAqlYHi+kXWaWtySHBuMcx6ec6TXlQ==", + "dev": true + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz", + "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz", + "integrity": "sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@miniflare/cache": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/cache/-/cache-2.14.0.tgz", + "integrity": "sha512-0mz0OCzTegiX75uMURLJpDo3DaOCSx9M0gv7NMFWDbK/XrvjoENiBZiKu98UBM5fts0qtK19a+MfB4aT0uBCFg==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0", + "http-cache-semantics": "^4.1.0", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/cache/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/@miniflare/cli-parser": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.14.0.tgz", + "integrity": "sha512-6Wb0jTMqwI7GRGAhz9WOF8AONUsXXPmwu+Qhg+tnRWtQpJ3DYd5dku1N04L9L1R7np/mD8RrycLyCdg3hLZ3aA==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.14.0", + "kleur": "^4.1.4" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/core": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.14.0.tgz", + "integrity": "sha512-BjmV/ZDwsKvXnJntYHt3AQgzVKp/5ZzWPpYWoOnUSNxq6nnRCQyvFvjvBZKnhubcmJCLSqegvz0yHejMA90CTA==", + "dev": true, + "dependencies": { + "@iarna/toml": "^2.2.5", + "@miniflare/queues": "2.14.0", + "@miniflare/shared": "2.14.0", + "@miniflare/watcher": "2.14.0", + "busboy": "^1.6.0", + "dotenv": "^10.0.0", + "kleur": "^4.1.4", + "set-cookie-parser": "^2.4.8", + "undici": "5.20.0", + "urlpattern-polyfill": "^4.0.3" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/core/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/@miniflare/d1": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.14.0.tgz", + "integrity": "sha512-9YoeLAkZuWGAu9BMsoctHoMue0xHzJYZigAJWGvWrqSFT1gBaT+RlUefQCHXggi8P7sOJ1+BKlsWAhkB5wfMWQ==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0" + }, + "engines": { + "node": ">=16.7" + } + }, + "node_modules/@miniflare/durable-objects": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.14.0.tgz", + "integrity": "sha512-P8eh1P62BPGpj+MCb1i1lj7Tlt/G3BMmnxHp9duyb0Wro/ILVGPQskZl+iq7DHq1w3C+n0+6/E1B44ff+qn0Mw==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0", + "@miniflare/storage-memory": "2.14.0", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/durable-objects/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/@miniflare/html-rewriter": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.14.0.tgz", + "integrity": "sha512-7CJZk3xZkxK8tGNofnhgWcChZ8YLx6MhAdN2nn6ONSXrK/TevzEKdL8bnVv1OJ6J8Y23OxvfinOhufr33tMS8g==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0", + "html-rewriter-wasm": "^0.4.1", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/html-rewriter/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/@miniflare/http-server": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.14.0.tgz", + "integrity": "sha512-APaBlvGRAW+W18ph5ruPXX26/iKdByPz1tZH1OjPAKBDAiKFZSGek4QzUmQALBWLx5VMTMrt7QIe7KE4nM4sdw==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0", + "@miniflare/web-sockets": "2.14.0", + "kleur": "^4.1.4", + "selfsigned": "^2.0.0", + "undici": "5.20.0", + "ws": "^8.2.2", + "youch": "^2.2.2" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/http-server/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@miniflare/http-server/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/@miniflare/http-server/node_modules/youch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-2.2.2.tgz", + "integrity": "sha512-/FaCeG3GkuJwaMR34GHVg0l8jCbafZLHiFowSjqLlqhC6OMyf2tPJBu8UirF7/NI9X/R5ai4QfEKUCOxMAGxZQ==", + "dev": true, + "dependencies": { + "@types/stack-trace": "0.0.29", + "cookie": "^0.4.1", + "mustache": "^4.2.0", + "stack-trace": "0.0.10" + } + }, + "node_modules/@miniflare/kv": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.14.0.tgz", + "integrity": "sha512-FHAnVjmhV/VHxgjNf2whraz+k7kfMKlfM+5gO8WT6HrOsWxSdx8OueWVScnOuuDkSeUg5Ctrf5SuztTV8Uy1cg==", + "dependencies": { + "@miniflare/shared": "2.14.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/queues": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/queues/-/queues-2.14.0.tgz", + "integrity": "sha512-flS4MqlgBKyv6QBqKD0IofjmMDW9wP1prUNQy2wWPih9lA6bFKmml3VdFeDsPnWtE2J67K0vCTf5kj1Q0qdW1w==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.14.0" + }, + "engines": { + "node": ">=16.7" + } + }, + "node_modules/@miniflare/r2": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/r2/-/r2-2.14.0.tgz", + "integrity": "sha512-+WJJP4J0QzY69HPrG6g5OyW23lJ02WHpHZirCxwPSz8CajooqZCJVx+qvUcNmU8MyKASbUZMWnH79LysuBh+jA==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/r2/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/@miniflare/runner-vm": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.14.0.tgz", + "integrity": "sha512-01CmNzv74u0RZgT/vjV/ggDzECXTG88ZJAKhXyhAx0s2DOLIXzsGHn6pUJIsfPCrtj8nfqtTCp1Vf0UMVWSpmw==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.14.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/scheduler": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.14.0.tgz", + "integrity": "sha512-/D28OeY/HxcOyY0rkPc2qU/wzxCcUv3/F7NRpgDix37sMkYjAAS51ehVIAkPwAdFEMdantcyVuHNQ2kO1xbT+Q==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0", + "cron-schedule": "^3.0.4" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/shared": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/shared/-/shared-2.14.0.tgz", + "integrity": "sha512-O0jAEdMkp8BzrdFCfMWZu76h4Cq+tt3/oDtcTFgzum3fRW5vUhIi/5f6bfndu6rkGbSlzxwor8CJWpzityXGug==", + "dependencies": { + "@types/better-sqlite3": "^7.6.0", + "kleur": "^4.1.4", + "npx-import": "^1.1.4", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/sites": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/sites/-/sites-2.14.0.tgz", + "integrity": "sha512-qI8MFZpD1NV+g+HQ/qheDVwscKzwG58J+kAVTU/1fgub2lMLsxhE3Mmbi5AIpyIiJ7Q5Sezqga234CEkHkS7dA==", + "dev": true, + "dependencies": { + "@miniflare/kv": "2.14.0", + "@miniflare/shared": "2.14.0", + "@miniflare/storage-file": "2.14.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/storage-file": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.14.0.tgz", + "integrity": "sha512-Ps0wHhTO+ie33a58efI0p/ppFXSjlbYmykQXfYtMeVLD60CKl+4Lxor0+gD6uYDFbhMWL5/GMDvyr4AM87FA+Q==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.14.0", + "@miniflare/storage-memory": "2.14.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/storage-memory": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.14.0.tgz", + "integrity": "sha512-5aFjEiTSNrHJ+iAiGMCA/TVPnNMrnokG5r0vKrwj4knbf8pisgfP04x18zCgOlG7kaIWNmqdO/vtVT5BIioiSQ==", + "dependencies": { + "@miniflare/shared": "2.14.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/watcher": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.14.0.tgz", + "integrity": "sha512-O8Abg2eHpGmcZb8WyUaA6Av1Mqt5bSrorzz4CrWwsvJHBdekZPIX0GihC9vn327d/1pKRs81YTiSAfBoSZpVIw==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.14.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/web-sockets": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.14.0.tgz", + "integrity": "sha512-lB1CB4rBq0mbCuh55WgIEH4L3c4/i4MNDBfrQL+6r+wGcr/BJUqF8BHpsfAt5yHWUJVtK5mlMeesS/xpg4Ao1w==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.14.0", + "@miniflare/shared": "2.14.0", + "undici": "5.20.0", + "ws": "^8.2.2" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/web-sockets/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.4.tgz", + "integrity": "sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.4.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.8.tgz", + "integrity": "sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==" + }, + "node_modules/@types/stack-trace": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz", + "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-sqlite3": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.5.0.tgz", + "integrity": "sha512-vbPcv/Hx5WYdyNg/NbcfyaBZyv9s/NVbxb7yCeC5Bq1pVocNxeL2tZmSu3Rlm4IEOTjYdGyzWQgyx0OSdORBzw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/capnp-ts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", + "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + "dev": true, + "dependencies": { + "debug": "^4.3.1", + "tslib": "^2.2.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cron-schedule": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cron-schedule/-/cron-schedule-3.0.6.tgz", + "integrity": "sha512-izfGgKyzzIyLaeb1EtZ3KbglkS6AKp9cv7LxmiyoOu+fXfol1tQDC0Cof0enVZGNtudTHW+3lfuW9ZkLQss4Wg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.51.tgz", + "integrity": "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.51", + "esbuild-android-arm64": "0.14.51", + "esbuild-darwin-64": "0.14.51", + "esbuild-darwin-arm64": "0.14.51", + "esbuild-freebsd-64": "0.14.51", + "esbuild-freebsd-arm64": "0.14.51", + "esbuild-linux-32": "0.14.51", + "esbuild-linux-64": "0.14.51", + "esbuild-linux-arm": "0.14.51", + "esbuild-linux-arm64": "0.14.51", + "esbuild-linux-mips64le": "0.14.51", + "esbuild-linux-ppc64le": "0.14.51", + "esbuild-linux-riscv64": "0.14.51", + "esbuild-linux-s390x": "0.14.51", + "esbuild-netbsd-64": "0.14.51", + "esbuild-openbsd-64": "0.14.51", + "esbuild-sunos-64": "0.14.51", + "esbuild-windows-32": "0.14.51", + "esbuild-windows-64": "0.14.51", + "esbuild-windows-arm64": "0.14.51" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz", + "integrity": "sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz", + "integrity": "sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz", + "integrity": "sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz", + "integrity": "sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz", + "integrity": "sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz", + "integrity": "sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz", + "integrity": "sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz", + "integrity": "sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz", + "integrity": "sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz", + "integrity": "sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz", + "integrity": "sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz", + "integrity": "sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz", + "integrity": "sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz", + "integrity": "sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz", + "integrity": "sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz", + "integrity": "sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz", + "integrity": "sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz", + "integrity": "sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz", + "integrity": "sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz", + "integrity": "sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/get-source/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/html-rewriter-wasm": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/html-rewriter-wasm/-/html-rewriter-wasm-0.4.1.tgz", + "integrity": "sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/miniflare": { + "version": "3.20230801.1", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20230801.1.tgz", + "integrity": "sha512-4vdA2X2Bo2q4hIKN0QJp1dtiGmu4+tlxo14d89aHCWH5N6yl5tQtqJhkLJFxUX8wkNAgSUOHDYeTnhJ51X6tsQ==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "better-sqlite3": "^8.1.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "http-cache-semantics": "^4.1.0", + "kleur": "^4.1.5", + "set-cookie-parser": "^2.6.0", + "source-map-support": "0.5.21", + "stoppable": "^1.1.0", + "undici": "^5.13.0", + "workerd": "1.20230801.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.4.tgz", + "integrity": "sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==", + "dependencies": { + "execa": "^6.1.0", + "parse-package-name": "^1.0.0", + "semver": "^7.3.7", + "validate-npm-package-name": "^4.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-package-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semiver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", + "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-4.0.3.tgz", + "integrity": "sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerd": { + "version": "1.20230801.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20230801.0.tgz", + "integrity": "sha512-4PjyPTbDy39JTpvF3VB95DyQeEGJa8qZsxeal/6L3FBULQ+d90N99lTpgONNkZIRRbOz6ZQk5nDC2wr4TmA3wA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20230801.0", + "@cloudflare/workerd-darwin-arm64": "1.20230801.0", + "@cloudflare/workerd-linux-64": "1.20230801.0", + "@cloudflare/workerd-linux-arm64": "1.20230801.0", + "@cloudflare/workerd-windows-64": "1.20230801.0" + } + }, + "node_modules/wrangler": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-2.0.27.tgz", + "integrity": "sha512-dH0Nv41OiFsHu+mZFMGv1kEO6lOEoxon8kKHToG0YSpGBsObsxurkoyWJDvkAgtnrM00QF8F1Chy15zs0sjJkg==", + "dev": true, + "dependencies": { + "@cloudflare/kv-asset-handler": "^0.2.0", + "@esbuild-plugins/node-globals-polyfill": "^0.1.1", + "@esbuild-plugins/node-modules-polyfill": "^0.1.4", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.14.51", + "miniflare": "^2.6.0", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "selfsigned": "^2.0.1", + "source-map": "^0.7.4", + "xxhash-wasm": "^1.0.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.7.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/wrangler/node_modules/miniflare": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-2.14.0.tgz", + "integrity": "sha512-xBOUccq1dm5riOfaqoMWCC1uCqT71EW0x4akQQuGYgm+Q44N1ETEmzXSbFVroJgOHe8Hwpqxo2D7OOFwqFevew==", + "dev": true, + "dependencies": { + "@miniflare/cache": "2.14.0", + "@miniflare/cli-parser": "2.14.0", + "@miniflare/core": "2.14.0", + "@miniflare/d1": "2.14.0", + "@miniflare/durable-objects": "2.14.0", + "@miniflare/html-rewriter": "2.14.0", + "@miniflare/http-server": "2.14.0", + "@miniflare/kv": "2.14.0", + "@miniflare/queues": "2.14.0", + "@miniflare/r2": "2.14.0", + "@miniflare/runner-vm": "2.14.0", + "@miniflare/scheduler": "2.14.0", + "@miniflare/shared": "2.14.0", + "@miniflare/sites": "2.14.0", + "@miniflare/storage-file": "2.14.0", + "@miniflare/storage-memory": "2.14.0", + "@miniflare/web-sockets": "2.14.0", + "kleur": "^4.1.4", + "semiver": "^1.1.0", + "source-map-support": "^0.5.20", + "undici": "5.20.0" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "@miniflare/storage-redis": "2.14.0", + "cron-schedule": "^3.0.4", + "ioredis": "^4.27.9" + }, + "peerDependenciesMeta": { + "@miniflare/storage-redis": { + "optional": true + }, + "cron-schedule": { + "optional": true + }, + "ioredis": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/youch": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.3.tgz", + "integrity": "sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/playground/api/package.json b/playground/api/package.json new file mode 100644 index 0000000000..278cebe54f --- /dev/null +++ b/playground/api/package.json @@ -0,0 +1,20 @@ +{ + "name": "api", + "version": "0.0.0", + "devDependencies": { + "@cloudflare/workers-types": "^4.20230801.0", + "miniflare": "^3.20230801.1", + "typescript": "^5.1.6", + "wrangler": "2.0.27" + }, + "private": true, + "scripts": { + "start": "wrangler dev", + "deploy": "wrangler publish" + }, + "dependencies": { + "@miniflare/kv": "^2.14.0", + "@miniflare/storage-memory": "^2.14.0", + "uuid": "^9.0.0" + } +} diff --git a/playground/api/src/index.ts b/playground/api/src/index.ts new file mode 100644 index 0000000000..2fbd4eaebf --- /dev/null +++ b/playground/api/src/index.ts @@ -0,0 +1,91 @@ +/** + * A Workers KV-based database for storing shareable code snippets in the Playground. + */ + +export interface Env { + // The Workers KV namespace to use for storing code snippets. + PLAYGROUND: KVNamespace; + // Whether or not we're in a development environment. + DEV?: boolean; +} + +// See: https://developers.cloudflare.com/workers/examples/security-headers/ +const DEFAULT_HEADERS = { + "Permissions-Policy": "interest-cohort=()", + "X-XSS-Protection": "0", + "X-Frame-Options": "DENY", + "X-Content-Type-Options": "nosniff", + "Referrer-Policy": "strict-origin-when-cross-origin", + "Cross-Origin-Embedder-Policy": 'require-corp; report-to="default";', + "Cross-Origin-Opener-Policy": 'same-site; report-to="default";', + "Cross-Origin-Resource-Policy": "same-site", +}; + +const DEVELOPMENT_HEADERS = { + ...DEFAULT_HEADERS, + "Access-Control-Allow-Origin": "*", +}; + +const PRODUCTION_HEADERS = { + ...DEFAULT_HEADERS, + "Access-Control-Allow-Origin": "https://play.ruff.rs", +}; + +export default { + async fetch( + request: Request, + env: Env, + ctx: ExecutionContext, + ): Promise { + const { DEV, PLAYGROUND } = env; + + const headers = DEV ? DEVELOPMENT_HEADERS : PRODUCTION_HEADERS; + + switch (request.method) { + case "GET": { + // Ex) `https://api.astral-1ad.workers.dev/` + // Given an ID, return the corresponding playground. + const { pathname } = new URL(request.url); + const key = pathname.slice(1); + if (!key) { + return new Response("Not Found", { + status: 404, + headers, + }); + } + + const playground = await PLAYGROUND.get(key); + if (playground === null) { + return new Response("Not Found", { + status: 404, + headers, + }); + } + + return new Response(playground, { + status: 200, + headers, + }); + } + + // Ex) `https://api.astral-1ad.workers.dev` + // Given a playground, save it and return its ID. + case "POST": { + const id = crypto.randomUUID(); + const playground = await request.text(); + await PLAYGROUND.put(id, playground); + return new Response(id, { + status: 200, + headers, + }); + } + + default: { + return new Response("Method Not Allowed", { + status: 405, + headers, + }); + } + } + }, +}; diff --git a/playground/api/tsconfig.json b/playground/api/tsconfig.json new file mode 100644 index 0000000000..39e27fb57f --- /dev/null +++ b/playground/api/tsconfig.json @@ -0,0 +1,105 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": [ + "es2021" + ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "es2022" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": [ + "@cloudflare/workers-types" + ] /* Specify type package names to be included without being referenced in a source file. */, + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "resolveJsonModule": true /* Enable importing .json files */, + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */, + "checkJs": false /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true /* Disable emitting files from a compilation. */, + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/playground/api/wrangler.toml b/playground/api/wrangler.toml new file mode 100644 index 0000000000..0b51a9a2a2 --- /dev/null +++ b/playground/api/wrangler.toml @@ -0,0 +1,7 @@ +name = "api" +main = "src/index.ts" +compatibility_date = "2023-08-07" + +kv_namespaces = [ + { binding = "PLAYGROUND", id = "672e16c4fb5e4887845973bf0e9f6021", preview_id = "0a96477e116540e5a6e1eab6d6e7523e" } +] diff --git a/playground/package-lock.json b/playground/package-lock.json index 80222151a8..bc44767abf 100644 --- a/playground/package-lock.json +++ b/playground/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@monaco-editor/react": "^4.4.6", "classnames": "^2.3.2", - "lz-string": "^1.4.4", + "lz-string": "^1.5.0", "monaco-editor": "^0.40.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/playground/package.json b/playground/package.json index 82d08904b6..78b108f4e9 100644 --- a/playground/package.json +++ b/playground/package.json @@ -17,7 +17,7 @@ "dependencies": { "@monaco-editor/react": "^4.4.6", "classnames": "^2.3.2", - "lz-string": "^1.4.4", + "lz-string": "^1.5.0", "monaco-editor": "^0.40.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/playground/src/Editor/Editor.tsx b/playground/src/Editor/Editor.tsx index 7b3e12dd90..a8b03bcfc6 100644 --- a/playground/src/Editor/Editor.tsx +++ b/playground/src/Editor/Editor.tsx @@ -66,7 +66,7 @@ export default function Editor() { const initialized = ruffVersion != null; - // Ideally this would be retrieved right from the URl... but routing without a proper + // Ideally this would be retrieved right from the URL... but routing without a proper // router is hard (there's no location changed event) and pulling in a router // feels overkill. const handleSecondaryToolSelected = (tool: SecondaryTool | null) => { @@ -88,8 +88,10 @@ export default function Editor() { }; useEffect(() => { - init().then(() => { - const [settingsSource, pythonSource] = restore() ?? [ + async function initAsync() { + await init(); + const response = await restore(); + const [settingsSource, pythonSource] = response ?? [ stringify(Workspace.defaultSettings()), DEFAULT_PYTHON_SOURCE, ]; @@ -100,7 +102,8 @@ export default function Editor() { settingsSource, }); setRuffVersion(Workspace.version()); - }); + } + initAsync().catch(console.error); }, []); const deferredSource = useDeferredValue(source); @@ -182,7 +185,7 @@ export default function Editor() { } return () => { - persist(source.settingsSource, source.pythonSource); + return persist(source.settingsSource, source.pythonSource); }; }, [source, initialized]); @@ -202,8 +205,6 @@ export default function Editor() { })); }, []); - // useMonacoTheme(); - return (
{ + const response = await fetch(`${API_URL}/${encodeURIComponent(id)}`); + if (!response.ok) { + throw new Error(`Failed to fetch playground ${id}: ${response.status}`); + } + return await response.json(); +} + +/** + * Save a playground and return its ID. + */ +export async function savePlayground(playground: Playground): Promise { + const response = await fetch(API_URL, { + method: "POST", + body: JSON.stringify(playground), + }); + if (!response.ok) { + throw new Error(`Failed to save playground: ${response.status}`); + } + return await response.text(); +} diff --git a/playground/src/Editor/settings.ts b/playground/src/Editor/settings.ts index 34e447eee3..411399da5d 100644 --- a/playground/src/Editor/settings.ts +++ b/playground/src/Editor/settings.ts @@ -1,4 +1,5 @@ import lzstring from "lz-string"; +import { fetchPlayground, savePlayground } from "./api"; export type Settings = { [K: string]: any }; @@ -22,29 +23,43 @@ export function stringify(settings: Settings): string { /** * Persist the configuration to a URL. */ -export async function persist(settingsSource: string, pythonSource: string) { - const hash = lzstring.compressToEncodedURIComponent( - settingsSource.replaceAll("$$$", "$$$$$$") + "$$$" + pythonSource, - ); - await navigator.clipboard.writeText( - window.location.href.split("#")[0] + "#" + hash, - ); +export async function persist( + settingsSource: string, + pythonSource: string, +): Promise { + const id = await savePlayground({ settingsSource, pythonSource }); + await navigator.clipboard.writeText(`${window.location.origin}/${id}`); } /** * Restore the configuration from a URL. */ -export function restore(): [string, string] | null { - const value = lzstring.decompressFromEncodedURIComponent( - window.location.hash.slice(1), - ); - - if (value == null) { - return restoreLocal(); - } else { +export async function restore(): Promise<[string, string] | null> { + // Legacy URLs, stored as encoded strings in the hash, like: + // https://play.ruff.rs/#eyJzZXR0aW5nc1NvdXJjZ... + const hash = window.location.hash.slice(1); + if (hash) { + const value = lzstring.decompressFromEncodedURIComponent( + window.location.hash.slice(1), + )!; const [settingsSource, pythonSource] = value.split("$$$"); return [settingsSource.replaceAll("$$$$$$", "$$$"), pythonSource]; } + + // URLs stored in the database, like: + // https://play.ruff.rs/1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed + const id = window.location.pathname.slice(1); + if (id) { + const playground = await fetchPlayground(id); + if (playground == null) { + return null; + } + const { settingsSource, pythonSource } = playground; + return [settingsSource, pythonSource]; + } + + // If no URL is present, restore from local storage. + return restoreLocal(); } function restoreLocal(): [string, string] | null { From cc151c35a845764945608fd714f6d0a76ffab324 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 11 Aug 2023 00:02:02 -0400 Subject: [PATCH 071/155] Respect dummy-variable-rgx for unused bound exceptions (#6492) ## Summary This PR respects our unused variable regex when flagging bound exceptions, so that you no longer get a violation for, e.g.: ```python def f(): try: pass except Exception as _: pass ``` This is an odd pattern, but I think it's surprising that the regex _isn't_ respected here. Closes https://github.com/astral-sh/ruff/issues/6391 ## Test Plan `cargo test` --- .../resources/test/fixtures/pyflakes/F841_0.py | 6 ++++++ .../ruff/src/checkers/ast/analyze/bindings.rs | 8 +++++++- .../rules/pyflakes/rules/unused_variable.rs | 11 +++++++---- ...flakes__tests__f841_dummy_variable_rgx.snap | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pyflakes/F841_0.py b/crates/ruff/resources/test/fixtures/pyflakes/F841_0.py index 94bc0b6ca5..bde7153696 100644 --- a/crates/ruff/resources/test/fixtures/pyflakes/F841_0.py +++ b/crates/ruff/resources/test/fixtures/pyflakes/F841_0.py @@ -145,3 +145,9 @@ def f() -> None: obj = Foo() obj.do_thing() + +def f(): + try: + pass + except Exception as _: + pass diff --git a/crates/ruff/src/checkers/ast/analyze/bindings.rs b/crates/ruff/src/checkers/ast/analyze/bindings.rs index 8cce5812eb..91931f3ded 100644 --- a/crates/ruff/src/checkers/ast/analyze/bindings.rs +++ b/crates/ruff/src/checkers/ast/analyze/bindings.rs @@ -18,7 +18,13 @@ pub(crate) fn bindings(checker: &mut Checker) { for binding in checker.semantic.bindings.iter() { if checker.enabled(Rule::UnusedVariable) { - if binding.kind.is_bound_exception() && !binding.is_used() { + if binding.kind.is_bound_exception() + && !binding.is_used() + && !checker + .settings + .dummy_variable_rgx + .is_match(binding.name(checker.locator)) + { let mut diagnostic = Diagnostic::new( pyflakes::rules::UnusedVariable { name: binding.name(checker.locator).to_string(), diff --git a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs index dd3ff4c7c7..4e723160be 100644 --- a/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff/src/rules/pyflakes/rules/unused_variable.rs @@ -312,10 +312,13 @@ pub(crate) fn unused_variable(checker: &Checker, scope: &Scope, diagnostics: &mu && !binding.is_global() && !binding.is_used() && !checker.settings.dummy_variable_rgx.is_match(name) - && name != "__tracebackhide__" - && name != "__traceback_info__" - && name != "__traceback_supplement__" - && name != "__debuggerskip__" + && !matches!( + name, + "__tracebackhide__" + | "__traceback_info__" + | "__traceback_supplement__" + | "__debuggerskip__" + ) { return Some((name.to_string(), binding.range, binding.source)); } diff --git a/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__f841_dummy_variable_rgx.snap b/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__f841_dummy_variable_rgx.snap index ff53df87e1..5197e53959 100644 --- a/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__f841_dummy_variable_rgx.snap +++ b/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__f841_dummy_variable_rgx.snap @@ -256,4 +256,22 @@ F841_0.py:127:21: F841 Local variable `value` is assigned to but never used | = help: Remove assignment to unused variable `value` +F841_0.py:152:25: F841 [*] Local variable `_` is assigned to but never used + | +150 | try: +151 | pass +152 | except Exception as _: + | ^ F841 +153 | pass + | + = help: Remove assignment to unused variable `_` + +ℹ Fix +149 149 | def f(): +150 150 | try: +151 151 | pass +152 |- except Exception as _: + 152 |+ except Exception: +153 153 | pass + From 2e5c81b202360ae4b33f989a03f056d7963c202e Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 11 Aug 2023 01:03:56 -0400 Subject: [PATCH 072/155] Ensure that B006 autofix respects docstrings (#6493) ## Summary Some follow-ups to https://github.com/astral-sh/ruff/pull/6131 to ensure that fixes are inserted _after_ function docstrings, and that fixes are robust to a bunch of edge cases. ## Test Plan `cargo test` --- .../test/fixtures/flake8_bugbear/B006_B008.py | 29 ++++ .../src/checkers/ast/analyze/statement.rs | 24 +-- .../rules/mutable_argument_default.rs | 138 ++++++++++------- ...ke8_bugbear__tests__B006_B006_B008.py.snap | 139 +++++++++++++++--- 4 files changed, 244 insertions(+), 86 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py b/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py index 71146ea184..4b3492bb4c 100644 --- a/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py +++ b/crates/ruff/resources/test/fixtures/flake8_bugbear/B006_B008.py @@ -275,3 +275,32 @@ def mutable_annotations( d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), ): pass + + +def single_line_func_wrong(value: dict[str, str] = {}): + """Docstring""" + + +def single_line_func_wrong(value: dict[str, str] = {}): + """Docstring""" + ... + + +def single_line_func_wrong(value: dict[str, str] = {}): + """Docstring"""; ... + + +def single_line_func_wrong(value: dict[str, str] = {}): + """Docstring"""; \ + ... + + +def single_line_func_wrong(value: dict[str, str] = { + # This is a comment +}): + """Docstring""" + + +def single_line_func_wrong(value: dict[str, str] = {}) \ + : \ + """Docstring""" diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index 25b96d7126..a5c56291ee 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -69,16 +69,18 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } } } - Stmt::FunctionDef(ast::StmtFunctionDef { - is_async, - name, - decorator_list, - returns, - parameters, - body, - type_params, - range, - }) => { + Stmt::FunctionDef( + function_def @ ast::StmtFunctionDef { + is_async, + name, + decorator_list, + returns, + parameters, + body, + type_params, + range: _, + }, + ) => { if checker.enabled(Rule::DjangoNonLeadingReceiverDecorator) { flake8_django::rules::non_leading_receiver_decorator(checker, decorator_list); } @@ -205,7 +207,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { flake8_bugbear::rules::cached_instance_method(checker, decorator_list); } if checker.enabled(Rule::MutableArgumentDefault) { - flake8_bugbear::rules::mutable_argument_default(checker, parameters, body, *range); + flake8_bugbear::rules::mutable_argument_default(checker, function_def); } if checker.any_enabled(&[ Rule::UnnecessaryReturnNone, diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs b/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs index d6de9e965a..bee4481a28 100644 --- a/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs +++ b/crates/ruff/src/rules/flake8_bugbear/rules/mutable_argument_default.rs @@ -1,13 +1,12 @@ use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::docstrings::leading_space; -use ruff_python_ast::{ParameterWithDefault, Parameters, Ranged, Stmt}; -use ruff_python_parser::lexer::lex_starts_at; -use ruff_python_parser::{Mode, Tok}; +use ruff_python_ast::helpers::is_docstring_stmt; +use ruff_python_ast::{self as ast, Expr, Parameter, ParameterWithDefault, Ranged}; +use ruff_python_codegen::{Generator, Stylist}; +use ruff_python_index::Indexer; use ruff_python_semantic::analyze::typing::{is_immutable_annotation, is_mutable_expr}; -use ruff_python_trivia::indentation_at_offset; +use ruff_python_trivia::{indentation_at_offset, textwrap}; use ruff_source_file::Locator; -use ruff_text_size::TextRange; use crate::checkers::ast::Checker; use crate::registry::AsRule; @@ -63,29 +62,23 @@ impl Violation for MutableArgumentDefault { format!("Do not use mutable data structures for argument defaults") } fn autofix_title(&self) -> Option { - Some(format!( - "Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None`" - )) + Some(format!("Replace with `None`; initialize within function")) } } /// B006 -pub(crate) fn mutable_argument_default( - checker: &mut Checker, - parameters: &Parameters, - body: &[Stmt], - func_range: TextRange, -) { +pub(crate) fn mutable_argument_default(checker: &mut Checker, function_def: &ast::StmtFunctionDef) { // Scan in reverse order to right-align zip(). for ParameterWithDefault { parameter, default, range: _, - } in parameters + } in function_def + .parameters .posonlyargs .iter() - .chain(¶meters.args) - .chain(¶meters.kwonlyargs) + .chain(&function_def.parameters.args) + .chain(&function_def.parameters.kwonlyargs) { let Some(default) = default else { continue; @@ -100,50 +93,81 @@ pub(crate) fn mutable_argument_default( let mut diagnostic = Diagnostic::new(MutableArgumentDefault, default.range()); // If the function body is on the same line as the function def, do not fix - if checker.patch(diagnostic.kind.rule()) - && !is_single_line(checker.locator(), func_range, body) - { - // Set the default arg value to None - let arg_edit = Edit::range_replacement("None".to_string(), default.range()); - - // Add conditional check to set the default arg to its original value if still None - let mut check_lines = String::new(); - let indentation = - indentation_at_offset(body[0].start(), checker.locator()).unwrap_or_default(); - let indentation = leading_space(indentation); - // body[0].start() starts at correct indentation so we do need to add indentation - // before pushing the if statement - check_lines.push_str(format!("if {} is None:\n", parameter.name.as_str()).as_str()); - check_lines.push_str(indentation); - check_lines.push_str(checker.stylist().indentation()); - check_lines.push_str( - format!( - "{} = {}", - parameter.name.as_str(), - checker.generator().expr(default), - ) - .as_str(), - ); - check_lines.push_str(&checker.stylist().line_ending()); - check_lines.push_str(indentation); - let check_edit = Edit::insertion(check_lines, body[0].start()); - - diagnostic.set_fix(Fix::manual_edits(arg_edit, [check_edit])); + if checker.patch(diagnostic.kind.rule()) { + if let Some(fix) = move_initialization( + function_def, + parameter, + default, + checker.locator(), + checker.stylist(), + checker.indexer(), + checker.generator(), + ) { + diagnostic.set_fix(fix); + } } checker.diagnostics.push(diagnostic); } } } -fn is_single_line(locator: &Locator, func_range: TextRange, body: &[Stmt]) -> bool { - let arg_string = locator.slice(func_range); - for (tok, range) in lex_starts_at(arg_string, Mode::Module, func_range.start()).flatten() { - match tok { - Tok::Colon => { - return !locator.contains_line_break(TextRange::new(range.end(), body[0].start())); - } - _ => continue, - } +/// Generate a [`Fix`] to move a mutable argument default initialization +/// into the function body. +fn move_initialization( + function_def: &ast::StmtFunctionDef, + parameter: &Parameter, + default: &Expr, + locator: &Locator, + stylist: &Stylist, + indexer: &Indexer, + generator: Generator, +) -> Option { + let mut body = function_def.body.iter(); + + let statement = body.next()?; + if indexer.preceded_by_multi_statement_line(statement, locator) { + return None; } - false + + // Determine the indentation depth of the function body. + let indentation = indentation_at_offset(statement.start(), locator)?; + + // Set the default argument value to `None`. + let default_edit = Edit::range_replacement("None".to_string(), default.range()); + + // Add an `if`, to set the argument to its original value if still `None`. + let mut content = String::new(); + content.push_str(&format!("if {} is None:", parameter.name.as_str())); + content.push_str(stylist.line_ending().as_str()); + content.push_str(stylist.indentation()); + content.push_str(&format!( + "{} = {}", + parameter.name.as_str(), + generator.expr(default) + )); + content.push_str(stylist.line_ending().as_str()); + + // Indent the edit to match the body indentation. + let content = textwrap::indent(&content, indentation).to_string(); + + let initialization_edit = if is_docstring_stmt(statement) { + // If the first statement in the function is a docstring, insert _after_ it. + if let Some(statement) = body.next() { + // If there's a second statement, insert _before_ it, but ensure this isn't a + // multi-statement line. + if indexer.preceded_by_multi_statement_line(statement, locator) { + return None; + } + Edit::insertion(content, locator.line_start(statement.start())) + } else { + // If the docstring is the only statement, insert _before_ it. + Edit::insertion(content, locator.full_line_end(statement.end())) + } + } else { + // Otherwise, insert before the first statement. + let at = locator.line_start(statement.start()); + Edit::insertion(content, at) + }; + + Some(Fix::manual_edits(default_edit, [initialization_edit])) } diff --git a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap index dd5f00fbec..038b21f9a2 100644 --- a/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap +++ b/crates/ruff/src/rules/flake8_bugbear/snapshots/ruff__rules__flake8_bugbear__tests__B006_B006_B008.py.snap @@ -7,7 +7,7 @@ B006_B008.py:63:25: B006 [*] Do not use mutable data structures for argument def | ^^^^^^^^^ B006 64 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 60 60 | # Flag mutable literals/comprehensions @@ -27,7 +27,7 @@ B006_B008.py:67:30: B006 [*] Do not use mutable data structures for argument def | ^^ B006 68 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 64 64 | ... @@ -49,7 +49,7 @@ B006_B008.py:73:52: B006 [*] Do not use mutable data structures for argument def | ^^ B006 74 | pass | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 70 70 | @@ -72,7 +72,7 @@ B006_B008.py:77:31: B006 [*] Do not use mutable data structures for argument def | |_^ B006 80 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 74 74 | pass @@ -95,7 +95,7 @@ B006_B008.py:82:36: B006 Do not use mutable data structures for argument default 82 | def single_line_func_wrong(value = {}): ... | ^^ B006 | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function B006_B008.py:85:20: B006 [*] Do not use mutable data structures for argument defaults | @@ -103,7 +103,7 @@ B006_B008.py:85:20: B006 [*] Do not use mutable data structures for argument def | ^^^^^ B006 86 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 82 82 | def single_line_func_wrong(value = {}): ... @@ -123,7 +123,7 @@ B006_B008.py:89:20: B006 [*] Do not use mutable data structures for argument def | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 90 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 86 86 | ... @@ -143,7 +143,7 @@ B006_B008.py:93:32: B006 [*] Do not use mutable data structures for argument def | ^^^^^^^^^^^^^^^^^^^^^^^^^ B006 94 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 90 90 | ... @@ -163,7 +163,7 @@ B006_B008.py:97:26: B006 [*] Do not use mutable data structures for argument def | ^^^^^^^^^^^^^^^^^^^ B006 98 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 94 94 | ... @@ -184,7 +184,7 @@ B006_B008.py:102:46: B006 [*] Do not use mutable data structures for argument de | ^^^^^^^^^^^^^^^^^^^^^^^^ B006 103 | pass | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 99 99 | @@ -204,7 +204,7 @@ B006_B008.py:106:46: B006 [*] Do not use mutable data structures for argument de | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ B006 107 | pass | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 103 103 | pass @@ -224,7 +224,7 @@ B006_B008.py:110:45: B006 [*] Do not use mutable data structures for argument de | ^^^^^^^^^^^^^^^^^^^^^^^^ B006 111 | pass | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 107 107 | pass @@ -244,7 +244,7 @@ B006_B008.py:114:33: B006 [*] Do not use mutable data structures for argument de | ^^ B006 115 | ... | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 111 111 | pass @@ -266,7 +266,7 @@ B006_B008.py:235:20: B006 [*] Do not use mutable data structures for argument de | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ B006 236 | pass | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 232 232 | @@ -288,7 +288,7 @@ B006_B008.py:272:27: B006 [*] Do not use mutable data structures for argument de 273 | b: Optional[Dict[int, int]] = {}, 274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 269 269 | @@ -303,6 +303,8 @@ B006_B008.py:272:27: B006 [*] Do not use mutable data structures for argument de 277 |+ if a is None: 278 |+ a = [] 277 279 | pass +278 280 | +279 281 | B006_B008.py:273:35: B006 [*] Do not use mutable data structures for argument defaults | @@ -313,7 +315,7 @@ B006_B008.py:273:35: B006 [*] Do not use mutable data structures for argument de 274 | c: Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), 275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 270 270 | @@ -327,6 +329,8 @@ B006_B008.py:273:35: B006 [*] Do not use mutable data structures for argument de 277 |+ if b is None: 278 |+ b = {} 277 279 | pass +278 280 | +279 281 | B006_B008.py:274:62: B006 [*] Do not use mutable data structures for argument defaults | @@ -337,7 +341,7 @@ B006_B008.py:274:62: B006 [*] Do not use mutable data structures for argument de 275 | d: typing_extensions.Annotated[Union[Set[str], abc.Sized], "annotation"] = set(), 276 | ): | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 271 271 | def mutable_annotations( @@ -350,6 +354,8 @@ B006_B008.py:274:62: B006 [*] Do not use mutable data structures for argument de 277 |+ if c is None: 278 |+ c = set() 277 279 | pass +278 280 | +279 281 | B006_B008.py:275:80: B006 [*] Do not use mutable data structures for argument defaults | @@ -360,7 +366,7 @@ B006_B008.py:275:80: B006 [*] Do not use mutable data structures for argument de 276 | ): 277 | pass | - = help: Replace mutable data structure with `None` in argument default and replace it with data structure inside the function if still `None` + = help: Replace with `None`; initialize within function ℹ Possible fix 272 272 | a: list[int] | None = [], @@ -372,5 +378,102 @@ B006_B008.py:275:80: B006 [*] Do not use mutable data structures for argument de 277 |+ if d is None: 278 |+ d = set() 277 279 | pass +278 280 | +279 281 | + +B006_B008.py:280:52: B006 [*] Do not use mutable data structures for argument defaults + | +280 | def single_line_func_wrong(value: dict[str, str] = {}): + | ^^ B006 +281 | """Docstring""" + | + = help: Replace with `None`; initialize within function + +ℹ Possible fix +277 277 | pass +278 278 | +279 279 | +280 |-def single_line_func_wrong(value: dict[str, str] = {}): + 280 |+def single_line_func_wrong(value: dict[str, str] = None): +281 281 | """Docstring""" + 282 |+ if value is None: + 283 |+ value = {} +282 284 | +283 285 | +284 286 | def single_line_func_wrong(value: dict[str, str] = {}): + +B006_B008.py:284:52: B006 [*] Do not use mutable data structures for argument defaults + | +284 | def single_line_func_wrong(value: dict[str, str] = {}): + | ^^ B006 +285 | """Docstring""" +286 | ... + | + = help: Replace with `None`; initialize within function + +ℹ Possible fix +281 281 | """Docstring""" +282 282 | +283 283 | +284 |-def single_line_func_wrong(value: dict[str, str] = {}): + 284 |+def single_line_func_wrong(value: dict[str, str] = None): +285 285 | """Docstring""" + 286 |+ if value is None: + 287 |+ value = {} +286 288 | ... +287 289 | +288 290 | + +B006_B008.py:289:52: B006 Do not use mutable data structures for argument defaults + | +289 | def single_line_func_wrong(value: dict[str, str] = {}): + | ^^ B006 +290 | """Docstring"""; ... + | + = help: Replace with `None`; initialize within function + +B006_B008.py:293:52: B006 Do not use mutable data structures for argument defaults + | +293 | def single_line_func_wrong(value: dict[str, str] = {}): + | ^^ B006 +294 | """Docstring"""; \ +295 | ... + | + = help: Replace with `None`; initialize within function + +B006_B008.py:298:52: B006 [*] Do not use mutable data structures for argument defaults + | +298 | def single_line_func_wrong(value: dict[str, str] = { + | ____________________________________________________^ +299 | | # This is a comment +300 | | }): + | |_^ B006 +301 | """Docstring""" + | + = help: Replace with `None`; initialize within function + +ℹ Possible fix +295 295 | ... +296 296 | +297 297 | +298 |-def single_line_func_wrong(value: dict[str, str] = { +299 |- # This is a comment +300 |-}): + 298 |+def single_line_func_wrong(value: dict[str, str] = None): +301 299 | """Docstring""" + 300 |+ if value is None: + 301 |+ value = {} +302 302 | +303 303 | +304 304 | def single_line_func_wrong(value: dict[str, str] = {}) \ + +B006_B008.py:304:52: B006 Do not use mutable data structures for argument defaults + | +304 | def single_line_func_wrong(value: dict[str, str] = {}) \ + | ^^ B006 +305 | : \ +306 | """Docstring""" + | + = help: Replace with `None`; initialize within function From 2cedb401bda299cd800711d26bbad3a3fc511655 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 11 Aug 2023 01:54:46 -0400 Subject: [PATCH 073/155] Force parentheses for named expressions in more contexts (#6494) See: https://github.com/astral-sh/ruff/pull/6436#issuecomment-1673583888. --- .../fixtures/ruff/expression/named_expr.py | 15 ++++++++++ .../src/expression/expr_named_expr.rs | 3 ++ .../format@expression__named_expr.py.snap | 30 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/named_expr.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/named_expr.py index 15ac1c7577..58522f5ad9 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/named_expr.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/named_expr.py @@ -36,3 +36,18 @@ except (e := Exception): (x := 1) (x := 1) + (y := 2) + +with (x := 1): + pass + + +def f(): + yield (x := 1) + + +def f(): + yield from (x := 1) + + +async def f(): + await (x := 1) diff --git a/crates/ruff_python_formatter/src/expression/expr_named_expr.rs b/crates/ruff_python_formatter/src/expression/expr_named_expr.rs index e0b1f674b9..935d926c30 100644 --- a/crates/ruff_python_formatter/src/expression/expr_named_expr.rs +++ b/crates/ruff_python_formatter/src/expression/expr_named_expr.rs @@ -44,6 +44,9 @@ impl NeedsParentheses for ExprNamedExpr { || parent.is_stmt_return() || parent.is_except_handler_except_handler() || parent.is_with_item() + || parent.is_expr_yield() + || parent.is_expr_yield_from() + || parent.is_expr_await() || parent.is_stmt_delete() || parent.is_stmt_for() { diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__named_expr.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__named_expr.py.snap index 018df04c72..8a57c6cb90 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__named_expr.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__named_expr.py.snap @@ -42,6 +42,21 @@ except (e := Exception): (x := 1) (x := 1) + (y := 2) + +with (x := 1): + pass + + +def f(): + yield (x := 1) + + +def f(): + yield from (x := 1) + + +async def f(): + await (x := 1) ``` ## Output @@ -82,6 +97,21 @@ except (e := Exception): (x := 1) (x := 1) + (y := 2) + +with (x := 1): + pass + + +def f(): + yield (x := 1) + + +def f(): + yield from (x := 1) + + +async def f(): + await (x := 1) ``` From f091b46497e8bc1a0a8d5a66804f2b0477827e2a Mon Sep 17 00:00:00 2001 From: David Szotten Date: Fri, 11 Aug 2023 08:22:30 +0100 Subject: [PATCH 074/155] move comments from expressions in f-strings out (#6481) --- .../test/fixtures/ruff/expression/fstring.py | 9 +++++++++ .../src/comments/placement.rs | 1 + .../format@expression__fstring.py.snap | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py index 2769203823..a60efa1cdd 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py @@ -24,3 +24,12 @@ result_f = ( r' \[Previous line repeated (\d+) more times\]' '\n' 'RecursionError: maximum recursion depth exceeded\n' ) + + +# Regression for fstring dropping comments that were accidentally attached to +# an expression inside a formatted value +( + f'{1}' + # comment + '' +) diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 855930ba7c..a231a54096 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -80,6 +80,7 @@ pub(super) fn place_comment<'a>( CommentPlacement::Default(comment) } } + AnyNodeRef::ExprFString(fstring) => CommentPlacement::dangling(fstring, comment), AnyNodeRef::ExprList(_) | AnyNodeRef::ExprSet(_) | AnyNodeRef::ExprGeneratorExp(_) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap index 90a4b1e396..e6e7156208 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__fstring.py.snap @@ -30,6 +30,15 @@ result_f = ( r' \[Previous line repeated (\d+) more times\]' '\n' 'RecursionError: maximum recursion depth exceeded\n' ) + + +# Regression for fstring dropping comments that were accidentally attached to +# an expression inside a formatted value +( + f'{1}' + # comment + '' +) ``` ## Output @@ -58,6 +67,15 @@ result_f = ( "\n" "RecursionError: maximum recursion depth exceeded\n" ) + + +# Regression for fstring dropping comments that were accidentally attached to +# an expression inside a formatted value +( + f"{1}" + # comment + "" +) ``` From 0ef6af807b74cf38c77b76e7c139a2492cb4b824 Mon Sep 17 00:00:00 2001 From: konsti Date: Fri, 11 Aug 2023 12:41:48 +0200 Subject: [PATCH 075/155] Implement DerefMut for WithNodeLevel (#6443) **Summary** Implement `DerefMut` for `WithNodeLevel` so it can be used in the same way as `PyFormatter`. I want this for my WIP upstack branch to enable `.fmt(f)` on `WithNodeLevel` context. We could extend this to remove the other two method from `WithNodeLevel`. --- crates/ruff_python_formatter/src/context.rs | 28 ++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/crates/ruff_python_formatter/src/context.rs b/crates/ruff_python_formatter/src/context.rs index 23a3530a24..01caed9e68 100644 --- a/crates/ruff_python_formatter/src/context.rs +++ b/crates/ruff_python_formatter/src/context.rs @@ -1,9 +1,9 @@ use crate::comments::Comments; use crate::PyFormatOptions; -use ruff_formatter::prelude::*; -use ruff_formatter::{Arguments, Buffer, FormatContext, GroupId, SourceCode}; +use ruff_formatter::{Buffer, FormatContext, GroupId, SourceCode}; use ruff_source_file::Locator; use std::fmt::{Debug, Formatter}; +use std::ops::{Deref, DerefMut}; #[derive(Clone)] pub struct PyFormatContext<'a> { @@ -96,6 +96,7 @@ impl NodeLevel { } } +/// Change the [`NodeLevel`] of the formatter for the lifetime of this struct pub(crate) struct WithNodeLevel<'ast, 'buf, B> where B: Buffer>, @@ -119,16 +120,25 @@ where saved_level, } } +} - #[inline] - pub(crate) fn write_fmt(&mut self, arguments: Arguments) -> FormatResult<()> { - self.buffer.write_fmt(arguments) +impl<'ast, 'buf, B> Deref for WithNodeLevel<'ast, 'buf, B> +where + B: Buffer>, +{ + type Target = B; + + fn deref(&self) -> &Self::Target { + self.buffer } +} - #[allow(unused)] - #[inline] - pub(crate) fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { - self.buffer.write_element(element) +impl<'ast, 'buf, B> DerefMut for WithNodeLevel<'ast, 'buf, B> +where + B: Buffer>, +{ + fn deref_mut(&mut self) -> &mut Self::Target { + self.buffer } } From b05574babd6224af99938a429d0b19ba3297513c Mon Sep 17 00:00:00 2001 From: Victor Hugo Gomes Date: Fri, 11 Aug 2023 08:21:16 -0300 Subject: [PATCH 076/155] Fix formatter instability with half-indented comment (#6460) ## Summary The bug was happening in this [loop](https://github.com/LaBatata101/ruff/blob/75f402eb8262f88dc0445beb6cab4d3cd224716c/crates/ruff_python_formatter/src/comments/placement.rs#L545). Basically, In the first iteration of the loop, the `comment_indentation` is bigger than `child_indentation` (`comment_indentation` is 7 and `child_indentation` is 4) making the `Ordering::Greater` branch execute. Inside the `Ordering::Greater` branch, the `if` block gets executed, resulting in the update of these variables. ```rust parent_body = current_body; current_body = Some(last_child_in_current_body); last_child_in_current_body = nested_child; ``` In the second iteration of the loop, `comment_indentation` is smaller than `child_indentation` (`comment_indentation` is 7 and `child_indentation` is 8) making the `Ordering::Less` branch execute. Inside the `Ordering::Less` branch, the `if` block gets executed, this is where the bug was happening. At this point `parent_body` should be a `StmtFunctionDef` but it was a `StmtClassDef`. Causing the comment to be incorrectly formatted. That happened for the following code: ```python class A: def f(): pass # strangely indented comment print() ``` There is only one problem that I couldn't figure it out a solution, the variable `current_body` in this [line](https://github.com/LaBatata101/ruff/blob/75f402eb8262f88dc0445beb6cab4d3cd224716c/crates/ruff_python_formatter/src/comments/placement.rs#L542C5-L542C49) now gives this warning _"value assigned to `current_body` is never read maybe it is overwritten before being read?"_ Any tips on how to solve that? Closes #5337 ## Test Plan Add new test case. --------- Co-authored-by: konstin --- .../test/fixtures/ruff/statement/if.py | 12 +++++++ .../ruff_python_formatter/src/comments/mod.rs | 9 +++-- .../src/comments/placement.rs | 35 +++++++++---------- ...nts__tests__trailing_function_comment.snap | 25 ++++++++++--- .../snapshots/format@statement__if.py.snap | 24 +++++++++++++ 5 files changed, 79 insertions(+), 26 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/if.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/if.py index 266b2da8a7..61e3bc130b 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/if.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/if.py @@ -103,3 +103,15 @@ else: if True: print("a") # 1 elif True: print("b") # 2 else: print("c") # 3 + +# Regression test for https://github.com/astral-sh/ruff/issues/5337 +if parent_body: + if current_body: + child_in_body() + last_child_in_current_body() # may or may not have children on its own +# a + # b + # c + # d + # e + #f diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs index ae855c82b6..238665f9b7 100644 --- a/crates/ruff_python_formatter/src/comments/mod.rs +++ b/crates/ruff_python_formatter/src/comments/mod.rs @@ -600,8 +600,13 @@ def test(x, y): def other(y, z): if y == z: pass - # Trailing `if` comment - # Trailing `other` function comment + # Trailing `pass` comment + # Trailing `if` statement comment + +class Test: + def func(): + pass + # Trailing `func` function comment test(10, 20) "#; diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index a231a54096..81035bf7dd 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -451,12 +451,11 @@ fn handle_own_line_comment_after_branch<'a>( return CommentPlacement::Default(comment); } - let mut parent_body = None; - let mut current_body = Some(preceding_node); - let mut last_child_in_current_body = last_child; + let mut parent = None; + let mut last_child_in_parent = last_child; loop { - let child_indentation = indentation(locator, &last_child_in_current_body) + let child_indentation = indentation(locator, &last_child_in_parent) .unwrap_or_default() .len(); @@ -465,15 +464,16 @@ fn handle_own_line_comment_after_branch<'a>( // if parent_body: // if current_body: // child_in_body() - // last_child_in_current_body # may or may not have children on its own + // last_child_in_current_body # may or may not have children on its own // # less: Comment belongs to the parent block. - // # less + // # less: Comment belongs to the parent block. // # equal: The comment belongs to this block. - // # greater - // # greater: The comment belongs to the inner block. + // # greater (but less in the next iteration) + // # greater: The comment belongs to the inner block. + // ``` match comment_indentation.cmp(&child_indentation) { Ordering::Less => { - return if let Some(parent_block) = parent_body { + return if let Some(parent_block) = parent { // Comment belongs to the parent block. CommentPlacement::trailing(parent_block, comment) } else { @@ -488,14 +488,13 @@ fn handle_own_line_comment_after_branch<'a>( } Ordering::Equal => { // The comment belongs to this block. - return CommentPlacement::trailing(last_child_in_current_body, comment); + return CommentPlacement::trailing(last_child_in_parent, comment); } Ordering::Greater => { - if let Some(nested_child) = last_child_in_body(last_child_in_current_body) { + if let Some(nested_child) = last_child_in_body(last_child_in_parent) { // The comment belongs to the inner block. - parent_body = current_body; - current_body = Some(last_child_in_current_body); - last_child_in_current_body = nested_child; + parent = Some(last_child_in_parent); + last_child_in_parent = nested_child; } else { // The comment is overindented, we assign it to the most indented child we have. // ```python @@ -503,7 +502,7 @@ fn handle_own_line_comment_after_branch<'a>( // pass // # comment // ``` - return CommentPlacement::trailing(last_child_in_current_body, comment); + return CommentPlacement::trailing(last_child_in_parent, comment); } } } @@ -1346,7 +1345,7 @@ where right.is_some_and(|right| left.ptr_eq(right.into())) } -/// The last child of the last branch, if the node hs multiple branches. +/// The last child of the last branch, if the node has multiple branches. fn last_child_in_body(node: AnyNodeRef) -> Option { let body = match node { AnyNodeRef::StmtFunctionDef(ast::StmtFunctionDef { body, .. }) @@ -1504,9 +1503,7 @@ mod tests { ); assert_eq!( - max_empty_lines( - "# trailing comment\n\n# own line comment\n\n\n# an other own line comment\n# block" - ), + max_empty_lines("# trailing comment\n\n# own line comment\n\n\n# an other own line comment\n# block"), 2 ); diff --git a/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__trailing_function_comment.snap b/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__trailing_function_comment.snap index 005e4fcf8d..9dd6d289d4 100644 --- a/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__trailing_function_comment.snap +++ b/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__trailing_function_comment.snap @@ -34,15 +34,15 @@ expression: comments.debug(test_case.source_code) ], }, Node { - kind: StmtFunctionDef, - range: 193..237, - source: `def other(y, z):⏎`, + kind: StmtIf, + range: 214..237, + source: `if y == z:⏎`, }: { "leading": [], "dangling": [], "trailing": [ SourceComment { - text: "# Trailing `other` function comment", + text: "# Trailing `if` statement comment", position: OwnLine, formatted: false, }, @@ -57,7 +57,22 @@ expression: comments.debug(test_case.source_code) "dangling": [], "trailing": [ SourceComment { - text: "# Trailing `if` comment", + text: "# Trailing `pass` comment", + position: OwnLine, + formatted: false, + }, + ], + }, + Node { + kind: StmtFunctionDef, + range: 333..357, + source: `def func():⏎`, + }: { + "leading": [], + "dangling": [], + "trailing": [ + SourceComment { + text: "# Trailing `func` function comment", position: OwnLine, formatted: false, }, diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__if.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__if.py.snap index 10ab45b872..9c459694dd 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__if.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__if.py.snap @@ -109,6 +109,18 @@ else: if True: print("a") # 1 elif True: print("b") # 2 else: print("c") # 3 + +# Regression test for https://github.com/astral-sh/ruff/issues/5337 +if parent_body: + if current_body: + child_in_body() + last_child_in_current_body() # may or may not have children on its own +# a + # b + # c + # d + # e + #f ``` ## Output @@ -224,6 +236,18 @@ elif True: print("b") # 2 else: print("c") # 3 + +# Regression test for https://github.com/astral-sh/ruff/issues/5337 +if parent_body: + if current_body: + child_in_body() + last_child_in_current_body() # may or may not have children on its own + # e + # f + # c + # d +# a +# b ``` From f2939c678bf79d3c1061caaa638e51bead48b9d9 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 11 Aug 2023 09:33:15 -0400 Subject: [PATCH 077/155] Avoid breaking call chains unnecessarily (#6488) ## Summary This PR attempts to fix the formatting of the following expression: ```python max_message_id = ( Message.objects.filter(recipient=recipient).order_by("id").reverse()[0].id ) ``` Specifically, Black preserves _that_ formatting, while we do: ```python max_message_id = ( Message.objects.filter(recipient=recipient) .order_by("id") .reverse()[0] .id ) ``` The fix here is to add a group around the entire call chain. ## Test Plan Before: - `zulip`: 0.99702 - `django`: 0.99784 - `warehouse`: 0.99585 - `build`: 0.75623 - `transformers`: 0.99470 - `cpython`: 0.75989 - `typeshed`: 0.74853 After: - `zulip`: 0.99703 - `django`: 0.99791 - `warehouse`: 0.99586 - `build`: 0.75623 - `transformers`: 0.99470 - `cpython`: 0.75989 - `typeshed`: 0.74853 --- .../fixtures/ruff/parentheses/call_chains.py | 6 + .../src/expression/expr_attribute.rs | 193 +++++++++--------- .../format@parentheses__call_chains.py.snap | 14 ++ 3 files changed, 122 insertions(+), 91 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/call_chains.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/call_chains.py index 67b702c705..c5d806e27e 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/call_chains.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/call_chains.py @@ -154,4 +154,10 @@ zero( five, ) +max_message_id = ( + Message.objects.filter(recipient=recipient).order_by("id").reverse()[0].id +) +max_message_id = ( + Message.objects.filter(recipient=recipient).order_by("id").reverse()[0].id() +) diff --git a/crates/ruff_python_formatter/src/expression/expr_attribute.rs b/crates/ruff_python_formatter/src/expression/expr_attribute.rs index f734a5fc5b..aef904218d 100644 --- a/crates/ruff_python_formatter/src/expression/expr_attribute.rs +++ b/crates/ruff_python_formatter/src/expression/expr_attribute.rs @@ -35,105 +35,116 @@ impl FormatNodeRule for FormatExprAttribute { let call_chain_layout = self.call_chain_layout.apply_in_node(item, f); - let needs_parentheses = matches!( - value.as_ref(), - Expr::Constant(ExprConstant { - value: Constant::Int(_) | Constant::Float(_), - .. - }) - ); + let format_inner = format_with(|f: &mut PyFormatter| { + let needs_parentheses = matches!( + value.as_ref(), + Expr::Constant(ExprConstant { + value: Constant::Int(_) | Constant::Float(_), + .. + }) + ); - let comments = f.context().comments().clone(); - let dangling_comments = comments.dangling_comments(item); - let leading_attribute_comments_start = - dangling_comments.partition_point(|comment| comment.line_position().is_end_of_line()); - let (trailing_dot_comments, leading_attribute_comments) = - dangling_comments.split_at(leading_attribute_comments_start); + let comments = f.context().comments().clone(); + let dangling_comments = comments.dangling_comments(item); + let leading_attribute_comments_start = dangling_comments + .partition_point(|comment| comment.line_position().is_end_of_line()); + let (trailing_dot_comments, leading_attribute_comments) = + dangling_comments.split_at(leading_attribute_comments_start); - if needs_parentheses { - value.format().with_options(Parentheses::Always).fmt(f)?; - } else if call_chain_layout == CallChainLayout::Fluent { - match value.as_ref() { - Expr::Attribute(expr) => { - expr.format().with_options(call_chain_layout).fmt(f)?; - } - Expr::Call(expr) => { - expr.format().with_options(call_chain_layout).fmt(f)?; - if call_chain_layout == CallChainLayout::Fluent { - // Format the dot on its own line - soft_line_break().fmt(f)?; - } - } - Expr::Subscript(expr) => { - expr.format().with_options(call_chain_layout).fmt(f)?; - if call_chain_layout == CallChainLayout::Fluent { - // Format the dot on its own line - soft_line_break().fmt(f)?; - } - } - _ => { - // This matches [`CallChainLayout::from_expression`] - if is_expression_parenthesized(value.as_ref().into(), f.context().source()) { - value.format().with_options(Parentheses::Always).fmt(f)?; - // Format the dot on its own line - soft_line_break().fmt(f)?; - } else { - value.format().fmt(f)?; + if needs_parentheses { + value.format().with_options(Parentheses::Always).fmt(f)?; + } else if call_chain_layout == CallChainLayout::Fluent { + match value.as_ref() { + Expr::Attribute(expr) => { + expr.format().with_options(call_chain_layout).fmt(f)?; + } + Expr::Call(expr) => { + expr.format().with_options(call_chain_layout).fmt(f)?; + if call_chain_layout == CallChainLayout::Fluent { + // Format the dot on its own line + soft_line_break().fmt(f)?; + } + } + Expr::Subscript(expr) => { + expr.format().with_options(call_chain_layout).fmt(f)?; + if call_chain_layout == CallChainLayout::Fluent { + // Format the dot on its own line + soft_line_break().fmt(f)?; + } + } + _ => { + // This matches [`CallChainLayout::from_expression`] + if is_expression_parenthesized(value.as_ref().into(), f.context().source()) + { + value.format().with_options(Parentheses::Always).fmt(f)?; + // Format the dot on its own line + soft_line_break().fmt(f)?; + } else { + value.format().fmt(f)?; + } } } + } else { + value.format().fmt(f)?; } - } else { - value.format().fmt(f)?; - } - if comments.has_trailing_own_line_comments(value.as_ref()) { - hard_line_break().fmt(f)?; - } + if comments.has_trailing_own_line_comments(value.as_ref()) { + hard_line_break().fmt(f)?; + } - if call_chain_layout == CallChainLayout::Fluent { - // Fluent style has line breaks before the dot - // ```python - // blogs3 = ( - // Blog.objects.filter( - // entry__headline__contains="Lennon", - // ) - // .filter( - // entry__pub_date__year=2008, - // ) - // .filter( - // entry__pub_date__year=2008, - // ) - // ) - // ``` - write!( - f, - [ - (!leading_attribute_comments.is_empty()).then_some(hard_line_break()), - leading_comments(leading_attribute_comments), - text("."), - trailing_comments(trailing_dot_comments), - attr.format() - ] - ) + if call_chain_layout == CallChainLayout::Fluent { + // Fluent style has line breaks before the dot + // ```python + // blogs3 = ( + // Blog.objects.filter( + // entry__headline__contains="Lennon", + // ) + // .filter( + // entry__pub_date__year=2008, + // ) + // .filter( + // entry__pub_date__year=2008, + // ) + // ) + // ``` + write!( + f, + [ + (!leading_attribute_comments.is_empty()).then_some(hard_line_break()), + leading_comments(leading_attribute_comments), + text("."), + trailing_comments(trailing_dot_comments), + attr.format() + ] + ) + } else { + // Regular style + // ```python + // blogs2 = Blog.objects.filter( + // entry__headline__contains="Lennon", + // ).filter( + // entry__pub_date__year=2008, + // ) + // ``` + write!( + f, + [ + text("."), + trailing_comments(trailing_dot_comments), + (!leading_attribute_comments.is_empty()).then_some(hard_line_break()), + leading_comments(leading_attribute_comments), + attr.format() + ] + ) + } + }); + + let is_call_chain_root = self.call_chain_layout == CallChainLayout::Default + && call_chain_layout == CallChainLayout::Fluent; + if is_call_chain_root { + write!(f, [group(&format_inner)]) } else { - // Regular style - // ```python - // blogs2 = Blog.objects.filter( - // entry__headline__contains="Lennon", - // ).filter( - // entry__pub_date__year=2008, - // ) - // ``` - write!( - f, - [ - text("."), - trailing_comments(trailing_dot_comments), - (!leading_attribute_comments.is_empty()).then_some(hard_line_break()), - leading_comments(leading_attribute_comments), - attr.format() - ] - ) + write!(f, [format_inner]) } } diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__call_chains.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__call_chains.py.snap index f6b2f7d35c..8c8c952a79 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__call_chains.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__call_chains.py.snap @@ -160,7 +160,13 @@ zero( five, ) +max_message_id = ( + Message.objects.filter(recipient=recipient).order_by("id").reverse()[0].id +) +max_message_id = ( + Message.objects.filter(recipient=recipient).order_by("id").reverse()[0].id() +) ``` ## Output @@ -334,6 +340,14 @@ zero( ).four( five, ) + +max_message_id = ( + Message.objects.filter(recipient=recipient).order_by("id").reverse()[0].id +) + +max_message_id = ( + Message.objects.filter(recipient=recipient).order_by("id").reverse()[0].id() +) ``` From 8b24238d191e2295e81699c6c02c3c80fdd0d2d6 Mon Sep 17 00:00:00 2001 From: konsti Date: Fri, 11 Aug 2023 15:37:21 +0200 Subject: [PATCH 078/155] Show a pretty markdown table in formatter ecosystem checks (#6496) **Summary** The formatter ecosystem checks will now print a markdown table you can copy&paste into your PR description. ![image](https://github.com/astral-sh/ruff/assets/6826232/80289ed9-9d2b-400e-a994-de63dca0b065) copied markdown: | project | similarity index | |--------------|------------------| | build | 0.75623 | | cpython | 0.75989 | | django | 0.99784 | | transformers | 0.99470 | | typeshed | 0.74853 | | warehouse | 0.99585 | | zulip | 0.99702 | raw markdown: ```markdown | project | similarity index | |--------------|------------------| | build | 0.75623 | | cpython | 0.75989 | | django | 0.99784 | | transformers | 0.99470 | | typeshed | 0.74853 | | warehouse | 0.99585 | | zulip | 0.99702 | ``` --- .github/workflows/ci.yaml | 2 +- crates/ruff_dev/src/format_dev.rs | 44 ++++++++++++++++++++++++++- scripts/formatter_ecosystem_checks.sh | 7 +++-- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5707fdea6a..13b1986afd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -338,6 +338,6 @@ jobs: - name: "Formatter progress" run: scripts/formatter_ecosystem_checks.sh - name: "Github step summary" - run: grep "similarity index" target/progress_projects_log.txt | sort > $GITHUB_STEP_SUMMARY + run: cat target/progress_projects_stats.txt > $GITHUB_STEP_SUMMARY - name: "Remove checkouts from cache" run: rm -r target/progress_projects diff --git a/crates/ruff_dev/src/format_dev.rs b/crates/ruff_dev/src/format_dev.rs index 6b83fb57ed..79966a7c06 100644 --- a/crates/ruff_dev/src/format_dev.rs +++ b/crates/ruff_dev/src/format_dev.rs @@ -22,7 +22,7 @@ use std::panic::catch_unwind; use std::path::{Path, PathBuf}; use std::process::ExitCode; use std::time::{Duration, Instant}; -use std::{fmt, fs, io}; +use std::{fmt, fs, io, iter}; use tempfile::NamedTempFile; use tracing::{debug, error, info, info_span}; use tracing_indicatif::span_ext::IndicatifSpanExt; @@ -187,6 +187,9 @@ pub(crate) struct Args { /// Write all log messages (same as cli) to this file #[arg(long)] pub(crate) log_file: Option, + /// Write a markdown table with the similarity indices to this file + #[arg(long)] + pub(crate) stats_file: Option, /// Assert that there are exactly this many input files with errors. This catches regressions /// (or improvements) in the parser. #[arg(long)] @@ -302,6 +305,8 @@ fn format_dev_multi_project(args: &Args) -> anyhow::Result { None => None, }; + let mut results = Vec::new(); + for project_path in project_paths { debug!(parent: None, "Starting {}", project_path.display()); @@ -332,6 +337,7 @@ fn format_dev_multi_project(args: &Args) -> anyhow::Result { write!(error_file, "{}", result.display(args.format)).unwrap(); error_file.flush().unwrap(); } + results.push(result); pb_span.pb_inc(1); } @@ -353,6 +359,35 @@ fn format_dev_multi_project(args: &Args) -> anyhow::Result { duration.as_secs_f32(), ); + if let Some(stats_file) = &args.stats_file { + results.sort_by(|result1, result2| result1.name.cmp(&result2.name)); + let project_col_len = results + .iter() + .map(|result| result.name.len()) + .chain(iter::once("project".len())) + .max() + .unwrap_or_default(); + let mut stats_file = BufWriter::new(File::create(stats_file)?); + writeln!( + stats_file, + "| {:, diff --git a/scripts/formatter_ecosystem_checks.sh b/scripts/formatter_ecosystem_checks.sh index 46d765fb2d..f26405212e 100755 --- a/scripts/formatter_ecosystem_checks.sh +++ b/scripts/formatter_ecosystem_checks.sh @@ -55,10 +55,11 @@ git -C "$dir/cpython" checkout 45de31db9cc9be945702f3a7ca35bbb9f98476af # Uncomment if you want to update the hashes # for i in "$dir"/*/; do git -C "$i" switch main && git -C "$i" pull && echo "# $(basename "$i") $(git -C "$i" rev-parse HEAD)"; done -time cargo run --bin ruff_dev -- format-dev --stability-check --error-file "$target/progress_projects_errors.txt" \ - --log-file "$target/progress_projects_log.txt" --files-with-errors 25 --multi-project "$dir" || ( +time cargo run --bin ruff_dev -- format-dev --stability-check \ + --error-file "$target/progress_projects_errors.txt" --log-file "$target/progress_projects_log.txt" --stats-file "$target/progress_projects_stats.txt" \ + --files-with-errors 25 --multi-project "$dir" || ( echo "Ecosystem check failed" cat "$target/progress_projects_log.txt" exit 1 ) -grep "similarity index" "$target/progress_projects_log.txt" | sort +cat "$target/progress_projects_stats.txt" From c434bdd2bd523366e683b2a6217c4fba8591ccaa Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Fri, 11 Aug 2023 19:20:25 +0530 Subject: [PATCH 079/155] Add formatting for `MatchCase` (#6360) ## Summary This PR adds formatting support for `MatchCase` node with subs for the `Pattern` nodes. ## Test Plan Added test cases for case node handling with comments, newlines. resolves: #6299 --- .../test/fixtures/ruff/statement/match.py | 53 ++++++++++ .../src/comments/placement.rs | 1 + .../src/other/match_case.rs | 30 +++--- .../ruff_python_formatter/src/pattern/mod.rs | 39 ++++++++ .../src/statement/stmt_match.rs | 30 +++++- ...y@py_310__pattern_matching_complex.py.snap | 4 +- ...ty@py_310__pattern_matching_extras.py.snap | 14 ++- ...ty@py_310__pattern_matching_simple.py.snap | 4 +- ...py_310__remove_newline_after_match.py.snap | 11 ++- .../snapshots/format@statement__match.py.snap | 99 +++++++++++++++++++ 10 files changed, 256 insertions(+), 29 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py index e1c8d5baf4..08b0840fd9 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py @@ -55,3 +55,56 @@ def foo(): match inside_func: # comment case "bar": pass + + +match newlines: + + # case 1 leading comment + + + case "top level case comment with newlines": # case dangling comment + # pass leading comment + pass + # pass trailing comment + + + # case 2 leading comment + + + + case "case comment with newlines" if foo == 2: # second + pass + + case "one", "newline" if (foo := 1): # third + pass + + + case "two newlines": + pass + + + + case "three newlines": + pass + case _: + pass + + +match long_lines: + case "this is a long line for if condition" if aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2: # comment + pass + + case "this is a long line for if condition with parentheses" if (aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2): # comment + pass + + case "named expressions aren't special" if foo := 1: + pass + + case "named expressions aren't that special" if (foo := 1): + pass + + case "but with already broken long lines" if ( + aaaaaaahhhhhhhhhhh == 1 and + bbbbbbbbaaaaaahhhh == 2 + ): # another comment + pass diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 81035bf7dd..d55ec6c91b 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -213,6 +213,7 @@ fn is_first_statement_in_body(statement: AnyNodeRef, has_body: AnyNodeRef) -> bo | AnyNodeRef::ExceptHandlerExceptHandler(ast::ExceptHandlerExceptHandler { body, .. }) + | AnyNodeRef::MatchCase(ast::MatchCase { body, .. }) | AnyNodeRef::StmtFunctionDef(ast::StmtFunctionDef { body, .. }) | AnyNodeRef::StmtClassDef(ast::StmtClassDef { body, .. }) => { are_same_optional(statement, body.first()) diff --git a/crates/ruff_python_formatter/src/other/match_case.rs b/crates/ruff_python_formatter/src/other/match_case.rs index f2dc80f93a..bd3050af0e 100644 --- a/crates/ruff_python_formatter/src/other/match_case.rs +++ b/crates/ruff_python_formatter/src/other/match_case.rs @@ -1,8 +1,7 @@ use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::MatchCase; -use crate::expression::maybe_parenthesize_expression; -use crate::expression::parentheses::Parenthesize; +use crate::comments::trailing_comments; use crate::not_yet_implemented_custom_text; use crate::prelude::*; use crate::{FormatNodeRule, PyFormatter}; @@ -19,6 +18,9 @@ impl FormatNodeRule for FormatMatchCase { body, } = item; + let comments = f.context().comments().clone(); + let dangling_item_comments = comments.dangling_comments(item); + write!( f, [ @@ -39,17 +41,21 @@ impl FormatNodeRule for FormatMatchCase { )?; if let Some(guard) = guard { - write!( - f, - [ - space(), - text("if"), - space(), - maybe_parenthesize_expression(guard, item, Parenthesize::IfBreaks) - ] - )?; + write!(f, [space(), text("if"), space(), guard.format()])?; } - write!(f, [text(":"), block_indent(&body.format())]) + write!( + f, + [ + text(":"), + trailing_comments(dangling_item_comments), + block_indent(&body.format()) + ] + ) + } + + fn fmt_dangling_comments(&self, _node: &MatchCase, _f: &mut PyFormatter) -> FormatResult<()> { + // Handled as part of `fmt_fields` + Ok(()) } } diff --git a/crates/ruff_python_formatter/src/pattern/mod.rs b/crates/ruff_python_formatter/src/pattern/mod.rs index 992f90a49d..9099772a4d 100644 --- a/crates/ruff_python_formatter/src/pattern/mod.rs +++ b/crates/ruff_python_formatter/src/pattern/mod.rs @@ -1,3 +1,8 @@ +use ruff_formatter::{FormatOwnedWithRule, FormatRefWithRule}; +use ruff_python_ast::Pattern; + +use crate::prelude::*; + pub(crate) mod pattern_match_as; pub(crate) mod pattern_match_class; pub(crate) mod pattern_match_mapping; @@ -6,3 +11,37 @@ pub(crate) mod pattern_match_sequence; pub(crate) mod pattern_match_singleton; pub(crate) mod pattern_match_star; pub(crate) mod pattern_match_value; + +#[derive(Default)] +pub struct FormatPattern; + +impl FormatRule> for FormatPattern { + fn fmt(&self, item: &Pattern, f: &mut PyFormatter) -> FormatResult<()> { + match item { + Pattern::MatchValue(p) => p.format().fmt(f), + Pattern::MatchSingleton(p) => p.format().fmt(f), + Pattern::MatchSequence(p) => p.format().fmt(f), + Pattern::MatchMapping(p) => p.format().fmt(f), + Pattern::MatchClass(p) => p.format().fmt(f), + Pattern::MatchStar(p) => p.format().fmt(f), + Pattern::MatchAs(p) => p.format().fmt(f), + Pattern::MatchOr(p) => p.format().fmt(f), + } + } +} + +impl<'ast> AsFormat> for Pattern { + type Format<'a> = FormatRefWithRule<'a, Pattern, FormatPattern, PyFormatContext<'ast>>; + + fn format(&self) -> Self::Format<'_> { + FormatRefWithRule::new(self, FormatPattern) + } +} + +impl<'ast> IntoFormat> for Pattern { + type Format = FormatOwnedWithRule>; + + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new(self, FormatPattern) + } +} diff --git a/crates/ruff_python_formatter/src/statement/stmt_match.rs b/crates/ruff_python_formatter/src/statement/stmt_match.rs index 6971950c90..d56b739590 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_match.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_match.rs @@ -1,7 +1,8 @@ -use ruff_formatter::{write, Buffer, FormatResult}; +use ruff_formatter::{format_args, write, Buffer, FormatResult}; use ruff_python_ast::StmtMatch; -use crate::comments::trailing_comments; +use crate::comments::{leading_alternate_branch_comments, trailing_comments}; +use crate::context::{NodeLevel, WithNodeLevel}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; use crate::prelude::*; @@ -35,8 +36,29 @@ impl FormatNodeRule for FormatStmtMatch { ] )?; - for case in cases { - write!(f, [block_indent(&case.format())])?; + let mut cases_iter = cases.iter(); + let Some(first) = cases_iter.next() else { + return Ok(()); + }; + + // The new level is for the `case` nodes. + let mut f = WithNodeLevel::new(NodeLevel::CompoundStatement, f); + + write!(f, [block_indent(&first.format())])?; + let mut last_case = first; + + for case in cases_iter { + write!( + f, + [block_indent(&format_args!( + &leading_alternate_branch_comments( + comments.leading_comments(case), + last_case.body.last(), + ), + &case.format() + ))] + )?; + last_case = case; } Ok(()) diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap index e498853715..4f33ce6e7c 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap @@ -265,7 +265,7 @@ match x: + case NOT_YET_IMPLEMENTED_Pattern: y = 0 - case [1, 0] if (x := x[:0]): -+ case NOT_YET_IMPLEMENTED_Pattern if x := x[:0]: ++ case NOT_YET_IMPLEMENTED_Pattern if (x := x[:0]): y = 1 - case [1, 0]: + case NOT_YET_IMPLEMENTED_Pattern: @@ -431,7 +431,7 @@ match (0, 1, 2): match x: case NOT_YET_IMPLEMENTED_Pattern: y = 0 - case NOT_YET_IMPLEMENTED_Pattern if x := x[:0]: + case NOT_YET_IMPLEMENTED_Pattern if (x := x[:0]): y = 1 case NOT_YET_IMPLEMENTED_Pattern: y = 2 diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap index f107f563a0..0f09fd2007 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap @@ -205,7 +205,7 @@ match bar1: assert "map" == b -@@ -59,61 +62,47 @@ +@@ -59,61 +62,51 @@ ), case, ): @@ -217,11 +217,11 @@ match bar1: - ): + case NOT_YET_IMPLEMENTED_Pattern: pass -- + - case [a as match]: + case NOT_YET_IMPLEMENTED_Pattern: pass -- + - case case: + case NOT_YET_IMPLEMENTED_Pattern: pass @@ -255,11 +255,11 @@ match bar1: - case 1 as a: + case NOT_YET_IMPLEMENTED_Pattern: pass -- + - case 2 as b, 3 as c: + case NOT_YET_IMPLEMENTED_Pattern: pass -- + - case 4 as d, (5 as e), (6 | 7 as g), *h: + case NOT_YET_IMPLEMENTED_Pattern: pass @@ -351,8 +351,10 @@ match match( ): case NOT_YET_IMPLEMENTED_Pattern: pass + case NOT_YET_IMPLEMENTED_Pattern: pass + case NOT_YET_IMPLEMENTED_Pattern: pass @@ -377,8 +379,10 @@ match something: match something: case NOT_YET_IMPLEMENTED_Pattern: pass + case NOT_YET_IMPLEMENTED_Pattern: pass + case NOT_YET_IMPLEMENTED_Pattern: pass diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap index c5fea0c542..5226bfc31a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap @@ -203,7 +203,7 @@ def where_is(point): match event.get(): - case Click((x, y), button=Button.LEFT): # This is a left click -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_Pattern: # This is a left click handle_click_at(x, y) - case Click(): + case NOT_YET_IMPLEMENTED_Pattern: @@ -306,7 +306,7 @@ match event.get(): raise ValueError(f"Unrecognized event: {other_event}") match event.get(): - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_Pattern: # This is a left click handle_click_at(x, y) case NOT_YET_IMPLEMENTED_Pattern: pass # ignore other clicks diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap index 2f1f0ea0b9..8bcbe70db7 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap @@ -31,21 +31,21 @@ def http_status(status): ```diff --- Black +++ Ruff -@@ -1,13 +1,10 @@ +@@ -1,13 +1,13 @@ def http_status(status): match status: - case 400: + case NOT_YET_IMPLEMENTED_Pattern: return "Bad request" -- + - case 401: + case NOT_YET_IMPLEMENTED_Pattern: return "Unauthorized" -- + - case 403: + case NOT_YET_IMPLEMENTED_Pattern: return "Forbidden" -- + - case 404: + case NOT_YET_IMPLEMENTED_Pattern: return "Not found" @@ -58,10 +58,13 @@ def http_status(status): match status: case NOT_YET_IMPLEMENTED_Pattern: return "Bad request" + case NOT_YET_IMPLEMENTED_Pattern: return "Unauthorized" + case NOT_YET_IMPLEMENTED_Pattern: return "Forbidden" + case NOT_YET_IMPLEMENTED_Pattern: return "Not found" ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap index f794cbc12a..55f553ad20 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap @@ -61,6 +61,59 @@ def foo(): match inside_func: # comment case "bar": pass + + +match newlines: + + # case 1 leading comment + + + case "top level case comment with newlines": # case dangling comment + # pass leading comment + pass + # pass trailing comment + + + # case 2 leading comment + + + + case "case comment with newlines" if foo == 2: # second + pass + + case "one", "newline" if (foo := 1): # third + pass + + + case "two newlines": + pass + + + + case "three newlines": + pass + case _: + pass + + +match long_lines: + case "this is a long line for if condition" if aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2: # comment + pass + + case "this is a long line for if condition with parentheses" if (aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2): # comment + pass + + case "named expressions aren't special" if foo := 1: + pass + + case "named expressions aren't that special" if (foo := 1): + pass + + case "but with already broken long lines" if ( + aaaaaaahhhhhhhhhhh == 1 and + bbbbbbbbaaaaaahhhh == 2 + ): # another comment + pass ``` ## Output @@ -124,6 +177,52 @@ def foo(): match inside_func: # comment case NOT_YET_IMPLEMENTED_Pattern: pass + + +match newlines: + # case 1 leading comment + + case NOT_YET_IMPLEMENTED_Pattern: # case dangling comment + # pass leading comment + pass + # pass trailing comment + + # case 2 leading comment + + case NOT_YET_IMPLEMENTED_Pattern if foo == 2: # second + pass + + case NOT_YET_IMPLEMENTED_Pattern if (foo := 1): # third + pass + + case NOT_YET_IMPLEMENTED_Pattern: + pass + + case NOT_YET_IMPLEMENTED_Pattern: + pass + case NOT_YET_IMPLEMENTED_Pattern: + pass + + +match long_lines: + case NOT_YET_IMPLEMENTED_Pattern if aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2: # comment + pass + + case NOT_YET_IMPLEMENTED_Pattern if ( + aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2 + ): # comment + pass + + case NOT_YET_IMPLEMENTED_Pattern if foo := 1: + pass + + case NOT_YET_IMPLEMENTED_Pattern if (foo := 1): + pass + + case NOT_YET_IMPLEMENTED_Pattern if ( + aaaaaaahhhhhhhhhhh == 1 and bbbbbbbbaaaaaahhhh == 2 + ): # another comment + pass ``` From 0c9ded9d840622e87931debb5174a9d5aecd099f Mon Sep 17 00:00:00 2001 From: konsti Date: Fri, 11 Aug 2023 15:51:54 +0200 Subject: [PATCH 080/155] Use a faster diffing library for the formatter ecosystem checks (#6497) **Summary** Some files seems notoriously slow in the formatter (secons in debug mode). This time was however almost exclusively spent in the diff algorithm to collect the similarity index, so i replaced that. I kept `similar` for printing actual diff to avoid rewriting that too, with the disadvantage that we now have to diff libraries in format_dev. I used this PR to remove the spinner from tracing-indicatif and changed `flamegraph --perfdata perf.data` to `flamegraph --perfdata perf.data --no-inline` as the former wouldn't finish for me on release builds with debug info. --- CONTRIBUTING.md | 2 +- Cargo.lock | 23 +++++++++++++++ crates/ruff_dev/Cargo.toml | 5 ++++ crates/ruff_dev/src/format_dev.rs | 47 +++++++++++++++++++------------ 4 files changed, 58 insertions(+), 19 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df06b40efc..6250515efd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -571,7 +571,7 @@ An alternative is to convert the perf data to `flamegraph.svg` using [flamegraph](https://github.com/flamegraph-rs/flamegraph) (`cargo install flamegraph`): ```shell -flamegraph --perfdata perf.data +flamegraph --perfdata perf.data --no-inline ``` #### Mac diff --git a/Cargo.lock b/Cargo.lock index d83d108da5..b7341c4264 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,18 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.20" @@ -991,6 +1003,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "imara-diff" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e98c1d0ad70fc91b8b9654b1f33db55e59579d3b3de2bffdced0fdb810570cb8" +dependencies = [ + "ahash", + "hashbrown 0.12.3", +] + [[package]] name = "imperative" version = "1.0.4" @@ -2197,6 +2219,7 @@ dependencies = [ "anyhow", "clap", "ignore", + "imara-diff", "indicatif", "indoc", "itertools", diff --git a/crates/ruff_dev/Cargo.toml b/crates/ruff_dev/Cargo.toml index 505a375308..ccf81d3c9e 100644 --- a/crates/ruff_dev/Cargo.toml +++ b/crates/ruff_dev/Cargo.toml @@ -44,6 +44,11 @@ toml = { workspace = true, features = ["parse"] } tracing = { workspace = true } tracing-indicatif = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } +imara-diff = "0.1.5" + +[features] +# Turn off rayon for profiling +singlethreaded = [] [dev-dependencies] indoc = "2.0.3" diff --git a/crates/ruff_dev/src/format_dev.rs b/crates/ruff_dev/src/format_dev.rs index 79966a7c06..e04759884f 100644 --- a/crates/ruff_dev/src/format_dev.rs +++ b/crates/ruff_dev/src/format_dev.rs @@ -1,7 +1,11 @@ use anyhow::{bail, format_err, Context, Error}; use clap::{CommandFactory, FromArgMatches}; use ignore::DirEntry; +use imara_diff::intern::InternedInput; +use imara_diff::sink::Counter; +use imara_diff::{diff, Algorithm}; use indicatif::ProgressStyle; +#[cfg_attr(feature = "singlethreaded", allow(unused_imports))] use rayon::iter::{IntoParallelIterator, ParallelIterator}; use ruff::logging::LogLevel; use ruff::resolver::python_files_in_path; @@ -99,16 +103,18 @@ impl Statistics { intersection, } } else { - let diff = TextDiff::from_lines(black, ruff); - let mut statistics = Self::default(); - for change in diff.iter_all_changes() { - match change.tag() { - ChangeTag::Delete => statistics.black_input += 1, - ChangeTag::Insert => statistics.ruff_output += 1, - ChangeTag::Equal => statistics.intersection += 1, - } + // `similar` was too slow (for some files >90% diffing instead of formatting) + let input = InternedInput::new(black, ruff); + let changes = diff(Algorithm::Histogram, &input, Counter::default()); + assert_eq!( + input.before.len() - (changes.removals as usize), + input.after.len() - (changes.insertions as usize) + ); + Self { + black_input: changes.removals, + ruff_output: changes.insertions, + intersection: u32::try_from(input.before.len()).unwrap() - changes.removals, } - statistics } } @@ -253,7 +259,10 @@ fn setup_logging(log_level_args: &LogLevelArgs, log_file: Option<&Path>) -> io:: .with_default_directive(log_level.into()) .parse_lossy("") }); - let indicatif_layer = IndicatifLayer::new(); + let indicatif_layer = IndicatifLayer::new().with_progress_style( + // Default without the spinner + ProgressStyle::with_template("{span_child_prefix} {span_name}{{{span_fields}}}").unwrap(), + ); let indicitif_compatible_writer_layer = tracing_subscriber::fmt::layer() .with_writer(indicatif_layer.get_stderr_writer()) .with_target(false); @@ -430,14 +439,16 @@ fn format_dev_project( pb_span.pb_set_style(&ProgressStyle::default_bar()); pb_span.pb_set_length(paths.len() as u64); let _pb_span_enter = pb_span.enter(); - paths - .into_par_iter() - .map(|dir_entry| { - let result = format_dir_entry(dir_entry, stability_check, write, &black_options); - pb_span.pb_inc(1); - result - }) - .collect::>>()? + #[cfg(not(feature = "singlethreaded"))] + let iter = { paths.into_par_iter() }; + #[cfg(feature = "singlethreaded")] + let iter = { paths.into_iter() }; + iter.map(|dir_entry| { + let result = format_dir_entry(dir_entry, stability_check, write, &black_options); + pb_span.pb_inc(1); + result + }) + .collect::>>()? }; let mut statistics = Statistics::default(); From 7c4aa3948b589e0ef12c982d34ba99facabdf0df Mon Sep 17 00:00:00 2001 From: Chris Pryer <14341145+cnpryer@users.noreply.github.com> Date: Fri, 11 Aug 2023 13:46:59 -0400 Subject: [PATCH 081/155] Fix typo in MeasureMode comment (#6508) --- crates/ruff_formatter/src/printer/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ruff_formatter/src/printer/mod.rs b/crates/ruff_formatter/src/printer/mod.rs index b31260147d..e24ab80ea8 100644 --- a/crates/ruff_formatter/src/printer/mod.rs +++ b/crates/ruff_formatter/src/printer/mod.rs @@ -1379,7 +1379,7 @@ enum MeasureMode { /// Returns FirstLine, - /// The content only fits if non of the lines exceed the print width. Lines are terminated by either + /// The content only fits if none of the lines exceed the print width. Lines are terminated by either /// a hard line break or a soft line break in [`PrintMode::Expanded`]. AllLines, } From d616c9b8701655541b9715a9dbc8ccf87b0087de Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 11 Aug 2023 13:58:42 -0400 Subject: [PATCH 082/155] Avoid omitting optional parentheses for argument-less parentheses (#6484) ## Summary This PR fixes some misformattings around optional parentheses for expressions. I first noticed that we were misformatting this: ```python return ( unicodedata.normalize("NFKC", s1).casefold() == unicodedata.normalize("NFKC", s2).casefold() ) ``` The above is stable Black formatting, but we were doing: ```python return unicodedata.normalize("NFKC", s1).casefold() == unicodedata.normalize( "NFKC", s2 ).casefold() ``` Above, the "last" expression is a function call, so our `can_omit_optional_parentheses` was returning `true`... However, it turns out that Black treats function calls differently depending on whether or not they have arguments -- presumedly because they'll never split empty parentheses, and so they're functionally non-useful. On further investigation, I believe this applies to all parenthesized expressions. If Black can't split on the parentheses, it doesn't leverage them when removing optional parentheses. ## Test Plan Nice increase in similarity scores. Before: - `zulip`: 0.99702 - `django`: 0.99784 - `warehouse`: 0.99585 - `build`: 0.75623 - `transformers`: 0.99470 - `cpython`: 0.75989 - `typeshed`: 0.74853 After: - `zulip`: 0.99705 - `django`: 0.99795 - `warehouse`: 0.99600 - `build`: 0.75623 - `transformers`: 0.99471 - `cpython`: 0.75989 - `typeshed`: 0.74853 --- .../ruff/expression/split_empty_brackets.py | 90 ++++++++ .../test/fixtures/ruff/statement/assign.py | 11 + .../src/expression/mod.rs | 135 +++++++++--- .../src/statement/stmt_assign.rs | 5 +- .../format@expression__compare.py.snap | 7 +- ...t@expression__split_empty_brackets.py.snap | 197 ++++++++++++++++++ .../format@statement__assign.py.snap | 19 ++ 7 files changed, 428 insertions(+), 36 deletions(-) create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/split_empty_brackets.py create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@expression__split_empty_brackets.py.snap diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/split_empty_brackets.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/split_empty_brackets.py new file mode 100644 index 0000000000..309d0cdfd5 --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/split_empty_brackets.py @@ -0,0 +1,90 @@ +# Expressions with empty parentheses. +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold() + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold(1) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold(0) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold(1) +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold(1) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold(1) +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold( + # foo + ) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold( + # foo + ) +) + +ct_match = ( + [].unicodedata.normalize("NFKC", s1).casefold() + == [].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + [].unicodedata.normalize("NFKC", s1).casefold() + == [1].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + [1].unicodedata.normalize("NFKC", s1).casefold() + == [].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + [1].unicodedata.normalize("NFKC", s1).casefold() + == [1].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {}.unicodedata.normalize("NFKC", s1).casefold() + == {}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {}.unicodedata.normalize("NFKC", s1).casefold() + == {1}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {1}.unicodedata.normalize("NFKC", s1).casefold() + == {}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {1}.unicodedata.normalize("NFKC", s1).casefold() + == {1}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + ([]).unicodedata.normalize("NFKC", s1).casefold() + == ([]).unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +return await self.http_client.fetch( + f"http://127.0.0.1:{self.port}{path}", method=method, **kwargs, +) + +return await self.http_client().fetch( + f"http://127.0.0.1:{self.port}{path}", method=method, **kwargs, +) + +return await self().http_client().fetch( + f"http://127.0.0.1:{self.port}{path}", method=method, **kwargs, +) + +response = await sync_to_async( + lambda: self.django_handler.get_response(request), thread_sensitive=True +)() diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py index a0317eac9a..7d098301a4 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py @@ -13,6 +13,17 @@ aa = [ bakjdshflkjahdslkfjlasfdahjlfds ] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] +aa = [ + +] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + +aa = [ + # foo +] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + +aa = ([ +]) = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + aaaa = ( # trailing # comment bbbbb) = cccccccccccccccc = 3 diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index 672e7f4c72..b32f720475 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -271,10 +271,12 @@ impl<'ast> IntoFormat> for Expr { /// /// This mimics Black's [`_maybe_split_omitting_optional_parens`](https://github.com/psf/black/blob/d1248ca9beaf0ba526d265f4108836d89cf551b7/src/black/linegen.py#L746-L820) fn can_omit_optional_parentheses(expr: &Expr, context: &PyFormatContext) -> bool { - let mut visitor = CanOmitOptionalParenthesesVisitor::new(context.source()); + let mut visitor = CanOmitOptionalParenthesesVisitor::new(context); visitor.visit_subexpression(expr); - if visitor.max_priority_count > 1 { + if visitor.max_priority == OperatorPriority::None { + true + } else if visitor.max_priority_count > 1 { false } else if visitor.max_priority == OperatorPriority::Attribute { true @@ -282,13 +284,14 @@ fn can_omit_optional_parentheses(expr: &Expr, context: &PyFormatContext) -> bool // Only use the more complex IR when there is any expression that we can possibly split by false } else { - // Only use the layout if the first or last expression has parentheses of some sort. - let first_parenthesized = visitor - .first - .is_some_and(|first| has_parentheses(first, visitor.source)); - let last_parenthesized = visitor - .last - .is_some_and(|last| has_parentheses(last, visitor.source)); + // Only use the layout if the first or last expression has parentheses of some sort, and + // those parentheses are non-empty. + let first_parenthesized = visitor.first.is_some_and(|first| { + has_parentheses(first, context).is_some_and(|parentheses| parentheses.is_non_empty()) + }); + let last_parenthesized = visitor.last.is_some_and(|last| { + has_parentheses(last, context).is_some_and(|parentheses| parentheses.is_non_empty()) + }); first_parenthesized || last_parenthesized } } @@ -300,13 +303,13 @@ struct CanOmitOptionalParenthesesVisitor<'input> { any_parenthesized_expressions: bool, last: Option<&'input Expr>, first: Option<&'input Expr>, - source: &'input str, + context: &'input PyFormatContext<'input>, } impl<'input> CanOmitOptionalParenthesesVisitor<'input> { - fn new(source: &'input str) -> Self { + fn new(context: &'input PyFormatContext) -> Self { Self { - source, + context, max_priority: OperatorPriority::None, max_priority_count: 0, any_parenthesized_expressions: false, @@ -415,7 +418,7 @@ impl<'input> CanOmitOptionalParenthesesVisitor<'input> { ctx: _, }) => { self.visit_expr(value); - if has_parentheses(value, self.source) { + if has_parentheses(value, self.context).is_some() { self.update_max_priority(OperatorPriority::Attribute); } self.last = Some(expr); @@ -446,7 +449,7 @@ impl<'input> PreorderVisitor<'input> for CanOmitOptionalParenthesesVisitor<'inpu self.last = Some(expr); // Rule only applies for non-parenthesized expressions. - if is_expression_parenthesized(AnyNodeRef::from(expr), self.source) { + if is_expression_parenthesized(AnyNodeRef::from(expr), self.context.source()) { self.any_parenthesized_expressions = true; } else { self.visit_subexpression(expr); @@ -509,7 +512,7 @@ impl CallChainLayout { // ``` // f().g // ^^^ value - // data[:100].T` + // data[:100].T // ^^^^^^^^^^ value // ``` if matches!(value.as_ref(), Expr::Call(_) | Expr::Subscript(_)) { @@ -576,23 +579,95 @@ impl CallChainLayout { } } -fn has_parentheses(expr: &Expr, source: &str) -> bool { - has_own_parentheses(expr) || is_expression_parenthesized(AnyNodeRef::from(expr), source) +#[derive(Debug, Copy, Clone, PartialEq, Eq, is_macro::Is)] +pub(crate) enum OwnParentheses { + /// The node has parentheses, but they are empty (e.g., `[]` or `f()`). + Empty, + /// The node has parentheses, and they are non-empty (e.g., `[1]` or `f(1)`). + NonEmpty, } -pub(crate) const fn has_own_parentheses(expr: &Expr) -> bool { - matches!( - expr, - Expr::Dict(_) - | Expr::List(_) - | Expr::Tuple(_) - | Expr::Set(_) - | Expr::ListComp(_) - | Expr::SetComp(_) - | Expr::DictComp(_) - | Expr::Call(_) - | Expr::Subscript(_) - ) +/// Returns the [`OwnParentheses`] value for a given [`Expr`], to indicate whether it has its +/// own parentheses or is itself parenthesized. +/// +/// Differs from [`has_own_parentheses`] in that it returns [`OwnParentheses::NonEmpty`] for +/// parenthesized expressions, like `(1)` or `([1])`, regardless of whether those expression have +/// their _own_ parentheses. +fn has_parentheses(expr: &Expr, context: &PyFormatContext) -> Option { + let own_parentheses = has_own_parentheses(expr, context); + + // If the node has its own non-empty parentheses, we don't need to check for surrounding + // parentheses (e.g., `[1]`, or `([1])`). + if own_parentheses == Some(OwnParentheses::NonEmpty) { + return own_parentheses; + } + + // Otherwise, if the node lacks parentheses (e.g., `(1)`) or only contains empty parentheses + // (e.g., `([])`), we need to check for surrounding parentheses. + if is_expression_parenthesized(AnyNodeRef::from(expr), context.source()) { + return Some(OwnParentheses::NonEmpty); + } + + own_parentheses +} + +/// Returns the [`OwnParentheses`] value for a given [`Expr`], to indicate whether it has its +/// own parentheses, and whether those parentheses are empty. +/// +/// A node is considered to have its own parentheses if it includes a `[]`, `()`, or `{}` pair +/// that is inherent to the node (e.g., as in `f()`, `[]`, or `{1: 2}`, but not `(a.b.c)`). +/// +/// Parentheses are considered to be non-empty if they contain any elements or comments. +pub(crate) fn has_own_parentheses( + expr: &Expr, + context: &PyFormatContext, +) -> Option { + match expr { + // These expressions are always non-empty. + Expr::ListComp(_) | Expr::SetComp(_) | Expr::DictComp(_) | Expr::Subscript(_) => { + Some(OwnParentheses::NonEmpty) + } + + // These expressions must contain _some_ child or trivia token in order to be non-empty. + Expr::List(ast::ExprList { elts, .. }) + | Expr::Set(ast::ExprSet { elts, .. }) + | Expr::Tuple(ast::ExprTuple { elts, .. }) => { + if !elts.is_empty() + || context + .comments() + .has_dangling_comments(AnyNodeRef::from(expr)) + { + Some(OwnParentheses::NonEmpty) + } else { + Some(OwnParentheses::Empty) + } + } + + Expr::Dict(ast::ExprDict { keys, .. }) => { + if !keys.is_empty() + || context + .comments() + .has_dangling_comments(AnyNodeRef::from(expr)) + { + Some(OwnParentheses::NonEmpty) + } else { + Some(OwnParentheses::Empty) + } + } + Expr::Call(ast::ExprCall { arguments, .. }) => { + if !arguments.is_empty() + || context + .comments() + .has_dangling_comments(AnyNodeRef::from(expr)) + { + Some(OwnParentheses::NonEmpty) + } else { + Some(OwnParentheses::Empty) + } + } + + _ => None, + } } #[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] diff --git a/crates/ruff_python_formatter/src/statement/stmt_assign.rs b/crates/ruff_python_formatter/src/statement/stmt_assign.rs index 99c23d2de9..ac93608c2b 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_assign.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_assign.rs @@ -1,6 +1,5 @@ -use ruff_python_ast::{Expr, StmtAssign}; - use ruff_formatter::{format_args, write, FormatError}; +use ruff_python_ast::{Expr, StmtAssign}; use crate::context::{NodeLevel, WithNodeLevel}; use crate::expression::parentheses::{Parentheses, Parenthesize}; @@ -52,7 +51,7 @@ struct FormatTargets<'a> { impl Format> for FormatTargets<'_> { fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { if let Some((first, rest)) = self.targets.split_first() { - let can_omit_parentheses = has_own_parentheses(first); + let can_omit_parentheses = has_own_parentheses(first, f.context()).is_some(); let group_id = if can_omit_parentheses { Some(f.group_id("assignment_parentheses")) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap index 91690dd6de..e47b22e60a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__compare.py.snap @@ -226,9 +226,10 @@ return 1 == 2 and ( def f(): - return unicodedata.normalize("NFKC", s1).casefold() == unicodedata.normalize( - "NFKC", s2 - ).casefold() + return ( + unicodedata.normalize("NFKC", s1).casefold() + == unicodedata.normalize("NFKC", s2).casefold() + ) # Call expressions with trailing attributes. diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__split_empty_brackets.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__split_empty_brackets.py.snap new file mode 100644 index 0000000000..c923784d04 --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__split_empty_brackets.py.snap @@ -0,0 +1,197 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/split_empty_brackets.py +--- +## Input +```py +# Expressions with empty parentheses. +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold() + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold(1) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold(0) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold(1) +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold(1) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold(1) +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold( + # foo + ) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold( + # foo + ) +) + +ct_match = ( + [].unicodedata.normalize("NFKC", s1).casefold() + == [].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + [].unicodedata.normalize("NFKC", s1).casefold() + == [1].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + [1].unicodedata.normalize("NFKC", s1).casefold() + == [].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + [1].unicodedata.normalize("NFKC", s1).casefold() + == [1].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {}.unicodedata.normalize("NFKC", s1).casefold() + == {}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {}.unicodedata.normalize("NFKC", s1).casefold() + == {1}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {1}.unicodedata.normalize("NFKC", s1).casefold() + == {}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {1}.unicodedata.normalize("NFKC", s1).casefold() + == {1}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + ([]).unicodedata.normalize("NFKC", s1).casefold() + == ([]).unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +return await self.http_client.fetch( + f"http://127.0.0.1:{self.port}{path}", method=method, **kwargs, +) + +return await self.http_client().fetch( + f"http://127.0.0.1:{self.port}{path}", method=method, **kwargs, +) + +return await self().http_client().fetch( + f"http://127.0.0.1:{self.port}{path}", method=method, **kwargs, +) + +response = await sync_to_async( + lambda: self.django_handler.get_response(request), thread_sensitive=True +)() +``` + +## Output +```py +# Expressions with empty parentheses. +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold() + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold(1) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = unicodedata.normalize("NFKC", s1).casefold(0) == unicodedata.normalize( + "NFKCNFKCNFKCNFKCNFKC", s2 +).casefold(1) + +ct_match = unicodedata.normalize("NFKC", s1).casefold(1) == unicodedata.normalize( + "NFKCNFKCNFKCNFKCNFKC", s2 +).casefold(1) + +ct_match = ( + unicodedata.normalize("NFKC", s1).casefold( + # foo + ) + == unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold( + # foo + ) +) + +ct_match = ( + [].unicodedata.normalize("NFKC", s1).casefold() + == [].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + [].unicodedata.normalize("NFKC", s1).casefold() + == [1].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = [1].unicodedata.normalize("NFKC", s1).casefold() == [].unicodedata.normalize( + "NFKCNFKCNFKCNFKCNFKC", s2 +).casefold() + +ct_match = [1].unicodedata.normalize("NFKC", s1).casefold() == [ + 1 +].unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() + +ct_match = ( + {}.unicodedata.normalize("NFKC", s1).casefold() + == {}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = ( + {}.unicodedata.normalize("NFKC", s1).casefold() + == {1}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() +) + +ct_match = {1}.unicodedata.normalize("NFKC", s1).casefold() == {}.unicodedata.normalize( + "NFKCNFKCNFKCNFKCNFKC", s2 +).casefold() + +ct_match = {1}.unicodedata.normalize("NFKC", s1).casefold() == { + 1 +}.unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() + +ct_match = ([]).unicodedata.normalize("NFKC", s1).casefold() == ( + [] +).unicodedata.normalize("NFKCNFKCNFKCNFKCNFKC", s2).casefold() + +return await self.http_client.fetch( + f"http://127.0.0.1:{self.port}{path}", + method=method, + **kwargs, +) + +return await self.http_client().fetch( + f"http://127.0.0.1:{self.port}{path}", + method=method, + **kwargs, +) + +return ( + await self() + .http_client() + .fetch( + f"http://127.0.0.1:{self.port}{path}", + method=method, + **kwargs, + ) +) + +response = await sync_to_async( + lambda: self.django_handler.get_response(request), thread_sensitive=True +)() +``` + + + diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap index 4134d2b91e..61b8c72246 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap @@ -19,6 +19,17 @@ aa = [ bakjdshflkjahdslkfjlasfdahjlfds ] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] +aa = [ + +] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + +aa = [ + # foo +] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + +aa = ([ +]) = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + aaaa = ( # trailing # comment bbbbb) = cccccccccccccccc = 3 @@ -47,6 +58,14 @@ aa = [ bakjdshflkjahdslkfjlasfdahjlfds ] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] +aa = [] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + +aa = [ + # foo +] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + +aa = [] = dddd = ddd = fkjaödkjaföjfahlfdalfhaöfaöfhaöfha = g = [3] + aaaa = ( # trailing # comment bbbbb From 53246b725edfd902ac7cdc7f3f466ce29fa1d14d Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 11 Aug 2023 14:19:21 -0400 Subject: [PATCH 083/155] Allow return type annotations to use their own parentheses (#6436) ## Summary This PR modifies our logic for wrapping return type annotations. Previously, we _always_ wrapped the annotation in parentheses if it expanded; however, Black only exhibits this behavior when the function parameters is empty (i.e., it doesn't and can't break). In other cases, it uses the normal parenthesization rules, allowing nodes to bring their own parentheses. For example, given: ```python def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> Set[ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ]: ... def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> Set[ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ]: ... ``` Black will format as: ```python def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( Set[ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ] ): ... def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( x, ) -> Set[ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ]: ... ``` Whereas, prior to this PR, Ruff would format as: ```python def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( Set[ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ] ): ... def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( x, ) -> ( Set[ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ] ): ... ``` Closes https://github.com/astral-sh/ruff/issues/6431. ## Test Plan Before: - `zulip`: 0.99702 - `django`: 0.99784 - `warehouse`: 0.99585 - `build`: 0.75623 - `transformers`: 0.99470 - `cpython`: 0.75988 - `typeshed`: 0.74853 After: - `zulip`: 0.99724 - `django`: 0.99791 - `warehouse`: 0.99586 - `build`: 0.75623 - `transformers`: 0.99474 - `cpython`: 0.75956 - `typeshed`: 0.74857 --- .../test/fixtures/ruff/statement/function.py | 64 --- .../ruff/statement/return_annotation.py | 182 +++++++ .../src/expression/mod.rs | 40 +- .../src/expression/parentheses.rs | 9 +- .../src/statement/stmt_function_def.rs | 86 ++- ..._cases__return_annotation_brackets.py.snap | 15 +- .../format@statement__function.py.snap | 199 ------- ...ormat@statement__return_annotation.py.snap | 513 ++++++++++++++++++ 8 files changed, 814 insertions(+), 294 deletions(-) create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return_annotation.py create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py index d242751143..42e643032c 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py @@ -371,67 +371,3 @@ def f( # first # third ): ... - -# Handle comments on empty tuple return types. -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - # comment -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - 1 -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - 1, 2 -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - (1, 2) -): ... - -def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 - self, m: Match[str], data: str -) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: - ... - -def double(a: int # Hello -) -> (int): - return 2 * a - -def double(a: int) -> ( # Hello - int -): - return 2*a - -def double(a: int) -> ( # Hello -): - return 2*a - -# Breaking over parameters and return types. (Black adds a trailing comma when the -# function arguments break here with a single argument; we do not.) -def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: - ... - -def f(a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> a: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: - ... diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return_annotation.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return_annotation.py new file mode 100644 index 0000000000..f7b043d477 --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return_annotation.py @@ -0,0 +1,182 @@ +# Handle comments on empty tuple return types. +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + # comment +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1, 2 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + (1, 2) +): ... + +def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 + self, m: Match[str], data: str +) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: + ... + +def double(a: int # Hello +) -> (int): + return 2 * a + +def double(a: int) -> ( # Hello + int +): + return 2*a + +def double(a: int) -> ( # Hello +): + return 2*a + +# Breaking over parameters and return types. (Black adds a trailing comma when the +# function arguments break here with a single argument; we do not.) +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... + +def f(a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> a: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... + +# Breaking return type annotations. Black adds parentheses if the parameters are +# empty; otherwise, it leverages the expressions own parentheses if possible. +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"] +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"] +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"] +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(*args) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( # foo +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + # bar +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x) -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x) -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> (X + Y + foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> (X + Y + foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> (X and Y and foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> (X and Y and foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> (X | Y | foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> (X | Y | foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + X | Y | foooooooooooooooooooooooooooooooooooo() # comment +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> ( + X | Y | foooooooooooooooooooooooooooooooooooo() # comment +): + ... + + +def double() -> first_item and foo.bar.baz().bop(1,): + return 2 * a + + +# Dangling comments on return annotations. +def double(a: int) -> ( + int # Hello +): + return 2*a + +def double(a: int) -> ( + foo.bar # Hello +): + return 2*a + +def double(a: int) -> ( + [int] # Hello +): + return 2*a + +def double(a: int) -> ( + int | list[int] # Hello +): + pass + +def double(a: int) -> ( + int | list[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] # Hello +): + pass diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index b32f720475..d5f867f8fc 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -183,25 +183,45 @@ impl Format> for MaybeParenthesizeExpression<'_> { needs_parentheses } } - Parenthesize::Optional | Parenthesize::IfBreaks => needs_parentheses, + Parenthesize::Optional + | Parenthesize::IfBreaks + | Parenthesize::IfBreaksOrIfRequired => needs_parentheses, }; match needs_parentheses { - OptionalParentheses::Multiline if *parenthesize != Parenthesize::IfRequired => { - if can_omit_optional_parentheses(expression, f.context()) { - optional_parentheses(&expression.format().with_options(Parentheses::Never)) - .fmt(f) - } else { + OptionalParentheses::Multiline => match parenthesize { + Parenthesize::IfBreaksOrIfRequired => { parenthesize_if_expands(&expression.format().with_options(Parentheses::Never)) .fmt(f) } - } + Parenthesize::IfRequired => { + expression.format().with_options(Parentheses::Never).fmt(f) + } + Parenthesize::Optional | Parenthesize::IfBreaks => { + if can_omit_optional_parentheses(expression, f.context()) { + optional_parentheses(&expression.format().with_options(Parentheses::Never)) + .fmt(f) + } else { + parenthesize_if_expands( + &expression.format().with_options(Parentheses::Never), + ) + .fmt(f) + } + } + }, + OptionalParentheses::Never => match parenthesize { + Parenthesize::IfBreaksOrIfRequired => { + parenthesize_if_expands(&expression.format().with_options(Parentheses::Never)) + .fmt(f) + } + + Parenthesize::Optional | Parenthesize::IfBreaks | Parenthesize::IfRequired => { + expression.format().with_options(Parentheses::Never).fmt(f) + } + }, OptionalParentheses::Always => { expression.format().with_options(Parentheses::Always).fmt(f) } - OptionalParentheses::Never | OptionalParentheses::Multiline => { - expression.format().with_options(Parentheses::Never).fmt(f) - } } } } diff --git a/crates/ruff_python_formatter/src/expression/parentheses.rs b/crates/ruff_python_formatter/src/expression/parentheses.rs index 6864c80458..c9ab19225a 100644 --- a/crates/ruff_python_formatter/src/expression/parentheses.rs +++ b/crates/ruff_python_formatter/src/expression/parentheses.rs @@ -51,6 +51,11 @@ pub(crate) enum Parenthesize { /// * The expression is not enclosed by another parenthesized expression and it expands over multiple lines /// * The expression has leading or trailing comments. Adding parentheses is desired to prevent the comments from wandering. IfRequired, + + /// Parenthesizes the expression if the group doesn't fit on a line (e.g., even name expressions are parenthesized), or if + /// the expression doesn't break, but _does_ reports that it always requires parentheses in this position (e.g., walrus + /// operators in function return annotations). + IfBreaksOrIfRequired, } impl Parenthesize { @@ -193,8 +198,8 @@ pub(crate) struct FormatOptionalParentheses<'content, 'ast> { impl<'ast> Format> for FormatOptionalParentheses<'_, 'ast> { fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> { - // The group id is used as a condition in [`in_parentheses_only`] to create a conditional group - // that is only active if the optional parentheses group expands. + // The group id is used as a condition in [`in_parentheses_only_group`] to create a + // conditional group that is only active if the optional parentheses group expands. let parens_id = f.group_id("optional_parentheses"); let mut f = WithNodeLevel::new(NodeLevel::Expression(Some(parens_id)), f); diff --git a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs index 746b69de42..fcf4a0f603 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs @@ -1,9 +1,10 @@ use ruff_formatter::write; -use ruff_python_ast::{Ranged, StmtFunctionDef}; -use ruff_python_trivia::lines_after_ignoring_trivia; +use ruff_python_ast::{Parameters, Ranged, StmtFunctionDef}; +use ruff_python_trivia::{lines_after_ignoring_trivia, SimpleTokenKind, SimpleTokenizer}; use crate::comments::{leading_comments, trailing_comments}; -use crate::expression::parentheses::{optional_parentheses, Parentheses}; +use crate::expression::maybe_parenthesize_expression; +use crate::expression::parentheses::{Parentheses, Parenthesize}; use crate::prelude::*; use crate::statement::suite::SuiteKind; use crate::FormatNodeRule; @@ -60,18 +61,71 @@ impl FormatNodeRule for FormatStmtFunctionDef { let format_inner = format_with(|f: &mut PyFormatter| { write!(f, [item.parameters.format()])?; + if let Some(return_annotation) = item.returns.as_ref() { write!(f, [space(), text("->"), space()])?; + if return_annotation.is_tuple_expr() { write!( f, [return_annotation.format().with_options(Parentheses::Never)] )?; + } else if comments.has_trailing_comments(return_annotation.as_ref()) { + // Intentionally parenthesize any return annotations with trailing comments. + // This avoids an instability in cases like: + // ```python + // def double( + // a: int + // ) -> ( + // int # Hello + // ): + // pass + // ``` + // If we allow this to break, it will be formatted as follows: + // ```python + // def double( + // a: int + // ) -> int: # Hello + // pass + // ``` + // On subsequent formats, the `# Hello` will be interpreted as a dangling + // comment on a function, yielding: + // ```python + // def double(a: int) -> int: # Hello + // pass + // ``` + // Ideally, we'd reach that final formatting in a single pass, but doing so + // requires that the parent be aware of how the child is formatted, which + // is challenging. As a compromise, we break those expressions to avoid an + // instability. + write!( + f, + [return_annotation.format().with_options(Parentheses::Always)] + )?; } else { write!( f, - [optional_parentheses( - &return_annotation.format().with_options(Parentheses::Never), + [maybe_parenthesize_expression( + return_annotation, + item, + if empty_parameters(&item.parameters, f.context().source()) { + // If the parameters are empty, add parentheses if the return annotation + // breaks at all. + Parenthesize::IfBreaksOrIfRequired + } else { + // Otherwise, use our normal rules for parentheses, which allows us to break + // like: + // ```python + // def f( + // x, + // ) -> Tuple[ + // int, + // int, + // ]: + // ... + // ``` + Parenthesize::IfBreaks + }, )] )?; } @@ -100,3 +154,25 @@ impl FormatNodeRule for FormatStmtFunctionDef { Ok(()) } } + +/// Returns `true` if [`Parameters`] is empty (no parameters, no comments, etc.). +fn empty_parameters(parameters: &Parameters, source: &str) -> bool { + let mut tokenizer = SimpleTokenizer::new(source, parameters.range()) + .filter(|token| !matches!(token.kind, SimpleTokenKind::Whitespace)); + + let Some(lpar) = tokenizer.next() else { + return false; + }; + if !matches!(lpar.kind, SimpleTokenKind::LParen) { + return false; + } + + let Some(rpar) = tokenizer.next() else { + return false; + }; + if !matches!(rpar.kind, SimpleTokenKind::RParen) { + return false; + } + + true +} diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap index 36e4656eb0..c943a9e048 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap @@ -113,17 +113,6 @@ def foo() -> tuple[int, int, int,]: return 2 * a -@@ -54,7 +58,9 @@ - a: int, - b: int, - c: int, --) -> intsdfsafafafdfdsasdfsfsdfasdfafdsafdfdsfasdskdsdsfdsafdsafsdfdasfffsfdsfdsafafhdskfhdsfjdslkfdlfsdkjhsdfjkdshfkljds: -+) -> ( -+ intsdfsafafafdfdsasdfsfsdfasdfafdsafdfdsfasdskdsdsfdsafdsafsdfdasfffsfdsfdsafafhdskfhdsfjdslkfdlfsdkjhsdfjkdshfkljds -+): - return 2 - - ``` ## Ruff Output @@ -189,9 +178,7 @@ def foo( a: int, b: int, c: int, -) -> ( - intsdfsafafafdfdsasdfsfsdfasdfafdsafdfdsfasdskdsdsfdsafdsafsdfdasfffsfdsfdsafafhdskfhdsfjdslkfdlfsdkjhsdfjkdshfkljds -): +) -> intsdfsafafafdfdsasdfsfsdfasdfafdsafdfdsfasdskdsdsfdsafdsafsdfdasfffsfdsfdsafafhdskfhdsfjdslkfdlfsdkjhsdfjkdshfkljds: return 2 diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index d9f8a55ccf..8fba525759 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -377,70 +377,6 @@ def f( # first # third ): ... - -# Handle comments on empty tuple return types. -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - # comment -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - 1 -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - 1, 2 -): ... - -def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] - (1, 2) -): ... - -def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 - self, m: Match[str], data: str -) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: - ... - -def double(a: int # Hello -) -> (int): - return 2 * a - -def double(a: int) -> ( # Hello - int -): - return 2*a - -def double(a: int) -> ( # Hello -): - return 2*a - -# Breaking over parameters and return types. (Black adds a trailing comma when the -# function arguments break here with a single argument; we do not.) -def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: - ... - -def f(a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> a: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: - ... ``` ## Output @@ -969,141 +905,6 @@ def f( # first /, # second ): ... - - -# Handle comments on empty tuple return types. -def zrevrangebylex( - self, - name: _Key, - max: _Value, - min: _Value, - start: int | None = None, - num: int | None = None, -) -> ( # type: ignore[override] -): - ... - - -def zrevrangebylex( - self, - name: _Key, - max: _Value, - min: _Value, - start: int | None = None, - num: int | None = None, -) -> ( # type: ignore[override] - # comment -): - ... - - -def zrevrangebylex( - self, - name: _Key, - max: _Value, - min: _Value, - start: int | None = None, - num: int | None = None, -) -> 1: # type: ignore[override] - ... - - -def zrevrangebylex( - self, - name: _Key, - max: _Value, - min: _Value, - start: int | None = None, - num: int | None = None, -) -> ( # type: ignore[override] - 1, - 2, -): - ... - - -def zrevrangebylex( - self, - name: _Key, - max: _Value, - min: _Value, - start: int | None = None, - num: int | None = None, -) -> (1, 2): # type: ignore[override] - ... - - -def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 - self, m: Match[str], data: str -) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: - ... - - -def double( - a: int, # Hello -) -> int: - return 2 * a - - -def double(a: int) -> int: # Hello - return 2 * a - - -def double( - a: int -) -> ( # Hello -): - return 2 * a - - -# Breaking over parameters and return types. (Black adds a trailing comma when the -# function arguments break here with a single argument; we do not.) -def f( - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - - -def f( - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a -) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - - -def f( - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -) -> a: - ... - - -def f( - a -) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> ( - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -): - ... - - -def f[ - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -]() -> a: - ... - - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]( - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: - ... - - -def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]( - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -) -> a: - ... ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap new file mode 100644 index 0000000000..44840e33cd --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap @@ -0,0 +1,513 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/return_annotation.py +--- +## Input +```py +# Handle comments on empty tuple return types. +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + # comment +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + 1, 2 +): ... + +def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] + (1, 2) +): ... + +def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 + self, m: Match[str], data: str +) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: + ... + +def double(a: int # Hello +) -> (int): + return 2 * a + +def double(a: int) -> ( # Hello + int +): + return 2*a + +def double(a: int) -> ( # Hello +): + return 2*a + +# Breaking over parameters and return types. (Black adds a trailing comma when the +# function arguments break here with a single argument; we do not.) +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... + +def f(a) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> a: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa](aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) -> a: + ... + +# Breaking return type annotations. Black adds parentheses if the parameters are +# empty; otherwise, it leverages the expressions own parentheses if possible. +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"] +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"] +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"] +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(*args) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( # foo +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + # bar +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x) -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x) -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> (X + Y + foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> (X + Y + foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> (X and Y and foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> (X and Y and foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> (X | Y | foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> (X | Y | foooooooooooooooooooooooooooooooooooo()): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + X | Y | foooooooooooooooooooooooooooooooooooo() # comment +): + ... + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> ( + X | Y | foooooooooooooooooooooooooooooooooooo() # comment +): + ... + + +def double() -> first_item and foo.bar.baz().bop(1,): + return 2 * a + + +# Dangling comments on return annotations. +def double(a: int) -> ( + int # Hello +): + return 2*a + +def double(a: int) -> ( + foo.bar # Hello +): + return 2*a + +def double(a: int) -> ( + [int] # Hello +): + return 2*a + +def double(a: int) -> ( + int | list[int] # Hello +): + pass + +def double(a: int) -> ( + int | list[int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int] # Hello +): + pass +``` + +## Output +```py +# Handle comments on empty tuple return types. +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> ( # type: ignore[override] +): + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> ( # type: ignore[override] + # comment +): + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> 1: # type: ignore[override] + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> ( # type: ignore[override] + 1, + 2, +): + ... + + +def zrevrangebylex( + self, + name: _Key, + max: _Value, + min: _Value, + start: int | None = None, + num: int | None = None, +) -> (1, 2): # type: ignore[override] + ... + + +def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197 + self, m: Match[str], data: str +) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]: + ... + + +def double( + a: int, # Hello +) -> int: + return 2 * a + + +def double(a: int) -> int: # Hello + return 2 * a + + +def double( + a: int +) -> ( # Hello +): + return 2 * a + + +# Breaking over parameters and return types. (Black adds a trailing comma when the +# function arguments break here with a single argument; we do not.) +def f( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> a: + ... + + +def f( + a +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]() -> ( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +): + ... + + +def f[ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +]() -> a: + ... + + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + ... + + +def f[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]( + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +) -> a: + ... + + +# Breaking return type annotations. Black adds parentheses if the parameters are +# empty; otherwise, it leverages the expressions own parentheses if possible. +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ] +): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ] +): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ] +): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + *args +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( # foo +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + # bar +) -> Set[ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +]: + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x +) -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x +) -> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> X + Y + foooooooooooooooooooooooooooooooooooo(): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> X + Y + foooooooooooooooooooooooooooooooooooo(): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + X and Y and foooooooooooooooooooooooooooooooooooo() +): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x +) -> X and Y and foooooooooooooooooooooooooooooooooooo(): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> X | Y | foooooooooooooooooooooooooooooooooooo(): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx(x) -> X | Y | foooooooooooooooooooooooooooooooooooo(): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> ( + X | Y | foooooooooooooooooooooooooooooooooooo() # comment +): + ... + + +def xxxxxxxxxxxxxxxxxxxxxxxxxxxx( + x +) -> ( + X | Y | foooooooooooooooooooooooooooooooooooo() # comment +): + ... + + +def double() -> ( + first_item + and foo.bar.baz().bop( + 1, + ) +): + return 2 * a + + +# Dangling comments on return annotations. +def double( + a: int +) -> ( + int # Hello +): + return 2 * a + + +def double( + a: int +) -> ( + foo.bar # Hello +): + return 2 * a + + +def double( + a: int +) -> ( + [int] # Hello +): + return 2 * a + + +def double( + a: int +) -> ( + int | list[int] # Hello +): + pass + + +def double( + a: int +) -> ( + int + | list[ + int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int + ] # Hello +): + pass +``` + + + From e91caea4906d28b6cb61e2dadcc9cf25890b0561 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 11 Aug 2023 14:28:48 -0400 Subject: [PATCH 084/155] Add test case for walrus operators in return types (#6438) ## Summary Closes https://github.com/astral-sh/ruff/issues/6437. ## Test Plan `cargo test` --- .../test/fixtures/ruff/statement/function.py | 5 +++++ .../src/expression/expr_named_expr.rs | 1 + .../snapshots/format@statement__function.py.snap | 14 ++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py index 42e643032c..e5a32ad888 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/function.py @@ -371,3 +371,8 @@ def f( # first # third ): ... + +# Walrus operator in return type. +def this_is_unusual() -> (please := no): ... + +def this_is_unusual(x) -> (please := no): ... diff --git a/crates/ruff_python_formatter/src/expression/expr_named_expr.rs b/crates/ruff_python_formatter/src/expression/expr_named_expr.rs index 935d926c30..8858c6079a 100644 --- a/crates/ruff_python_formatter/src/expression/expr_named_expr.rs +++ b/crates/ruff_python_formatter/src/expression/expr_named_expr.rs @@ -49,6 +49,7 @@ impl NeedsParentheses for ExprNamedExpr { || parent.is_expr_await() || parent.is_stmt_delete() || parent.is_stmt_for() + || parent.is_stmt_function_def() { OptionalParentheses::Always } else { diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index 8fba525759..d801c863eb 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -377,6 +377,11 @@ def f( # first # third ): ... + +# Walrus operator in return type. +def this_is_unusual() -> (please := no): ... + +def this_is_unusual(x) -> (please := no): ... ``` ## Output @@ -905,6 +910,15 @@ def f( # first /, # second ): ... + + +# Walrus operator in return type. +def this_is_unusual() -> (please := no): + ... + + +def this_is_unusual(x) -> (please := no): + ... ``` From 5b47350c25d09e4f639330ab3ab51fb98e3185eb Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 11 Aug 2023 16:41:31 -0500 Subject: [PATCH 085/155] Document default behavior of `W505` in setting (#6463) Addresses https://github.com/astral-sh/ruff/discussions/6459 --- crates/ruff/src/rules/pycodestyle/settings.rs | 5 ++++- ruff.schema.json | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/ruff/src/rules/pycodestyle/settings.rs b/crates/ruff/src/rules/pycodestyle/settings.rs index 7366930d10..7d5d2bcb6b 100644 --- a/crates/ruff/src/rules/pycodestyle/settings.rs +++ b/crates/ruff/src/rules/pycodestyle/settings.rs @@ -20,7 +20,10 @@ pub struct Options { "# )] /// The maximum line length to allow for line-length violations within - /// documentation (`W505`), including standalone comments. + /// documentation (`W505`), including standalone comments. By default, + /// this is set to null which disables reporting violations. + /// + /// See the [`doc-line-too-long`](https://beta.ruff.rs/docs/rules/doc-line-too-long/) rule for more information. pub max_doc_length: Option, #[option( default = "false", diff --git a/ruff.schema.json b/ruff.schema.json index d28a8b49d5..09cb719a63 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -1481,7 +1481,7 @@ ] }, "max-doc-length": { - "description": "The maximum line length to allow for line-length violations within documentation (`W505`), including standalone comments.", + "description": "The maximum line length to allow for line-length violations within documentation (`W505`), including standalone comments. By default, this is set to null which disables reporting violations.\n\nSee the [`doc-line-too-long`](https://beta.ruff.rs/docs/rules/doc-line-too-long/) rule for more information.", "anyOf": [ { "$ref": "#/definitions/LineLength" From c6ad364d8b47fcdf5d1a3b540e09c1e9c6cd164e Mon Sep 17 00:00:00 2001 From: Harutaka Kawamura Date: Sat, 12 Aug 2023 12:44:48 +0900 Subject: [PATCH 086/155] Add `PT008` and `PT009` docs (#6479) --- .../flake8_pytest_style/rules/assertion.rs | 24 ++++++++++++++ .../rules/flake8_pytest_style/rules/patch.rs | 33 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs index c70982d93c..dbb571c527 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs @@ -145,6 +145,30 @@ impl Violation for PytestAssertAlwaysFalse { } } +/// ## What it does +/// Checks for uses of assertion methods from the `unittest` module. +/// +/// ## Why is this bad? +/// To make use of `pytest`'s assertion rewriting, a regular `assert` statement +/// is preferred over `unittest`'s assertion methods. +/// +/// ## Example +/// ```python +/// class TestFoo(unittest.TestCase): +/// def test_foo(self): +/// self.assertEqual(a, b) +/// ``` +/// +/// Use instead: +/// ```python +/// class TestFoo(unittest.TestCase): +/// def test_foo(self): +/// assert a == b +/// ``` +/// +/// ## References +/// - [`pytest` documentation: Assertion introspection details](https://docs.pytest.org/en/7.1.x/how-to/assert.html#assertion-introspection-details) + #[violation] pub struct PytestUnittestAssertion { assertion: String, diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/patch.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/patch.rs index fd6f108276..cfd9e7d8d3 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/patch.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/patch.rs @@ -5,6 +5,39 @@ use ruff_python_ast::visitor; use ruff_python_ast::visitor::Visitor; use ruff_python_ast::{self as ast, Expr, Parameters, Ranged}; +/// ## What it does +/// Checks for mocked calls that use a dummy `lambda` function instead of +/// `return_value`. +/// +/// ## Why is this bad? +/// When patching calls, an explicit `return_value` better conveys the intent +/// than a `lambda` function, assuming the `lambda` does not use the arguments +/// passed to it. +/// +/// `return_value` is also robust to changes in the patched function's +/// signature, and enables additional assertions to verify behavior. For +/// example, `return_value` allows for verification of the number of calls or +/// the arguments passed to the patched function via `assert_called_once_with` +/// and related methods. +/// +/// ## Example +/// ```python +/// def test_foo(mocker): +/// mocker.patch("module.target", lambda x, y: 7) +/// ``` +/// +/// Use instead: +/// ```python +/// def test_foo(mocker): +/// mocker.patch("module.target", return_value=7) +/// +/// # If the lambda makes use of the arguments, no diagnostic is emitted. +/// mocker.patch("module.other_target", lambda x, y: x) +/// ``` +/// +/// ## References +/// - [Python documentation: `unittest.mock.patch`](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch) +/// - [`pytest-mock`](https://pypi.org/project/pytest-mock/) #[violation] pub struct PytestPatchWithLambda; From a1da9da0ef5970715cf989843e5dff2eb0cbe1fc Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sat, 12 Aug 2023 00:11:44 -0400 Subject: [PATCH 087/155] Avoid JSON parse error on playground load (#6519) ## Summary On page load, the playground very briefly flickers a JSON parse error. Due to our use of `useDeferredValue`, we attempt to parse the empty JSON string settings, since after `const initialized = ruffVersion != null;` returns true, we get one render with the stale deferred value. This PR refactors the state, such that we start by storing `null` for the `Source`, and use the `Source` itself to determine initialization status. ## Test Plan Set a breakpoint in the `catch` path in `Editor`; verified that it no longer triggers on load (but did on `main`). --- playground/src/Editor/Editor.tsx | 68 ++++++++++++++++---------------- playground/src/Editor/Header.tsx | 2 +- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/playground/src/Editor/Editor.tsx b/playground/src/Editor/Editor.tsx index a8b03bcfc6..79495084d3 100644 --- a/playground/src/Editor/Editor.tsx +++ b/playground/src/Editor/Editor.tsx @@ -5,22 +5,22 @@ import { useMemo, useState, } from "react"; +import { Panel, PanelGroup } from "react-resizable-panels"; import { DEFAULT_PYTHON_SOURCE } from "../constants"; import init, { Diagnostic, Workspace } from "../pkg"; import { ErrorMessage } from "./ErrorMessage"; import Header from "./Header"; -import { useTheme } from "./theme"; -import { persist, persistLocal, restore, stringify } from "./settings"; -import SettingsEditor from "./SettingsEditor"; -import SourceEditor from "./SourceEditor"; -import { Panel, PanelGroup } from "react-resizable-panels"; import PrimarySideBar from "./PrimarySideBar"; -import SecondarySideBar from "./SecondarySideBar"; import { HorizontalResizeHandle } from "./ResizeHandle"; import SecondaryPanel, { SecondaryPanelResult, SecondaryTool, } from "./SecondaryPanel"; +import SecondarySideBar from "./SecondarySideBar"; +import { persist, persistLocal, restore, stringify } from "./settings"; +import SettingsEditor from "./SettingsEditor"; +import SourceEditor from "./SourceEditor"; +import { useTheme } from "./theme"; type Tab = "Source" | "Settings"; @@ -43,11 +43,7 @@ export default function Editor() { error: null, secondary: null, }); - const [source, setSource] = useState({ - pythonSource: "", - settingsSource: "", - revision: 0, - }); + const [source, setSource] = useState(null); const [tab, setTab] = useState("Source"); const [secondaryTool, setSecondaryTool] = useState( @@ -64,8 +60,6 @@ export default function Editor() { ); const [theme, setTheme] = useTheme(); - const initialized = ruffVersion != null; - // Ideally this would be retrieved right from the URL... but routing without a proper // router is hard (there's no location changed event) and pulling in a router // feels overkill. @@ -97,8 +91,8 @@ export default function Editor() { ]; setSource({ - pythonSource, revision: 0, + pythonSource, settingsSource, }); setRuffVersion(Workspace.version()); @@ -109,11 +103,11 @@ export default function Editor() { const deferredSource = useDeferredValue(source); useEffect(() => { - if (!initialized) { + if (deferredSource == null) { return; } - const { settingsSource, pythonSource } = deferredSource; + const { pythonSource, settingsSource } = deferredSource; try { const config = JSON.parse(settingsSource); @@ -171,44 +165,52 @@ export default function Editor() { secondary: null, }); } - }, [initialized, deferredSource, secondaryTool]); + }, [deferredSource, secondaryTool]); useEffect(() => { - if (initialized) { + if (source != null) { persistLocal(source); } - }, [initialized, source]); + }, [source]); const handleShare = useMemo(() => { - if (!initialized) { + if (source == null) { return undefined; } return () => { return persist(source.settingsSource, source.pythonSource); }; - }, [source, initialized]); + }, [source]); const handlePythonSourceChange = useCallback((pythonSource: string) => { - setSource((state) => ({ - ...state, - pythonSource, - revision: state.revision + 1, - })); + setSource((state) => + state + ? { + ...state, + pythonSource, + revision: state.revision + 1, + } + : null, + ); }, []); const handleSettingsSourceChange = useCallback((settingsSource: string) => { - setSource((state) => ({ - ...state, - settingsSource, - revision: state.revision + 1, - })); + setSource((state) => + state + ? { + ...state, + settingsSource, + revision: state.revision + 1, + } + : null, + ); }, []); return (
- {initialized ? ( + {source ? ( setTab(tool)} diff --git a/playground/src/Editor/Header.tsx b/playground/src/Editor/Header.tsx index 636e1ae9e5..537f7d332f 100644 --- a/playground/src/Editor/Header.tsx +++ b/playground/src/Editor/Header.tsx @@ -14,7 +14,7 @@ export default function Header({ onChangeTheme, onShare, }: { - edit: number; + edit: number | null; theme: Theme; version: string | null; onChangeTheme: (theme: Theme) => void; From c03e2acadbeb53013e5a4e4f9ac9ebfa843d4ef6 Mon Sep 17 00:00:00 2001 From: Presley Graham Date: Sat, 12 Aug 2023 14:45:34 -0400 Subject: [PATCH 088/155] [`flake8-tidy-imports`] Add `TID253` (#6378) ## Summary Add a new rule `TID253` (`banned-module-level-imports`), to ban a user-specified list of imports from appearing at module level. This rule doesn't exist in `flake8-tidy-imports`, so it's unique to Ruff. The implementation is pretty similar to `TID251`. Briefly discussed [here](https://github.com/astral-sh/ruff/discussions/6370). ## Test Plan Added a new test case, checking that inline imports are allowed and that non-inline imports from the banned list are disallowed. --- .../fixtures/flake8_tidy_imports/TID253.py | 31 +++++ .../src/checkers/ast/analyze/statement.rs | 31 +++++ crates/ruff/src/codes.rs | 1 + .../ruff/src/rules/flake8_tidy_imports/mod.rs | 19 +++ .../src/rules/flake8_tidy_imports/options.rs | 15 +++ .../rules/banned_module_level_imports.rs | 111 ++++++++++++++++++ .../rules/flake8_tidy_imports/rules/mod.rs | 2 + .../src/rules/flake8_tidy_imports/settings.rs | 1 + ...s__tests__banned_module_level_imports.snap | 81 +++++++++++++ ruff.schema.json | 11 ++ 10 files changed, 303 insertions(+) create mode 100644 crates/ruff/resources/test/fixtures/flake8_tidy_imports/TID253.py create mode 100644 crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs create mode 100644 crates/ruff/src/rules/flake8_tidy_imports/snapshots/ruff__rules__flake8_tidy_imports__tests__banned_module_level_imports.snap diff --git a/crates/ruff/resources/test/fixtures/flake8_tidy_imports/TID253.py b/crates/ruff/resources/test/fixtures/flake8_tidy_imports/TID253.py new file mode 100644 index 0000000000..d0d3d14845 --- /dev/null +++ b/crates/ruff/resources/test/fixtures/flake8_tidy_imports/TID253.py @@ -0,0 +1,31 @@ +## Banned modules ## +import torch + +from torch import * + +from tensorflow import a, b, c + +import torch as torch_wearing_a_trenchcoat + +# this should count as module level +x = 1; import tensorflow + +# banning a module also bans any submodules +import torch.foo.bar + +from tensorflow.foo import bar + +from torch.foo.bar import * + +# unlike TID251, inline imports are *not* banned +def my_cool_function(): + import tensorflow.foo.bar + +def another_cool_function(): + from torch.foo import bar + +def import_alias(): + from torch.foo import bar + +if TYPE_CHECKING: + import torch diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index a5c56291ee..81a36c87d6 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -566,6 +566,15 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { alias, ); } + + if checker.enabled(Rule::BannedModuleLevelImports) { + flake8_tidy_imports::rules::name_or_parent_is_banned_at_module_level( + checker, + &alias.name, + alias.range(), + ); + } + if !checker.source_type.is_stub() { if checker.enabled(Rule::UselessImportAlias) { pylint::rules::useless_import_alias(checker, alias); @@ -734,6 +743,28 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } } } + if checker.enabled(Rule::BannedModuleLevelImports) { + if let Some(module) = + helpers::resolve_imported_module_path(level, module, checker.module_path) + { + flake8_tidy_imports::rules::name_or_parent_is_banned_at_module_level( + checker, + &module, + stmt.range(), + ); + + for alias in names { + if &alias.name == "*" { + continue; + } + flake8_tidy_imports::rules::name_is_banned_at_module_level( + checker, + &format!("{module}.{}", alias.name), + alias.range(), + ); + } + } + } if checker.enabled(Rule::PytestIncorrectPytestImport) { if let Some(diagnostic) = flake8_pytest_style::rules::import_from(stmt, module, level) diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs index d7bb7cf7a5..ba86706c6a 100644 --- a/crates/ruff/src/codes.rs +++ b/crates/ruff/src/codes.rs @@ -311,6 +311,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { // flake8-tidy-imports (Flake8TidyImports, "251") => (RuleGroup::Unspecified, rules::flake8_tidy_imports::rules::BannedApi), (Flake8TidyImports, "252") => (RuleGroup::Unspecified, rules::flake8_tidy_imports::rules::RelativeImports), + (Flake8TidyImports, "253") => (RuleGroup::Unspecified, rules::flake8_tidy_imports::rules::BannedModuleLevelImports), // flake8-return (Flake8Return, "501") => (RuleGroup::Unspecified, rules::flake8_return::rules::UnnecessaryReturnNone), diff --git a/crates/ruff/src/rules/flake8_tidy_imports/mod.rs b/crates/ruff/src/rules/flake8_tidy_imports/mod.rs index 8686f3971c..d136abbb1d 100644 --- a/crates/ruff/src/rules/flake8_tidy_imports/mod.rs +++ b/crates/ruff/src/rules/flake8_tidy_imports/mod.rs @@ -124,4 +124,23 @@ mod tests { assert_messages!(diagnostics); Ok(()) } + + #[test] + fn banned_module_level_imports() -> Result<()> { + let diagnostics = test_path( + Path::new("flake8_tidy_imports/TID253.py"), + &Settings { + flake8_tidy_imports: flake8_tidy_imports::settings::Settings { + banned_module_level_imports: vec![ + "torch".to_string(), + "tensorflow".to_string(), + ], + ..Default::default() + }, + ..Settings::for_rules(vec![Rule::BannedModuleLevelImports]) + }, + )?; + assert_messages!(diagnostics); + Ok(()) + } } diff --git a/crates/ruff/src/rules/flake8_tidy_imports/options.rs b/crates/ruff/src/rules/flake8_tidy_imports/options.rs index 6f3eb99fcb..a2bc84c300 100644 --- a/crates/ruff/src/rules/flake8_tidy_imports/options.rs +++ b/crates/ruff/src/rules/flake8_tidy_imports/options.rs @@ -41,6 +41,19 @@ pub struct Options { /// Note that this rule is only meant to flag accidental uses, /// and can be circumvented via `eval` or `importlib`. pub banned_api: Option>, + #[option( + default = r#"[]"#, + value_type = r#"list[str]"#, + example = r#" + # Ban certain modules from being imported at module level, instead requiring + # that they're imported lazily (e.g., within a function definition). + banned-module-level-imports = ["torch", "tensorflow"] + "# + )] + /// List of specific modules that may not be imported at module level, and should instead be + /// imported lazily (e.g., within a function definition, or an `if TYPE_CHECKING:` + /// block, or some other nested context). + pub banned_module_level_imports: Option>, } impl From for Settings { @@ -48,6 +61,7 @@ impl From for Settings { Self { ban_relative_imports: options.ban_relative_imports.unwrap_or(Strictness::Parents), banned_api: options.banned_api.unwrap_or_default(), + banned_module_level_imports: options.banned_module_level_imports.unwrap_or_default(), } } } @@ -57,6 +71,7 @@ impl From for Options { Self { ban_relative_imports: Some(settings.ban_relative_imports), banned_api: Some(settings.banned_api), + banned_module_level_imports: Some(settings.banned_module_level_imports), } } } diff --git a/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs b/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs new file mode 100644 index 0000000000..0efa1a3164 --- /dev/null +++ b/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs @@ -0,0 +1,111 @@ +use ruff_diagnostics::{Diagnostic, Violation}; +use ruff_macros::{derive_message_formats, violation}; +use ruff_text_size::TextRange; + +use crate::checkers::ast::Checker; + +/// ## What it does +/// Checks for module-level imports that should instead be imported lazily +/// (e.g., within a function definition, or an `if TYPE_CHECKING:` block, or +/// some other nested context). +/// +/// ## Why is this bad? +/// Some modules are expensive to import. For example, importing `torch` or +/// `tensorflow` can introduce a noticeable delay in the startup time of a +/// Python program. +/// +/// In such cases, you may want to enforce that the module is imported lazily +/// as needed, rather than at the top of the file. This could involve inlining +/// the import into the function that uses it, rather than importing it +/// unconditionally, to ensure that the module is only imported when necessary. +/// +/// ## Example +/// ```python +/// import tensorflow as tf +/// +/// +/// def show_version(): +/// print(tf.__version__) +/// ``` +/// +/// Use instead: +/// ```python +/// def show_version(): +/// import tensorflow as tf +/// +/// print(tf.__version__) +/// ``` +/// +/// ## Options +/// - `flake8-tidy-imports.banned-module-level-imports` +#[violation] +pub struct BannedModuleLevelImports { + name: String, +} + +impl Violation for BannedModuleLevelImports { + #[derive_message_formats] + fn message(&self) -> String { + let BannedModuleLevelImports { name } = self; + format!("`{name}` is banned at the module level") + } +} + +/// TID253 +pub(crate) fn name_is_banned_at_module_level( + checker: &mut Checker, + name: &str, + text_range: TextRange, +) { + banned_at_module_level_with_policy(checker, name, text_range, &NameMatchPolicy::ExactOnly); +} + +/// TID253 +pub(crate) fn name_or_parent_is_banned_at_module_level( + checker: &mut Checker, + name: &str, + text_range: TextRange, +) { + banned_at_module_level_with_policy(checker, name, text_range, &NameMatchPolicy::ExactOrParents); +} + +#[derive(Debug)] +enum NameMatchPolicy { + /// Only match an exact module name (e.g., given `import foo.bar`, only match `foo.bar`). + ExactOnly, + /// Match an exact module name or any of its parents (e.g., given `import foo.bar`, match + /// `foo.bar` or `foo`). + ExactOrParents, +} + +fn banned_at_module_level_with_policy( + checker: &mut Checker, + name: &str, + text_range: TextRange, + policy: &NameMatchPolicy, +) { + if !checker.semantic().at_top_level() { + return; + } + let banned_module_level_imports = &checker + .settings + .flake8_tidy_imports + .banned_module_level_imports; + for banned_module_name in banned_module_level_imports { + let name_is_banned = match policy { + NameMatchPolicy::ExactOnly => name == banned_module_name, + NameMatchPolicy::ExactOrParents => { + name == banned_module_name || name.starts_with(&format!("{banned_module_name}.")) + } + }; + if name_is_banned { + checker.diagnostics.push(Diagnostic::new( + BannedModuleLevelImports { + name: banned_module_name.to_string(), + }, + text_range, + )); + return; + } + } +} diff --git a/crates/ruff/src/rules/flake8_tidy_imports/rules/mod.rs b/crates/ruff/src/rules/flake8_tidy_imports/rules/mod.rs index 660116d718..a9c8e631d9 100644 --- a/crates/ruff/src/rules/flake8_tidy_imports/rules/mod.rs +++ b/crates/ruff/src/rules/flake8_tidy_imports/rules/mod.rs @@ -1,5 +1,7 @@ pub(crate) use banned_api::*; +pub(crate) use banned_module_level_imports::*; pub(crate) use relative_imports::*; mod banned_api; +mod banned_module_level_imports; mod relative_imports; diff --git a/crates/ruff/src/rules/flake8_tidy_imports/settings.rs b/crates/ruff/src/rules/flake8_tidy_imports/settings.rs index 90b2843280..a1267fbc9b 100644 --- a/crates/ruff/src/rules/flake8_tidy_imports/settings.rs +++ b/crates/ruff/src/rules/flake8_tidy_imports/settings.rs @@ -26,4 +26,5 @@ pub enum Strictness { pub struct Settings { pub ban_relative_imports: Strictness, pub banned_api: FxHashMap, + pub banned_module_level_imports: Vec, } diff --git a/crates/ruff/src/rules/flake8_tidy_imports/snapshots/ruff__rules__flake8_tidy_imports__tests__banned_module_level_imports.snap b/crates/ruff/src/rules/flake8_tidy_imports/snapshots/ruff__rules__flake8_tidy_imports__tests__banned_module_level_imports.snap new file mode 100644 index 0000000000..40bb5c9f58 --- /dev/null +++ b/crates/ruff/src/rules/flake8_tidy_imports/snapshots/ruff__rules__flake8_tidy_imports__tests__banned_module_level_imports.snap @@ -0,0 +1,81 @@ +--- +source: crates/ruff/src/rules/flake8_tidy_imports/mod.rs +--- +TID253.py:2:8: TID253 `torch` is banned at the module level + | +1 | ## Banned modules ## +2 | import torch + | ^^^^^ TID253 +3 | +4 | from torch import * + | + +TID253.py:4:1: TID253 `torch` is banned at the module level + | +2 | import torch +3 | +4 | from torch import * + | ^^^^^^^^^^^^^^^^^^^ TID253 +5 | +6 | from tensorflow import a, b, c + | + +TID253.py:6:1: TID253 `tensorflow` is banned at the module level + | +4 | from torch import * +5 | +6 | from tensorflow import a, b, c + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TID253 +7 | +8 | import torch as torch_wearing_a_trenchcoat + | + +TID253.py:8:8: TID253 `torch` is banned at the module level + | + 6 | from tensorflow import a, b, c + 7 | + 8 | import torch as torch_wearing_a_trenchcoat + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TID253 + 9 | +10 | # this should count as module level + | + +TID253.py:11:15: TID253 `tensorflow` is banned at the module level + | +10 | # this should count as module level +11 | x = 1; import tensorflow + | ^^^^^^^^^^ TID253 +12 | +13 | # banning a module also bans any submodules + | + +TID253.py:14:8: TID253 `torch` is banned at the module level + | +13 | # banning a module also bans any submodules +14 | import torch.foo.bar + | ^^^^^^^^^^^^^ TID253 +15 | +16 | from tensorflow.foo import bar + | + +TID253.py:16:1: TID253 `tensorflow` is banned at the module level + | +14 | import torch.foo.bar +15 | +16 | from tensorflow.foo import bar + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TID253 +17 | +18 | from torch.foo.bar import * + | + +TID253.py:18:1: TID253 `torch` is banned at the module level + | +16 | from tensorflow.foo import bar +17 | +18 | from torch.foo.bar import * + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ TID253 +19 | +20 | # unlike TID251, inline imports are *not* banned + | + + diff --git a/ruff.schema.json b/ruff.schema.json index 09cb719a63..95cda80152 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -1062,6 +1062,16 @@ "additionalProperties": { "$ref": "#/definitions/ApiBan" } + }, + "banned-module-level-imports": { + "description": "List of specific modules that may not be imported at module level, and should instead be imported lazily (e.g., within a function definition, or an `if TYPE_CHECKING:` block, or some other nested context).", + "type": [ + "array", + "null" + ], + "items": { + "type": "string" + } } }, "additionalProperties": false @@ -2610,6 +2620,7 @@ "TID25", "TID251", "TID252", + "TID253", "TRY", "TRY0", "TRY00", From b49c80f8c8b856997bfe2851ce6a298da2ca8f4c Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sat, 12 Aug 2023 14:52:44 -0400 Subject: [PATCH 089/155] Use top-level semantic detection for E402 (#6526) ## Summary Noticed in https://github.com/astral-sh/ruff/pull/6378. Given `import h; import i`, we don't consider `import i` to be a "top-level" import for E402 purposes, which is wrong. Similarly, we _do_ consider `import k` to be a "top-level" import in: ```python if __name__ == "__main__": import j; \ import k ``` Using the semantic detection, rather than relying on newline position, fixes both cases. ## Test Plan `cargo test` --- .../resources/test/fixtures/pycodestyle/E402.py | 7 +++++++ .../ruff/src/checkers/ast/analyze/statement.rs | 12 ++---------- .../ruff/src/rules/pycodestyle/rules/imports.rs | 12 +++--------- ..._rules__pycodestyle__tests__E402_E402.py.snap | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pycodestyle/E402.py b/crates/ruff/resources/test/fixtures/pycodestyle/E402.py index 81e6306c7a..d594340785 100644 --- a/crates/ruff/resources/test/fixtures/pycodestyle/E402.py +++ b/crates/ruff/resources/test/fixtures/pycodestyle/E402.py @@ -30,3 +30,10 @@ def foo() -> None: if __name__ == "__main__": import g + +import h; import i + + +if __name__ == "__main__": + import j; \ +import k diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index 81a36c87d6..ada91344da 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -520,11 +520,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { pycodestyle::rules::multiple_imports_on_one_line(checker, stmt, names); } if checker.enabled(Rule::ModuleImportNotAtTopOfFile) { - pycodestyle::rules::module_import_not_at_top_of_file( - checker, - stmt, - checker.locator, - ); + pycodestyle::rules::module_import_not_at_top_of_file(checker, stmt); } if checker.enabled(Rule::GlobalStatement) { for name in names { @@ -689,11 +685,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { let module = module.as_deref(); let level = level.map(|level| level.to_u32()); if checker.enabled(Rule::ModuleImportNotAtTopOfFile) { - pycodestyle::rules::module_import_not_at_top_of_file( - checker, - stmt, - checker.locator, - ); + pycodestyle::rules::module_import_not_at_top_of_file(checker, stmt); } if checker.enabled(Rule::GlobalStatement) { for name in names { diff --git a/crates/ruff/src/rules/pycodestyle/rules/imports.rs b/crates/ruff/src/rules/pycodestyle/rules/imports.rs index 4085b6aa66..8e20077d34 100644 --- a/crates/ruff/src/rules/pycodestyle/rules/imports.rs +++ b/crates/ruff/src/rules/pycodestyle/rules/imports.rs @@ -1,8 +1,6 @@ -use ruff_python_ast::{Alias, Ranged, Stmt}; - use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_source_file::Locator; +use ruff_python_ast::{Alias, Ranged, Stmt}; use crate::checkers::ast::Checker; @@ -81,12 +79,8 @@ pub(crate) fn multiple_imports_on_one_line(checker: &mut Checker, stmt: &Stmt, n } /// E402 -pub(crate) fn module_import_not_at_top_of_file( - checker: &mut Checker, - stmt: &Stmt, - locator: &Locator, -) { - if checker.semantic().seen_import_boundary() && locator.is_at_start_of_line(stmt.start()) { +pub(crate) fn module_import_not_at_top_of_file(checker: &mut Checker, stmt: &Stmt) { + if checker.semantic().seen_import_boundary() && checker.semantic().at_top_level() { checker .diagnostics .push(Diagnostic::new(ModuleImportNotAtTopOfFile, stmt.range())); diff --git a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E402_E402.py.snap b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E402_E402.py.snap index f768015c97..a0518e1437 100644 --- a/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E402_E402.py.snap +++ b/crates/ruff/src/rules/pycodestyle/snapshots/ruff__rules__pycodestyle__tests__E402_E402.py.snap @@ -9,4 +9,20 @@ E402.py:24:1: E402 Module level import not at top of file | ^^^^^^^^ E402 | +E402.py:34:1: E402 Module level import not at top of file + | +32 | import g +33 | +34 | import h; import i + | ^^^^^^^^ E402 + | + +E402.py:34:11: E402 Module level import not at top of file + | +32 | import g +33 | +34 | import h; import i + | ^^^^^^^^ E402 + | + From 4974964ad3dc88107c00d8db56598d96039627dc Mon Sep 17 00:00:00 2001 From: James Braza Date: Sat, 12 Aug 2023 12:01:03 -0700 Subject: [PATCH 090/155] Clarifying `target-version` in `flake8-future-annotations` docs (#6520) --- .../rules/future_required_type_annotation.rs | 9 +++++++++ .../rules/future_rewritable_type_annotation.rs | 17 ++++++++++++++--- .../rules/pylint/rules/too_many_arguments.rs | 2 +- .../src/rules/pylint/rules/too_many_branches.rs | 6 +++--- .../pylint/rules/too_many_return_statements.rs | 2 +- .../rules/pylint/rules/too_many_statements.rs | 2 +- 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/crates/ruff/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs b/crates/ruff/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs index 04835fad6e..445b5c35de 100644 --- a/crates/ruff/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs +++ b/crates/ruff/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs @@ -20,6 +20,12 @@ use crate::checkers::ast::Checker; /// annotations at evaluation time, making the code compatible with both past /// and future Python versions. /// +/// This rule respects the [`target-version`] setting. For example, if your +/// project targets Python 3.10 and above, adding `from __future__ import annotations` +/// does not impact your ability to leverage PEP 604-style unions (e.g., to +/// convert `Optional[str]` to `str | None`). As such, this rule will only +/// flag such usages if your project targets Python 3.9 or below. +/// /// ## Example /// ```python /// def func(obj: dict[str, int | None]) -> None: @@ -34,6 +40,9 @@ use crate::checkers::ast::Checker; /// def func(obj: dict[str, int | None]) -> None: /// ... /// ``` +/// +/// ## Options +/// - `target-version` #[violation] pub struct FutureRequiredTypeAnnotation { reason: Reason, diff --git a/crates/ruff/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs b/crates/ruff/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs index df0998ddd4..5fb3f5708c 100644 --- a/crates/ruff/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs +++ b/crates/ruff/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs @@ -13,14 +13,25 @@ use crate::checkers::ast::Checker; /// /// ## Why is this bad? /// PEP 563 enabled the use of a number of convenient type annotations, such as -/// `list[str]` instead of `List[str]`, or `str | None` instead of -/// `Optional[str]`. However, these annotations are only available on Python -/// 3.9 and higher, _unless_ the `from __future__ import annotations` import is present. +/// `list[str]` instead of `List[str]`. However, these annotations are only +/// available on Python 3.9 and higher, _unless_ the `from __future__ import annotations` +/// import is present. +/// +/// Similarly, PEP 604 enabled the use of the `|` operator for unions, such as +/// `str | None` instead of `Optional[str]`. However, these annotations are only +/// available on Python 3.10 and higher, _unless_ the `from __future__ import annotations` +/// import is present. /// /// By adding the `__future__` import, the pyupgrade rules can automatically /// migrate existing code to use the new syntax, even for older Python versions. /// This rule thus pairs well with pyupgrade and with Ruff's pyupgrade rules. /// +/// This rule respects the [`target-version`] setting. For example, if your +/// project targets Python 3.10 and above, adding `from __future__ import annotations` +/// does not impact your ability to leverage PEP 604-style unions (e.g., to +/// convert `Optional[str]` to `str | None`). As such, this rule will only +/// flag such usages if your project targets Python 3.9 or below. +/// /// ## Example /// ```python /// from typing import List, Dict, Optional diff --git a/crates/ruff/src/rules/pylint/rules/too_many_arguments.rs b/crates/ruff/src/rules/pylint/rules/too_many_arguments.rs index 501cb0edc6..8948aeb0cc 100644 --- a/crates/ruff/src/rules/pylint/rules/too_many_arguments.rs +++ b/crates/ruff/src/rules/pylint/rules/too_many_arguments.rs @@ -10,7 +10,7 @@ use crate::checkers::ast::Checker; /// Checks for function definitions that include too many arguments. /// /// By default, this rule allows up to five arguments, as configured by the -/// `pylint.max-args` option. +/// [`pylint.max-args`] option. /// /// ## Why is this bad? /// Functions with many arguments are harder to understand, maintain, and call. diff --git a/crates/ruff/src/rules/pylint/rules/too_many_branches.rs b/crates/ruff/src/rules/pylint/rules/too_many_branches.rs index 2e6e220ec8..1c5615eea9 100644 --- a/crates/ruff/src/rules/pylint/rules/too_many_branches.rs +++ b/crates/ruff/src/rules/pylint/rules/too_many_branches.rs @@ -8,7 +8,7 @@ use ruff_python_ast::identifier::Identifier; /// Checks for functions or methods with too many branches. /// /// By default, this rule allows up to 12 branches. This can be configured -/// using the `max-branches` option. +/// using the [`pylint.max-branches`] option. /// /// ## Why is this bad? /// Functions or methods with many branches are harder to understand @@ -66,8 +66,8 @@ use ruff_python_ast::identifier::Identifier; /// return city /// ``` /// -/// ## References -/// - [Ruff configuration documentation](https://beta.ruff.rs/docs/settings/#max-branches) +/// ## Options +/// - `pylint.max-branches` #[violation] pub struct TooManyBranches { branches: usize, diff --git a/crates/ruff/src/rules/pylint/rules/too_many_return_statements.rs b/crates/ruff/src/rules/pylint/rules/too_many_return_statements.rs index 2ee2abb11d..8fc7fe16e6 100644 --- a/crates/ruff/src/rules/pylint/rules/too_many_return_statements.rs +++ b/crates/ruff/src/rules/pylint/rules/too_many_return_statements.rs @@ -10,7 +10,7 @@ use ruff_python_ast::statement_visitor::StatementVisitor; /// Checks for functions or methods with too many return statements. /// /// By default, this rule allows up to six return statements, as configured by -/// the `pylint.max-returns` option. +/// the [`pylint.max-returns`] option. /// /// ## Why is this bad? /// Functions or methods with many return statements are harder to understand diff --git a/crates/ruff/src/rules/pylint/rules/too_many_statements.rs b/crates/ruff/src/rules/pylint/rules/too_many_statements.rs index 4088a9e473..a026c6f12b 100644 --- a/crates/ruff/src/rules/pylint/rules/too_many_statements.rs +++ b/crates/ruff/src/rules/pylint/rules/too_many_statements.rs @@ -8,7 +8,7 @@ use ruff_python_ast::identifier::Identifier; /// Checks for functions or methods with too many statements. /// /// By default, this rule allows up to 50 statements, as configured by the -/// `pylint.max-statements` option. +/// [`pylint.max-statements`] option. /// /// ## Why is this bad? /// Functions or methods with many statements are harder to understand From 010293ddcc09bad21e869281bd9a5e99d7afa9ff Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sat, 12 Aug 2023 16:32:09 -0400 Subject: [PATCH 091/155] Use a unified policy abstraction for the `flake8-tidy-imports` rules (#6527) ## Summary Generalizes the abstractions for name matching introduced in https://github.com/astral-sh/ruff/pull/6378 and applies them to the existing `banned_api` rule, such that both rules have a uniform API and implementation. ## Test Plan `cargo test` --- .../src/checkers/ast/analyze/statement.rs | 58 ++++++++++---- .../src/rules/flake8_tidy_imports/matchers.rs | 75 +++++++++++++++++++ .../ruff/src/rules/flake8_tidy_imports/mod.rs | 1 + .../flake8_tidy_imports/rules/banned_api.rs | 41 ++-------- .../rules/banned_module_level_imports.rs | 69 +++++------------ 5 files changed, 144 insertions(+), 100 deletions(-) create mode 100644 crates/ruff/src/rules/flake8_tidy_imports/matchers.rs diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index ada91344da..880bec99dc 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -556,18 +556,26 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } } if checker.enabled(Rule::BannedApi) { - flake8_tidy_imports::rules::name_or_parent_is_banned( + flake8_tidy_imports::rules::banned_api( checker, - &alias.name, - alias, + &flake8_tidy_imports::matchers::NameMatchPolicy::MatchNameOrParent( + flake8_tidy_imports::matchers::MatchNameOrParent { + module: &alias.name, + }, + ), + &alias, ); } if checker.enabled(Rule::BannedModuleLevelImports) { - flake8_tidy_imports::rules::name_or_parent_is_banned_at_module_level( + flake8_tidy_imports::rules::banned_module_level_imports( checker, - &alias.name, - alias.range(), + &flake8_tidy_imports::matchers::NameMatchPolicy::MatchNameOrParent( + flake8_tidy_imports::matchers::MatchNameOrParent { + module: &alias.name, + }, + ), + &alias, ); } @@ -721,16 +729,27 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if let Some(module) = helpers::resolve_imported_module_path(level, module, checker.module_path) { - flake8_tidy_imports::rules::name_or_parent_is_banned(checker, &module, stmt); + flake8_tidy_imports::rules::banned_api( + checker, + &flake8_tidy_imports::matchers::NameMatchPolicy::MatchNameOrParent( + flake8_tidy_imports::matchers::MatchNameOrParent { module: &module }, + ), + &stmt, + ); for alias in names { if &alias.name == "*" { continue; } - flake8_tidy_imports::rules::name_is_banned( + flake8_tidy_imports::rules::banned_api( checker, - format!("{module}.{}", alias.name), - alias, + &flake8_tidy_imports::matchers::NameMatchPolicy::MatchName( + flake8_tidy_imports::matchers::MatchName { + module: &module, + member: &alias.name, + }, + ), + &alias, ); } } @@ -739,20 +758,27 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if let Some(module) = helpers::resolve_imported_module_path(level, module, checker.module_path) { - flake8_tidy_imports::rules::name_or_parent_is_banned_at_module_level( + flake8_tidy_imports::rules::banned_module_level_imports( checker, - &module, - stmt.range(), + &flake8_tidy_imports::matchers::NameMatchPolicy::MatchNameOrParent( + flake8_tidy_imports::matchers::MatchNameOrParent { module: &module }, + ), + &stmt, ); for alias in names { if &alias.name == "*" { continue; } - flake8_tidy_imports::rules::name_is_banned_at_module_level( + flake8_tidy_imports::rules::banned_module_level_imports( checker, - &format!("{module}.{}", alias.name), - alias.range(), + &flake8_tidy_imports::matchers::NameMatchPolicy::MatchName( + flake8_tidy_imports::matchers::MatchName { + module: &module, + member: &alias.name, + }, + ), + &alias, ); } } diff --git a/crates/ruff/src/rules/flake8_tidy_imports/matchers.rs b/crates/ruff/src/rules/flake8_tidy_imports/matchers.rs new file mode 100644 index 0000000000..a991280003 --- /dev/null +++ b/crates/ruff/src/rules/flake8_tidy_imports/matchers.rs @@ -0,0 +1,75 @@ +/// Match an imported member against the ban policy. For example, given `from foo import bar`, +/// `foo` is the module and `bar` is the member. Performs an exact match. +#[derive(Debug)] +pub(crate) struct MatchName<'a> { + pub(crate) module: &'a str, + pub(crate) member: &'a str, +} + +impl MatchName<'_> { + fn is_match(&self, banned_module: &str) -> bool { + // Ex) Match banned `foo.bar` to import `foo.bar`, without allocating, assuming that + // `module` is `foo`, `member` is `bar`, and `banned_module` is `foo.bar`. + banned_module + .strip_prefix(self.module) + .and_then(|banned_module| banned_module.strip_prefix('.')) + .and_then(|banned_module| banned_module.strip_prefix(self.member)) + .is_some_and(str::is_empty) + } +} + +/// Match an imported module against the ban policy. For example, given `import foo.bar`, +/// `foo.bar` is the module. Matches against the module name or any of its parents. +#[derive(Debug)] +pub(crate) struct MatchNameOrParent<'a> { + pub(crate) module: &'a str, +} + +impl MatchNameOrParent<'_> { + fn is_match(&self, banned_module: &str) -> bool { + // Ex) Match banned `foo` to import `foo`. + if self.module == banned_module { + return true; + } + + // Ex) Match banned `foo` to import `foo.bar`. + if self + .module + .strip_prefix(banned_module) + .is_some_and(|suffix| suffix.starts_with('.')) + { + return true; + } + + false + } +} + +#[derive(Debug)] +pub(crate) enum NameMatchPolicy<'a> { + /// Only match an exact module name (e.g., given `import foo.bar`, only match `foo.bar`). + MatchName(MatchName<'a>), + /// Match an exact module name or any of its parents (e.g., given `import foo.bar`, match + /// `foo.bar` or `foo`). + MatchNameOrParent(MatchNameOrParent<'a>), +} + +impl NameMatchPolicy<'_> { + pub(crate) fn find<'a>(&self, banned_modules: impl Iterator) -> Option { + for banned_module in banned_modules { + match self { + NameMatchPolicy::MatchName(matcher) => { + if matcher.is_match(banned_module) { + return Some(banned_module.to_string()); + } + } + NameMatchPolicy::MatchNameOrParent(matcher) => { + if matcher.is_match(banned_module) { + return Some(banned_module.to_string()); + } + } + } + } + None + } +} diff --git a/crates/ruff/src/rules/flake8_tidy_imports/mod.rs b/crates/ruff/src/rules/flake8_tidy_imports/mod.rs index d136abbb1d..302640f4f8 100644 --- a/crates/ruff/src/rules/flake8_tidy_imports/mod.rs +++ b/crates/ruff/src/rules/flake8_tidy_imports/mod.rs @@ -1,4 +1,5 @@ //! Rules from [flake8-tidy-imports](https://pypi.org/project/flake8-tidy-imports/). +pub(crate) mod matchers; pub mod options; pub(crate) mod rules; pub mod settings; diff --git a/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_api.rs b/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_api.rs index e214802ded..a2e8e8ad25 100644 --- a/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_api.rs +++ b/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_api.rs @@ -5,6 +5,7 @@ use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::call_path::from_qualified_name; use crate::checkers::ast::Checker; +use crate::rules::flake8_tidy_imports::matchers::NameMatchPolicy; /// ## What it does /// Checks for banned imports. @@ -38,45 +39,17 @@ impl Violation for BannedApi { } /// TID251 -pub(crate) fn name_is_banned(checker: &mut Checker, name: String, located: &T) -where - T: Ranged, -{ +pub(crate) fn banned_api(checker: &mut Checker, policy: &NameMatchPolicy, node: &T) { let banned_api = &checker.settings.flake8_tidy_imports.banned_api; - if let Some(ban) = banned_api.get(&name) { - checker.diagnostics.push(Diagnostic::new( - BannedApi { - name, - message: ban.msg.to_string(), - }, - located.range(), - )); - } -} - -/// TID251 -pub(crate) fn name_or_parent_is_banned(checker: &mut Checker, name: &str, located: &T) -where - T: Ranged, -{ - let banned_api = &checker.settings.flake8_tidy_imports.banned_api; - let mut name = name; - loop { - if let Some(ban) = banned_api.get(name) { + if let Some(banned_module) = policy.find(banned_api.keys().map(AsRef::as_ref)) { + if let Some(reason) = banned_api.get(&banned_module) { checker.diagnostics.push(Diagnostic::new( BannedApi { - name: name.to_string(), - message: ban.msg.to_string(), + name: banned_module, + message: reason.msg.to_string(), }, - located.range(), + node.range(), )); - return; - } - match name.rfind('.') { - Some(idx) => { - name = &name[..idx]; - } - None => return, } } } diff --git a/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs b/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs index 0efa1a3164..283b8f90a4 100644 --- a/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs +++ b/crates/ruff/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs @@ -1,8 +1,9 @@ use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_text_size::TextRange; +use ruff_python_ast::Ranged; use crate::checkers::ast::Checker; +use crate::rules::flake8_tidy_imports::matchers::NameMatchPolicy; /// ## What it does /// Checks for module-level imports that should instead be imported lazily @@ -52,60 +53,28 @@ impl Violation for BannedModuleLevelImports { } /// TID253 -pub(crate) fn name_is_banned_at_module_level( +pub(crate) fn banned_module_level_imports( checker: &mut Checker, - name: &str, - text_range: TextRange, -) { - banned_at_module_level_with_policy(checker, name, text_range, &NameMatchPolicy::ExactOnly); -} - -/// TID253 -pub(crate) fn name_or_parent_is_banned_at_module_level( - checker: &mut Checker, - name: &str, - text_range: TextRange, -) { - banned_at_module_level_with_policy(checker, name, text_range, &NameMatchPolicy::ExactOrParents); -} - -#[derive(Debug)] -enum NameMatchPolicy { - /// Only match an exact module name (e.g., given `import foo.bar`, only match `foo.bar`). - ExactOnly, - /// Match an exact module name or any of its parents (e.g., given `import foo.bar`, match - /// `foo.bar` or `foo`). - ExactOrParents, -} - -fn banned_at_module_level_with_policy( - checker: &mut Checker, - name: &str, - text_range: TextRange, policy: &NameMatchPolicy, + node: &T, ) { if !checker.semantic().at_top_level() { return; } - let banned_module_level_imports = &checker - .settings - .flake8_tidy_imports - .banned_module_level_imports; - for banned_module_name in banned_module_level_imports { - let name_is_banned = match policy { - NameMatchPolicy::ExactOnly => name == banned_module_name, - NameMatchPolicy::ExactOrParents => { - name == banned_module_name || name.starts_with(&format!("{banned_module_name}.")) - } - }; - if name_is_banned { - checker.diagnostics.push(Diagnostic::new( - BannedModuleLevelImports { - name: banned_module_name.to_string(), - }, - text_range, - )); - return; - } + + if let Some(banned_module) = policy.find( + checker + .settings + .flake8_tidy_imports + .banned_module_level_imports + .iter() + .map(AsRef::as_ref), + ) { + checker.diagnostics.push(Diagnostic::new( + BannedModuleLevelImports { + name: banned_module, + }, + node.range(), + )); } } From dbf003fde47d99b266baf2ae3080361c92088d99 Mon Sep 17 00:00:00 2001 From: Presley Graham Date: Sat, 12 Aug 2023 16:37:56 -0400 Subject: [PATCH 092/155] importer: skip whitespace between comments at start of file (#6523) ## Summary When adding an import, such as when fixing `I002`, ruff doesn't skip whitespace between comments, but isort does. See this issue for more detail: https://github.com/astral-sh/ruff/issues/6504 This change would fix that by skipping whitespace between comments in `Insertion.start_of_file()`. ## Test Plan I added a new test, `comments_and_newlines`, to verify this behavior. I also ran `cargo test` and no existing tests broke. That being said, this is technically a breaking change, as it's possible that someone was relying on the previous behavior. --- .../required_imports/comments_and_newlines.py | 6 ++++++ crates/ruff/src/importer/insertion.rs | 8 ++++++-- crates/ruff/src/rules/isort/mod.rs | 2 ++ ...uired_import_comments_and_newlines.py.snap | 20 +++++++++++++++++++ ...t_with_alias_comments_and_newlines.py.snap | 20 +++++++++++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 crates/ruff/resources/test/fixtures/isort/required_imports/comments_and_newlines.py create mode 100644 crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_comments_and_newlines.py.snap create mode 100644 crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_with_alias_comments_and_newlines.py.snap diff --git a/crates/ruff/resources/test/fixtures/isort/required_imports/comments_and_newlines.py b/crates/ruff/resources/test/fixtures/isort/required_imports/comments_and_newlines.py new file mode 100644 index 0000000000..5d2462ab9f --- /dev/null +++ b/crates/ruff/resources/test/fixtures/isort/required_imports/comments_and_newlines.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 +# A copyright notice could go here + +# A linter directive could go here + +x = 1 diff --git a/crates/ruff/src/importer/insertion.rs b/crates/ruff/src/importer/insertion.rs index 311a1be967..92c335a2df 100644 --- a/crates/ruff/src/importer/insertion.rs +++ b/crates/ruff/src/importer/insertion.rs @@ -67,9 +67,13 @@ impl<'a> Insertion<'a> { TextSize::default() }; - // Skip over commented lines. + // Skip over commented lines, with whitespace separation. for line in UniversalNewlineIterator::with_offset(locator.after(location), location) { - if line.trim_whitespace_start().starts_with('#') { + let trimmed_line = line.trim_whitespace_start(); + if trimmed_line.is_empty() { + continue; + } + if trimmed_line.starts_with('#') { location = line.full_end(); } else { break; diff --git a/crates/ruff/src/rules/isort/mod.rs b/crates/ruff/src/rules/isort/mod.rs index eed06c0e3d..c8780dd26d 100644 --- a/crates/ruff/src/rules/isort/mod.rs +++ b/crates/ruff/src/rules/isort/mod.rs @@ -762,6 +762,7 @@ mod tests { } #[test_case(Path::new("comment.py"))] + #[test_case(Path::new("comments_and_newlines.py"))] #[test_case(Path::new("docstring.py"))] #[test_case(Path::new("docstring.pyi"))] #[test_case(Path::new("docstring_only.py"))] @@ -791,6 +792,7 @@ mod tests { } #[test_case(Path::new("comment.py"))] + #[test_case(Path::new("comments_and_newlines.py"))] #[test_case(Path::new("docstring.py"))] #[test_case(Path::new("docstring.pyi"))] #[test_case(Path::new("docstring_only.py"))] diff --git a/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_comments_and_newlines.py.snap b/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_comments_and_newlines.py.snap new file mode 100644 index 0000000000..107c3ef147 --- /dev/null +++ b/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_comments_and_newlines.py.snap @@ -0,0 +1,20 @@ +--- +source: crates/ruff/src/rules/isort/mod.rs +--- +comments_and_newlines.py:1:1: I002 [*] Missing required import: `from __future__ import annotations` + | +1 | #!/usr/bin/env python3 + | I002 +2 | # A copyright notice could go here + | + = help: Insert required import: `from future import annotations` + +ℹ Fix +2 2 | # A copyright notice could go here +3 3 | +4 4 | # A linter directive could go here + 5 |+from __future__ import annotations +5 6 | +6 7 | x = 1 + + diff --git a/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_with_alias_comments_and_newlines.py.snap b/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_with_alias_comments_and_newlines.py.snap new file mode 100644 index 0000000000..a9ea7adf2e --- /dev/null +++ b/crates/ruff/src/rules/isort/snapshots/ruff__rules__isort__tests__required_import_with_alias_comments_and_newlines.py.snap @@ -0,0 +1,20 @@ +--- +source: crates/ruff/src/rules/isort/mod.rs +--- +comments_and_newlines.py:1:1: I002 [*] Missing required import: `from __future__ import annotations as _annotations` + | +1 | #!/usr/bin/env python3 + | I002 +2 | # A copyright notice could go here + | + = help: Insert required import: `from future import annotations as _annotations` + +ℹ Fix +2 2 | # A copyright notice could go here +3 3 | +4 4 | # A linter directive could go here + 5 |+from __future__ import annotations as _annotations +5 6 | +6 7 | x = 1 + + From 808e09180e7499f440f6910c4696dfd33071dddb Mon Sep 17 00:00:00 2001 From: Konrad Listwan-Ciesielski Date: Sun, 13 Aug 2023 08:29:32 +0700 Subject: [PATCH 093/155] Add docs for `DTZ005` and `DTZ006` (#6529) Changes: - Adds docs for `DTZ005` - Adds docs for `DTZ006` Related to: https://github.com/astral-sh/ruff/issues/2646 --- .../rules/call_datetime_fromtimestamp.rs | 39 ++++++++++++++++++- .../rules/call_datetime_now_without_tzinfo.rs | 37 +++++++++++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs index f0c86f3271..25c86ae1ec 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs @@ -8,6 +8,44 @@ use crate::rules::flake8_datetimez::rules::helpers::has_non_none_keyword; use super::helpers; +/// ## What it does +/// Checks for usage of `datetime.datetime.fromtimestamp()` without a `tz` +/// argument. +/// +/// ## Why is this bad? +/// Python datetime objects can be naive or timezone-aware. While an aware +/// object represents a specific moment in time, a naive object does not +/// contain enough information to unambiguously locate itself relative to other +/// datetime objects. Since this can lead to errors, it is recommended to +/// always use timezone-aware objects. +/// +/// `datetime.datetime.fromtimestamp(ts)` returns a naive datetime object. +/// Instead, use `datetime.datetime.fromtimestamp(ts, tz=)` to return a +/// timezone-aware object. +/// +/// ## Example +/// ```python +/// import datetime +/// +/// datetime.datetime.fromtimestamp(946684800) +/// ``` +/// +/// Use instead: +/// ```python +/// import datetime +/// +/// datetime.datetime.fromtimestamp(946684800, tz=datetime.timezone.utc) +/// ``` +/// +/// Or, for Python 3.11 and later: +/// ```python +/// import datetime +/// +/// datetime.datetime.fromtimestamp(946684800, tz=datetime.UTC) +/// ``` +/// +/// ## References +/// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[violation] pub struct CallDatetimeFromtimestamp; @@ -20,7 +58,6 @@ impl Violation for CallDatetimeFromtimestamp { } } -/// DTZ006 pub(crate) fn call_datetime_fromtimestamp(checker: &mut Checker, call: &ast::ExprCall) { if !checker .semantic() diff --git a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs index 9ebc9ecb27..73dd721684 100644 --- a/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs +++ b/crates/ruff/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs @@ -8,6 +8,42 @@ use crate::rules::flake8_datetimez::rules::helpers::has_non_none_keyword; use super::helpers; +/// ## What it does +/// Checks for usage of `datetime.datetime.now()` without a `tz` argument. +/// +/// ## Why is this bad? +/// Python datetime objects can be naive or timezone-aware. While an aware +/// object represents a specific moment in time, a naive object does not +/// contain enough information to unambiguously locate itself relative to other +/// datetime objects. Since this can lead to errors, it is recommended to +/// always use timezone-aware objects. +/// +/// `datetime.datetime.now()` returns a naive datetime object. Instead, use +/// `datetime.datetime.now(tz=)` to return a timezone-aware object. +/// +/// ## Example +/// ```python +/// import datetime +/// +/// datetime.datetime.now() +/// ``` +/// +/// Use instead: +/// ```python +/// import datetime +/// +/// datetime.datetime.now(tz=datetime.timezone.utc) +/// ``` +/// +/// Or, for Python 3.11 and later: +/// ```python +/// import datetime +/// +/// datetime.datetime.now(tz=datetime.UTC) +/// ``` +/// +/// ## References +/// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[violation] pub struct CallDatetimeNowWithoutTzinfo; @@ -18,7 +54,6 @@ impl Violation for CallDatetimeNowWithoutTzinfo { } } -/// DTZ005 pub(crate) fn call_datetime_now_without_tzinfo(checker: &mut Checker, call: &ast::ExprCall) { if !checker .semantic() From 8660e5057c1be0c0fa423715789a683fde7f2fe0 Mon Sep 17 00:00:00 2001 From: Takuma Watanabe Date: Mon, 14 Aug 2023 02:35:30 +0900 Subject: [PATCH 094/155] Fix minor document errors (#6533) ## Summary Fix minor errors in the sample codes of some rules. ## Test Plan N/A (Just fix document typos.) --- .../src/rules/flake8_bandit/rules/suspicious_function_call.rs | 2 +- crates/ruff/src/rules/flake8_simplify/rules/ast_bool_op.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ruff/src/rules/flake8_bandit/rules/suspicious_function_call.rs b/crates/ruff/src/rules/flake8_bandit/rules/suspicious_function_call.rs index 05bfc7aec9..7e706dae54 100644 --- a/crates/ruff/src/rules/flake8_bandit/rules/suspicious_function_call.rs +++ b/crates/ruff/src/rules/flake8_bandit/rules/suspicious_function_call.rs @@ -76,7 +76,7 @@ impl Violation for SuspiciousPickleUsage { /// import marshal /// /// with open("foo.marshal", "rb") as file: -/// foo = pickle.load(file) +/// foo = marshal.load(file) /// ``` /// /// Use instead: diff --git a/crates/ruff/src/rules/flake8_simplify/rules/ast_bool_op.rs b/crates/ruff/src/rules/flake8_simplify/rules/ast_bool_op.rs index e4d53b5a5f..0defd27edc 100644 --- a/crates/ruff/src/rules/flake8_simplify/rules/ast_bool_op.rs +++ b/crates/ruff/src/rules/flake8_simplify/rules/ast_bool_op.rs @@ -152,7 +152,7 @@ impl AlwaysAutofixableViolation for ExprAndNotExpr { /// /// ## Example /// ```python -/// x and not x +/// x or not x /// ``` /// /// ## References From 446ceed1ade59c4f121217c14e1543cce640a751 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sun, 13 Aug 2023 15:52:10 -0400 Subject: [PATCH 095/155] Support `IfExp` with dual string arms in `invalid-envvar-value` (#6538) ## Summary Closes https://github.com/astral-sh/ruff/issues/6537. We need to improve the `PythonType` algorithm, so this also documents some of its limitations as TODOs. --- .../fixtures/pylint/invalid_envvar_default.py | 1 + .../fixtures/pylint/invalid_envvar_value.py | 2 + .../pylint/rules/invalid_envvar_value.rs | 56 ++++------------- .../rules/pylint/rules/invalid_str_return.rs | 1 - ...ests__PLE1507_invalid_envvar_value.py.snap | 10 ---- .../src/analyze/type_inference.rs | 60 ++++++++++++------- 6 files changed, 52 insertions(+), 78 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_default.py b/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_default.py index c07de79871..9aa486678e 100644 --- a/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_default.py +++ b/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_default.py @@ -10,3 +10,4 @@ os.getenv("AA", "GOOD" + "BAD") os.getenv("AA", "GOOD" + 1) os.getenv("AA", "GOOD %s" % "BAD") os.getenv("B", Z) + diff --git a/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_value.py b/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_value.py index 23574d7b77..86de905340 100644 --- a/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_value.py +++ b/crates/ruff/resources/test/fixtures/pylint/invalid_envvar_value.py @@ -10,6 +10,8 @@ os.getenv(key="foo", default="bar") os.getenv(key=f"foo", default="bar") os.getenv(key="foo" + "bar", default=1) os.getenv(key=1 + "bar", default=1) # [invalid-envvar-value] +os.getenv("PATH_TEST" if using_clear_path else "PATH_ORIG") +os.getenv(1 if using_clear_path else "PATH_ORIG") AA = "aa" os.getenv(AA) diff --git a/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs b/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs index 03f2894832..89c6e509be 100644 --- a/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs +++ b/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs @@ -1,6 +1,7 @@ use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::{self as ast, Constant, Expr, Operator, Ranged}; +use ruff_python_ast::{self as ast, Ranged}; +use ruff_python_semantic::analyze::type_inference::PythonType; use crate::checkers::ast::Checker; @@ -32,46 +33,6 @@ impl Violation for InvalidEnvvarValue { } } -fn is_valid_key(expr: &Expr) -> bool { - // We can't infer the types of these defaults, so assume they're valid. - if matches!( - expr, - Expr::Name(_) | Expr::Attribute(_) | Expr::Subscript(_) | Expr::Call(_) - ) { - return true; - } - - // Allow string concatenation. - if let Expr::BinOp(ast::ExprBinOp { - left, - right, - op: Operator::Add, - range: _, - }) = expr - { - return is_valid_key(left) && is_valid_key(right); - } - - // Allow string formatting. - if let Expr::BinOp(ast::ExprBinOp { - left, - op: Operator::Mod, - .. - }) = expr - { - return is_valid_key(left); - } - - // Otherwise, the default must be a string. - matches!( - expr, - Expr::Constant(ast::ExprConstant { - value: Constant::Str { .. }, - .. - }) | Expr::FString(_) - ) -} - /// PLE1507 pub(crate) fn invalid_envvar_value(checker: &mut Checker, call: &ast::ExprCall) { if checker @@ -84,10 +45,15 @@ pub(crate) fn invalid_envvar_value(checker: &mut Checker, call: &ast::ExprCall) return; }; - if !is_valid_key(expr) { - checker - .diagnostics - .push(Diagnostic::new(InvalidEnvvarValue, expr.range())); + if matches!( + PythonType::from(expr), + PythonType::String | PythonType::Unknown + ) { + return; } + + checker + .diagnostics + .push(Diagnostic::new(InvalidEnvvarValue, expr.range())); } } diff --git a/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs b/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs index 85a8ae570d..57d00bca93 100644 --- a/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs +++ b/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs @@ -41,7 +41,6 @@ pub(crate) fn invalid_str_return(checker: &mut Checker, name: &str, body: &[Stmt for stmt in returns { if let Some(value) = stmt.value.as_deref() { - // Disallow other, non- if !matches!( PythonType::from(value), PythonType::String | PythonType::Unknown diff --git a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap index 1e8c0a24dd..d40d4ce4dc 100644 --- a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap +++ b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap @@ -31,14 +31,4 @@ invalid_envvar_value.py:8:11: PLE1507 Invalid type for initial `os.getenv` argum 10 | os.getenv(key=f"foo", default="bar") | -invalid_envvar_value.py:12:15: PLE1507 Invalid type for initial `os.getenv` argument; expected `str` - | -10 | os.getenv(key=f"foo", default="bar") -11 | os.getenv(key="foo" + "bar", default=1) -12 | os.getenv(key=1 + "bar", default=1) # [invalid-envvar-value] - | ^^^^^^^^^ PLE1507 -13 | -14 | AA = "aa" - | - diff --git a/crates/ruff_python_semantic/src/analyze/type_inference.rs b/crates/ruff_python_semantic/src/analyze/type_inference.rs index 225aa71612..52445620db 100644 --- a/crates/ruff_python_semantic/src/analyze/type_inference.rs +++ b/crates/ruff_python_semantic/src/analyze/type_inference.rs @@ -1,7 +1,7 @@ //! Analysis rules to perform basic type inference on individual expressions. use ruff_python_ast as ast; -use ruff_python_ast::{Constant, Expr}; +use ruff_python_ast::{Constant, Expr, Operator}; /// An extremely simple type inference system for individual expressions. /// @@ -9,7 +9,7 @@ use ruff_python_ast::{Constant, Expr}; /// such as strings, integers, floats, and containers. It cannot infer the /// types of variables or expressions that are not statically known from /// individual AST nodes alone. -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, is_macro::Is)] pub enum PythonType { /// A string literal, such as `"hello"`. String, @@ -55,27 +55,43 @@ impl From<&Expr> for PythonType { Expr::Tuple(_) => PythonType::Tuple, Expr::GeneratorExp(_) => PythonType::Generator, Expr::FString(_) => PythonType::String, - Expr::BinOp(ast::ExprBinOp { left, op, .. }) => { - // Ex) "a" % "b" - if op.is_mod() { - if matches!( - left.as_ref(), - Expr::Constant(ast::ExprConstant { - value: Constant::Str(..), - .. - }) - ) { - return PythonType::String; - } - if matches!( - left.as_ref(), - Expr::Constant(ast::ExprConstant { - value: Constant::Bytes(..), - .. - }) - ) { - return PythonType::Bytes; + Expr::IfExp(ast::ExprIfExp { body, orelse, .. }) => { + let body = PythonType::from(body.as_ref()); + let orelse = PythonType::from(orelse.as_ref()); + // TODO(charlie): If we have two known types, we should return a union. As-is, + // callers that ignore the `Unknown` type will allow invalid expressions (e.g., + // if you're testing for strings, you may accept `String` or `Unknown`, and you'd + // now accept, e.g., `1 if True else "a"`, which resolves to `Unknown`). + if body == orelse { + body + } else { + PythonType::Unknown + } + } + Expr::BinOp(ast::ExprBinOp { + left, op, right, .. + }) => { + match op { + // Ex) "a" + "b" + Operator::Add => { + match ( + PythonType::from(left.as_ref()), + PythonType::from(right.as_ref()), + ) { + (PythonType::String, PythonType::String) => return PythonType::String, + (PythonType::Bytes, PythonType::Bytes) => return PythonType::Bytes, + // TODO(charlie): If we have two known types, they may be incompatible. + // Return an error (e.g., for `1 + "a"`). + _ => {} + } } + // Ex) "a" % "b" + Operator::Mod => match PythonType::from(left.as_ref()) { + PythonType::String => return PythonType::String, + PythonType::Bytes => return PythonType::Bytes, + _ => {} + }, + _ => {} } PythonType::Unknown } From eb24f5a0b995f6c8bf0c79d0cbe3d0fb2910b1f0 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sun, 13 Aug 2023 17:15:54 -0400 Subject: [PATCH 096/155] Add some additional projects to the ecosystem CI (#6542) Adding five new projects. Some of these have seen issues filed, the others, I just tabbed through our dependency pain and looked for some reasonably-large projects that enabled rules beyond the default rule set. --- scripts/check_ecosystem.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/check_ecosystem.py b/scripts/check_ecosystem.py index 2b7b5f3775..607819b263 100755 --- a/scripts/check_ecosystem.py +++ b/scripts/check_ecosystem.py @@ -109,6 +109,10 @@ REPOSITORIES: list[Repository] = [ Repository("DisnakeDev", "disnake", "master"), Repository("apache", "airflow", "main", select="ALL"), Repository("bokeh", "bokeh", "branch-3.3", select="ALL"), + Repository("commaai", "openpilot", "master"), + Repository("freedomofpress", "securedrop", "develop"), + Repository("ibis-project", "ibis", "master"), + Repository("jrnl-org", "jrnl", "develop"), Repository("pypa", "build", "main"), Repository("pypa", "cibuildwheel", "main"), Repository("pypa", "pip", "main"), @@ -118,6 +122,7 @@ REPOSITORIES: list[Repository] = [ Repository("python-poetry", "poetry", "master"), Repository("scikit-build", "scikit-build", "main"), Repository("scikit-build", "scikit-build-core", "main"), + Repository("sphinx-doc", "sphinx", "master"), Repository("tiangolo", "fastapi", "master"), Repository("zulip", "zulip", "main", select="ALL"), ] @@ -301,7 +306,6 @@ DIFF_LINE_RE = re.compile( r"^(?P
[+-]) (?P(?P[^:]+):(?P\d+):\d+:) (?P.*)$",
 )
 
-
 T = TypeVar("T")
 
 

From 768686148f909be41b6f284f7c73696b0a9d7290 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Sun, 13 Aug 2023 18:00:50 -0400
Subject: [PATCH 097/155] Add support for unions to our Python builtins type
 system (#6541)

## Summary

Fixes some TODOs introduced in
https://github.com/astral-sh/ruff/pull/6538. In short, given an
expression like `1 if x > 0 else "Hello, world!"`, we now return a union
type that says the expression can resolve to either an `int` or a `str`.
The system remains very limited, it only works for obvious primitive
types, and there's no attempt to do inference on any more complex
variables. (If any expression yields `Unknown` or `TypeError`, we
propagate that result throughout and abort on the client's end.)
---
 Cargo.lock                                    |   1 +
 .../fixtures/pylint/bad_string_format_type.py |   2 +
 .../pylint/rules/bad_string_format_type.rs    |  34 +-
 .../pylint/rules/invalid_envvar_value.rs      |   6 +-
 .../rules/pylint/rules/invalid_str_return.rs  |   6 +-
 ...ts__PLE1307_bad_string_format_type.py.snap |  24 +-
 ...ests__PLE1507_invalid_envvar_value.py.snap |  20 +
 crates/ruff_python_semantic/Cargo.toml        |   5 +-
 .../src/analyze/type_inference.rs             | 532 +++++++++++++++---
 9 files changed, 529 insertions(+), 101 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index b7341c4264..ed93d2eb4d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2423,6 +2423,7 @@ dependencies = [
  "num-traits",
  "ruff_index",
  "ruff_python_ast",
+ "ruff_python_parser",
  "ruff_python_stdlib",
  "ruff_source_file",
  "ruff_text_size",
diff --git a/crates/ruff/resources/test/fixtures/pylint/bad_string_format_type.py b/crates/ruff/resources/test/fixtures/pylint/bad_string_format_type.py
index 66d6f2a5fd..3fe6722401 100644
--- a/crates/ruff/resources/test/fixtures/pylint/bad_string_format_type.py
+++ b/crates/ruff/resources/test/fixtures/pylint/bad_string_format_type.py
@@ -13,6 +13,7 @@ print("foo %(foo)d bar %(bar)d" % {"foo": "1", "bar": "2"})
 "%(key)d" % {"key": []}
 print("%d" % ("%s" % ("nested",),))
 "%d" % ((1, 2, 3),)
+"%d" % (1 if x > 0 else [])
 
 # False negatives
 WORD = "abc"
@@ -55,3 +56,4 @@ r'\%03o' % (ord(c),)
 "%d" % (len(foo),)
 '(%r, %r, %r, %r)' % (hostname, address, username, '$PASSWORD')
 '%r' % ({'server_school_roles': server_school_roles, 'is_school_multiserver_domain': is_school_multiserver_domain}, )
+"%d" % (1 if x > 0 else 2)
diff --git a/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs b/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs
index 1f2905751d..dfb7283f60 100644
--- a/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs
+++ b/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs
@@ -9,7 +9,7 @@ use rustc_hash::FxHashMap;
 use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
 use ruff_python_ast::str::{leading_quote, trailing_quote};
-use ruff_python_semantic::analyze::type_inference::PythonType;
+use ruff_python_semantic::analyze::type_inference::{NumberLike, PythonType, ResolvedPythonType};
 
 use crate::checkers::ast::Checker;
 
@@ -59,14 +59,16 @@ impl FormatType {
             | PythonType::Set
             | PythonType::Tuple
             | PythonType::Generator
-            | PythonType::Complex
-            | PythonType::Bool
             | PythonType::Ellipsis
             | PythonType::None => matches!(
                 self,
                 FormatType::Unknown | FormatType::String | FormatType::Repr
             ),
-            PythonType::Integer => matches!(
+            PythonType::Number(NumberLike::Complex | NumberLike::Bool) => matches!(
+                self,
+                FormatType::Unknown | FormatType::String | FormatType::Repr
+            ),
+            PythonType::Number(NumberLike::Integer) => matches!(
                 self,
                 FormatType::Unknown
                     | FormatType::String
@@ -75,7 +77,7 @@ impl FormatType {
                     | FormatType::Float
                     | FormatType::Number
             ),
-            PythonType::Float => matches!(
+            PythonType::Number(NumberLike::Float) => matches!(
                 self,
                 FormatType::Unknown
                     | FormatType::String
@@ -83,7 +85,6 @@ impl FormatType {
                     | FormatType::Float
                     | FormatType::Number
             ),
-            PythonType::Unknown => true,
         }
     }
 }
@@ -118,16 +119,22 @@ fn collect_specs(formats: &[CFormatStrOrBytes]) -> Vec<&CFormatSpec> {
 
 /// Return `true` if the format string is equivalent to the constant type
 fn equivalent(format: &CFormatSpec, value: &Expr) -> bool {
-    let format: FormatType = format.format_char.into();
-    let constant: PythonType = value.into();
-    format.is_compatible_with(constant)
+    let format = FormatType::from(format.format_char);
+    match ResolvedPythonType::from(value) {
+        ResolvedPythonType::Atom(atom) => format.is_compatible_with(atom),
+        ResolvedPythonType::Union(atoms) => {
+            atoms.iter().all(|atom| format.is_compatible_with(*atom))
+        }
+        ResolvedPythonType::Unknown => true,
+        ResolvedPythonType::TypeError => true,
+    }
 }
 
-/// Return `true` if the [`Constnat`] aligns with the format type.
+/// Return `true` if the [`Constant`] aligns with the format type.
 fn is_valid_constant(formats: &[CFormatStrOrBytes], value: &Expr) -> bool {
     let formats = collect_specs(formats);
-    // If there is more than one format, this is not valid python and we should
-    // return true so that no error is reported
+    // If there is more than one format, this is not valid Python and we should
+    // return true so that no error is reported.
     let [format] = formats.as_slice() else {
         return true;
     };
@@ -242,8 +249,7 @@ pub(crate) fn bad_string_format_type(checker: &mut Checker, expr: &Expr, right:
             values,
             range: _,
         }) => is_valid_dict(&format_strings, keys, values),
-        Expr::Constant(_) => is_valid_constant(&format_strings, right),
-        _ => true,
+        _ => is_valid_constant(&format_strings, right),
     };
     if !is_valid {
         checker
diff --git a/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs b/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs
index 89c6e509be..174a6a1359 100644
--- a/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs
+++ b/crates/ruff/src/rules/pylint/rules/invalid_envvar_value.rs
@@ -1,7 +1,7 @@
 use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
 use ruff_python_ast::{self as ast, Ranged};
-use ruff_python_semantic::analyze::type_inference::PythonType;
+use ruff_python_semantic::analyze::type_inference::{PythonType, ResolvedPythonType};
 
 use crate::checkers::ast::Checker;
 
@@ -46,8 +46,8 @@ pub(crate) fn invalid_envvar_value(checker: &mut Checker, call: &ast::ExprCall)
         };
 
         if matches!(
-            PythonType::from(expr),
-            PythonType::String | PythonType::Unknown
+            ResolvedPythonType::from(expr),
+            ResolvedPythonType::Unknown | ResolvedPythonType::Atom(PythonType::String)
         ) {
             return;
         }
diff --git a/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs b/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs
index 57d00bca93..3dd341a8f5 100644
--- a/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs
+++ b/crates/ruff/src/rules/pylint/rules/invalid_str_return.rs
@@ -3,7 +3,7 @@ use ruff_python_ast::{Ranged, Stmt};
 use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
 use ruff_python_ast::{helpers::ReturnStatementVisitor, statement_visitor::StatementVisitor};
-use ruff_python_semantic::analyze::type_inference::PythonType;
+use ruff_python_semantic::analyze::type_inference::{PythonType, ResolvedPythonType};
 
 use crate::checkers::ast::Checker;
 
@@ -42,8 +42,8 @@ pub(crate) fn invalid_str_return(checker: &mut Checker, name: &str, body: &[Stmt
     for stmt in returns {
         if let Some(value) = stmt.value.as_deref() {
             if !matches!(
-                PythonType::from(value),
-                PythonType::String | PythonType::Unknown
+                ResolvedPythonType::from(value),
+                ResolvedPythonType::Unknown | ResolvedPythonType::Atom(PythonType::String)
             ) {
                 checker
                     .diagnostics
diff --git a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1307_bad_string_format_type.py.snap b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1307_bad_string_format_type.py.snap
index a0366a476b..e50006d763 100644
--- a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1307_bad_string_format_type.py.snap
+++ b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1307_bad_string_format_type.py.snap
@@ -69,6 +69,16 @@ bad_string_format_type.py:10:1: PLE1307 Format type does not match argument type
 12 | "%d" % ([],)
    |
 
+bad_string_format_type.py:11:1: PLE1307 Format type does not match argument type
+   |
+ 9 | "%x" % 1.1
+10 | "%(key)x" % {"key": 1.1}
+11 | "%d" % []
+   | ^^^^^^^^^ PLE1307
+12 | "%d" % ([],)
+13 | "%(key)d" % {"key": []}
+   |
+
 bad_string_format_type.py:12:1: PLE1307 Format type does not match argument type
    |
 10 | "%(key)x" % {"key": 1.1}
@@ -96,6 +106,7 @@ bad_string_format_type.py:14:7: PLE1307 Format type does not match argument type
 14 | print("%d" % ("%s" % ("nested",),))
    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLE1307
 15 | "%d" % ((1, 2, 3),)
+16 | "%d" % (1 if x > 0 else [])
    |
 
 bad_string_format_type.py:15:1: PLE1307 Format type does not match argument type
@@ -104,8 +115,17 @@ bad_string_format_type.py:15:1: PLE1307 Format type does not match argument type
 14 | print("%d" % ("%s" % ("nested",),))
 15 | "%d" % ((1, 2, 3),)
    | ^^^^^^^^^^^^^^^^^^^ PLE1307
-16 | 
-17 | # False negatives
+16 | "%d" % (1 if x > 0 else [])
+   |
+
+bad_string_format_type.py:16:1: PLE1307 Format type does not match argument type
+   |
+14 | print("%d" % ("%s" % ("nested",),))
+15 | "%d" % ((1, 2, 3),)
+16 | "%d" % (1 if x > 0 else [])
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLE1307
+17 | 
+18 | # False negatives
    |
 
 
diff --git a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap
index d40d4ce4dc..6564ff6dd0 100644
--- a/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap
+++ b/crates/ruff/src/rules/pylint/snapshots/ruff__rules__pylint__tests__PLE1507_invalid_envvar_value.py.snap
@@ -31,4 +31,24 @@ invalid_envvar_value.py:8:11: PLE1507 Invalid type for initial `os.getenv` argum
 10 | os.getenv(key=f"foo", default="bar")
    |
 
+invalid_envvar_value.py:12:15: PLE1507 Invalid type for initial `os.getenv` argument; expected `str`
+   |
+10 | os.getenv(key=f"foo", default="bar")
+11 | os.getenv(key="foo" + "bar", default=1)
+12 | os.getenv(key=1 + "bar", default=1)  # [invalid-envvar-value]
+   |               ^^^^^^^^^ PLE1507
+13 | os.getenv("PATH_TEST" if using_clear_path else "PATH_ORIG")
+14 | os.getenv(1 if using_clear_path else "PATH_ORIG")
+   |
+
+invalid_envvar_value.py:14:11: PLE1507 Invalid type for initial `os.getenv` argument; expected `str`
+   |
+12 | os.getenv(key=1 + "bar", default=1)  # [invalid-envvar-value]
+13 | os.getenv("PATH_TEST" if using_clear_path else "PATH_ORIG")
+14 | os.getenv(1 if using_clear_path else "PATH_ORIG")
+   |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLE1507
+15 | 
+16 | AA = "aa"
+   |
+
 
diff --git a/crates/ruff_python_semantic/Cargo.toml b/crates/ruff_python_semantic/Cargo.toml
index 9b37767711..58484d140d 100644
--- a/crates/ruff_python_semantic/Cargo.toml
+++ b/crates/ruff_python_semantic/Cargo.toml
@@ -23,6 +23,7 @@ bitflags = { workspace = true }
 is-macro = { workspace = true }
 num-traits = { workspace = true }
 rustc-hash = { workspace = true }
-
-
 smallvec = { workspace = true }
+
+[dev-dependencies]
+ruff_python_parser = { path = "../ruff_python_parser" }
diff --git a/crates/ruff_python_semantic/src/analyze/type_inference.rs b/crates/ruff_python_semantic/src/analyze/type_inference.rs
index 52445620db..4bba5b9826 100644
--- a/crates/ruff_python_semantic/src/analyze/type_inference.rs
+++ b/crates/ruff_python_semantic/src/analyze/type_inference.rs
@@ -1,7 +1,317 @@
 //! Analysis rules to perform basic type inference on individual expressions.
 
+use rustc_hash::FxHashSet;
+
 use ruff_python_ast as ast;
-use ruff_python_ast::{Constant, Expr, Operator};
+use ruff_python_ast::{Constant, Expr, Operator, UnaryOp};
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum ResolvedPythonType {
+    /// The expression resolved to a single known type, like `str` or `int`.
+    Atom(PythonType),
+    /// The expression resolved to a union of known types, like `str | int`.
+    Union(FxHashSet),
+    /// The expression resolved to an unknown type, like a variable or function call.
+    Unknown,
+    /// The expression resolved to a `TypeError`, like `1 + "hello"`.
+    TypeError,
+}
+
+impl ResolvedPythonType {
+    #[must_use]
+    pub fn union(self, other: Self) -> Self {
+        match (self, other) {
+            (Self::TypeError, _) | (_, Self::TypeError) => Self::TypeError,
+            (Self::Unknown, _) | (_, Self::Unknown) => Self::Unknown,
+            (Self::Atom(a), Self::Atom(b)) => {
+                if a == b {
+                    Self::Atom(a)
+                } else {
+                    Self::Union(FxHashSet::from_iter([a, b]))
+                }
+            }
+            (Self::Atom(a), Self::Union(mut b)) => {
+                b.insert(a);
+                Self::Union(b)
+            }
+            (Self::Union(mut a), Self::Atom(b)) => {
+                a.insert(b);
+                Self::Union(a)
+            }
+            (Self::Union(mut a), Self::Union(b)) => {
+                a.extend(b);
+                Self::Union(a)
+            }
+        }
+    }
+}
+
+impl From<&Expr> for ResolvedPythonType {
+    fn from(expr: &Expr) -> Self {
+        match expr {
+            // Primitives.
+            Expr::Dict(_) => ResolvedPythonType::Atom(PythonType::Dict),
+            Expr::DictComp(_) => ResolvedPythonType::Atom(PythonType::Dict),
+            Expr::Set(_) => ResolvedPythonType::Atom(PythonType::Set),
+            Expr::SetComp(_) => ResolvedPythonType::Atom(PythonType::Set),
+            Expr::List(_) => ResolvedPythonType::Atom(PythonType::List),
+            Expr::ListComp(_) => ResolvedPythonType::Atom(PythonType::List),
+            Expr::Tuple(_) => ResolvedPythonType::Atom(PythonType::Tuple),
+            Expr::GeneratorExp(_) => ResolvedPythonType::Atom(PythonType::Generator),
+            Expr::FString(_) => ResolvedPythonType::Atom(PythonType::String),
+            Expr::Constant(ast::ExprConstant { value, .. }) => match value {
+                Constant::Str(_) => ResolvedPythonType::Atom(PythonType::String),
+                Constant::Int(_) => {
+                    ResolvedPythonType::Atom(PythonType::Number(NumberLike::Integer))
+                }
+                Constant::Float(_) => {
+                    ResolvedPythonType::Atom(PythonType::Number(NumberLike::Float))
+                }
+                Constant::Bool(_) => ResolvedPythonType::Atom(PythonType::Number(NumberLike::Bool)),
+                Constant::Complex { .. } => {
+                    ResolvedPythonType::Atom(PythonType::Number(NumberLike::Complex))
+                }
+                Constant::None => ResolvedPythonType::Atom(PythonType::None),
+                Constant::Ellipsis => ResolvedPythonType::Atom(PythonType::Ellipsis),
+                Constant::Bytes(_) => ResolvedPythonType::Atom(PythonType::Bytes),
+            },
+            // Simple container expressions.
+            Expr::NamedExpr(ast::ExprNamedExpr { value, .. }) => {
+                ResolvedPythonType::from(value.as_ref())
+            }
+            Expr::IfExp(ast::ExprIfExp { body, orelse, .. }) => {
+                let body = ResolvedPythonType::from(body.as_ref());
+                let orelse = ResolvedPythonType::from(orelse.as_ref());
+                body.union(orelse)
+            }
+
+            // Boolean operators.
+            Expr::BoolOp(ast::ExprBoolOp { values, .. }) => values
+                .iter()
+                .map(ResolvedPythonType::from)
+                .reduce(ResolvedPythonType::union)
+                .unwrap_or(ResolvedPythonType::Unknown),
+
+            // Unary operators.
+            Expr::UnaryOp(ast::ExprUnaryOp { operand, op, .. }) => match op {
+                UnaryOp::Invert => {
+                    return match ResolvedPythonType::from(operand.as_ref()) {
+                        ResolvedPythonType::Atom(PythonType::Number(
+                            NumberLike::Bool | NumberLike::Integer,
+                        )) => ResolvedPythonType::Atom(PythonType::Number(NumberLike::Integer)),
+                        ResolvedPythonType::Atom(_) => ResolvedPythonType::TypeError,
+                        _ => ResolvedPythonType::Unknown,
+                    }
+                }
+                // Ex) `not 1.0`
+                UnaryOp::Not => ResolvedPythonType::Atom(PythonType::Number(NumberLike::Bool)),
+                // Ex) `+1` or `-1`
+                UnaryOp::UAdd | UnaryOp::USub => {
+                    return match ResolvedPythonType::from(operand.as_ref()) {
+                        ResolvedPythonType::Atom(PythonType::Number(number)) => {
+                            ResolvedPythonType::Atom(PythonType::Number(
+                                if number == NumberLike::Bool {
+                                    NumberLike::Integer
+                                } else {
+                                    number
+                                },
+                            ))
+                        }
+                        ResolvedPythonType::Atom(_) => ResolvedPythonType::TypeError,
+                        _ => ResolvedPythonType::Unknown,
+                    }
+                }
+            },
+
+            // Binary operators.
+            Expr::BinOp(ast::ExprBinOp {
+                left, op, right, ..
+            }) => {
+                match op {
+                    Operator::Add => {
+                        match (
+                            ResolvedPythonType::from(left.as_ref()),
+                            ResolvedPythonType::from(right.as_ref()),
+                        ) {
+                            // Ex) `"Hello" + "world"`
+                            (
+                                ResolvedPythonType::Atom(PythonType::String),
+                                ResolvedPythonType::Atom(PythonType::String),
+                            ) => return ResolvedPythonType::Atom(PythonType::String),
+                            // Ex) `b"Hello" + b"world"`
+                            (
+                                ResolvedPythonType::Atom(PythonType::Bytes),
+                                ResolvedPythonType::Atom(PythonType::Bytes),
+                            ) => return ResolvedPythonType::Atom(PythonType::Bytes),
+                            // Ex) `[1] + [2]`
+                            (
+                                ResolvedPythonType::Atom(PythonType::List),
+                                ResolvedPythonType::Atom(PythonType::List),
+                            ) => return ResolvedPythonType::Atom(PythonType::List),
+                            // Ex) `(1, 2) + (3, 4)`
+                            (
+                                ResolvedPythonType::Atom(PythonType::Tuple),
+                                ResolvedPythonType::Atom(PythonType::Tuple),
+                            ) => return ResolvedPythonType::Atom(PythonType::Tuple),
+                            // Ex) `1 + 1.0`
+                            (
+                                ResolvedPythonType::Atom(PythonType::Number(left)),
+                                ResolvedPythonType::Atom(PythonType::Number(right)),
+                            ) => {
+                                return ResolvedPythonType::Atom(PythonType::Number(
+                                    left.coerce(right),
+                                ));
+                            }
+                            // Ex) `"a" + 1`
+                            (ResolvedPythonType::Atom(_), ResolvedPythonType::Atom(_)) => {
+                                return ResolvedPythonType::TypeError;
+                            }
+                            _ => {}
+                        }
+                    }
+                    Operator::Sub => {
+                        match (
+                            ResolvedPythonType::from(left.as_ref()),
+                            ResolvedPythonType::from(right.as_ref()),
+                        ) {
+                            // Ex) `1 - 1`
+                            (
+                                ResolvedPythonType::Atom(PythonType::Number(left)),
+                                ResolvedPythonType::Atom(PythonType::Number(right)),
+                            ) => {
+                                return ResolvedPythonType::Atom(PythonType::Number(
+                                    left.coerce(right),
+                                ));
+                            }
+                            // Ex) `{1, 2} - {2}`
+                            (
+                                ResolvedPythonType::Atom(PythonType::Set),
+                                ResolvedPythonType::Atom(PythonType::Set),
+                            ) => return ResolvedPythonType::Atom(PythonType::Set),
+                            // Ex) `"a" - "b"`
+                            (ResolvedPythonType::Atom(_), ResolvedPythonType::Atom(_)) => {
+                                return ResolvedPythonType::TypeError;
+                            }
+                            _ => {}
+                        }
+                    }
+                    // Ex) "a" % "b"
+                    Operator::Mod => match (
+                        ResolvedPythonType::from(left.as_ref()),
+                        ResolvedPythonType::from(right.as_ref()),
+                    ) {
+                        // Ex) `"Hello" % "world"`
+                        (ResolvedPythonType::Atom(PythonType::String), _) => {
+                            return ResolvedPythonType::Atom(PythonType::String)
+                        }
+                        // Ex) `b"Hello" % b"world"`
+                        (ResolvedPythonType::Atom(PythonType::Bytes), _) => {
+                            return ResolvedPythonType::Atom(PythonType::Bytes)
+                        }
+                        // Ex) `1 % 2`
+                        (
+                            ResolvedPythonType::Atom(PythonType::Number(left)),
+                            ResolvedPythonType::Atom(PythonType::Number(right)),
+                        ) => {
+                            return ResolvedPythonType::Atom(PythonType::Number(
+                                left.coerce(right),
+                            ));
+                        }
+                        _ => {}
+                    },
+                    // Standard arithmetic operators, which coerce to the "highest" number type.
+                    Operator::Mult | Operator::FloorDiv | Operator::Pow => match (
+                        ResolvedPythonType::from(left.as_ref()),
+                        ResolvedPythonType::from(right.as_ref()),
+                    ) {
+                        // Ex) `1 - 2`
+                        (
+                            ResolvedPythonType::Atom(PythonType::Number(left)),
+                            ResolvedPythonType::Atom(PythonType::Number(right)),
+                        ) => {
+                            return ResolvedPythonType::Atom(PythonType::Number(
+                                left.coerce(right),
+                            ));
+                        }
+                        (ResolvedPythonType::Atom(_), ResolvedPythonType::Atom(_)) => {
+                            return ResolvedPythonType::TypeError;
+                        }
+                        _ => {}
+                    },
+                    // Division, which returns at least `float`.
+                    Operator::Div => match (
+                        ResolvedPythonType::from(left.as_ref()),
+                        ResolvedPythonType::from(right.as_ref()),
+                    ) {
+                        // Ex) `1 / 2`
+                        (
+                            ResolvedPythonType::Atom(PythonType::Number(left)),
+                            ResolvedPythonType::Atom(PythonType::Number(right)),
+                        ) => {
+                            let resolved = left.coerce(right);
+                            return ResolvedPythonType::Atom(PythonType::Number(
+                                if resolved == NumberLike::Integer {
+                                    NumberLike::Float
+                                } else {
+                                    resolved
+                                },
+                            ));
+                        }
+                        (ResolvedPythonType::Atom(_), ResolvedPythonType::Atom(_)) => {
+                            return ResolvedPythonType::TypeError;
+                        }
+                        _ => {}
+                    },
+                    // Bitwise operators, which only work on `int` and `bool`.
+                    Operator::BitAnd
+                    | Operator::BitOr
+                    | Operator::BitXor
+                    | Operator::LShift
+                    | Operator::RShift => {
+                        match (
+                            ResolvedPythonType::from(left.as_ref()),
+                            ResolvedPythonType::from(right.as_ref()),
+                        ) {
+                            // Ex) `1 & 2`
+                            (
+                                ResolvedPythonType::Atom(PythonType::Number(left)),
+                                ResolvedPythonType::Atom(PythonType::Number(right)),
+                            ) => {
+                                let resolved = left.coerce(right);
+                                return if resolved == NumberLike::Integer {
+                                    ResolvedPythonType::Atom(PythonType::Number(
+                                        NumberLike::Integer,
+                                    ))
+                                } else {
+                                    ResolvedPythonType::TypeError
+                                };
+                            }
+                            (ResolvedPythonType::Atom(_), ResolvedPythonType::Atom(_)) => {
+                                return ResolvedPythonType::TypeError;
+                            }
+                            _ => {}
+                        }
+                    }
+                    Operator::MatMult => {}
+                }
+                ResolvedPythonType::Unknown
+            }
+            Expr::Lambda(_)
+            | Expr::Await(_)
+            | Expr::Yield(_)
+            | Expr::YieldFrom(_)
+            | Expr::Compare(_)
+            | Expr::Call(_)
+            | Expr::FormattedValue(_)
+            | Expr::Attribute(_)
+            | Expr::Subscript(_)
+            | Expr::Starred(_)
+            | Expr::Name(_)
+            | Expr::Slice(_)
+            | Expr::IpyEscapeCommand(_) => ResolvedPythonType::Unknown,
+        }
+    }
+}
 
 /// An extremely simple type inference system for individual expressions.
 ///
@@ -9,20 +319,14 @@ use ruff_python_ast::{Constant, Expr, Operator};
 /// such as strings, integers, floats, and containers. It cannot infer the
 /// types of variables or expressions that are not statically known from
 /// individual AST nodes alone.
-#[derive(Debug, Copy, Clone, PartialEq, Eq, is_macro::Is)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum PythonType {
     /// A string literal, such as `"hello"`.
     String,
     /// A bytes literal, such as `b"hello"`.
     Bytes,
-    /// An integer literal, such as `1` or `0x1`.
-    Integer,
-    /// A floating-point literal, such as `1.0` or `1e10`.
-    Float,
-    /// A complex literal, such as `1j` or `1+1j`.
-    Complex,
-    /// A boolean literal, such as `True` or `False`.
-    Bool,
+    /// An integer, float, or complex literal, such as `1` or `1.0`.
+    Number(NumberLike),
     /// A `None` literal, such as `None`.
     None,
     /// An ellipsis literal, such as `...`.
@@ -37,75 +341,149 @@ pub enum PythonType {
     Tuple,
     /// A generator expression, such as `(x for x in range(10))`.
     Generator,
-    /// An unknown type, such as a variable or function call.
-    Unknown,
 }
 
-impl From<&Expr> for PythonType {
-    fn from(expr: &Expr) -> Self {
-        match expr {
-            Expr::NamedExpr(ast::ExprNamedExpr { value, .. }) => (value.as_ref()).into(),
-            Expr::UnaryOp(ast::ExprUnaryOp { operand, .. }) => (operand.as_ref()).into(),
-            Expr::Dict(_) => PythonType::Dict,
-            Expr::DictComp(_) => PythonType::Dict,
-            Expr::Set(_) => PythonType::Set,
-            Expr::SetComp(_) => PythonType::Set,
-            Expr::List(_) => PythonType::List,
-            Expr::ListComp(_) => PythonType::List,
-            Expr::Tuple(_) => PythonType::Tuple,
-            Expr::GeneratorExp(_) => PythonType::Generator,
-            Expr::FString(_) => PythonType::String,
-            Expr::IfExp(ast::ExprIfExp { body, orelse, .. }) => {
-                let body = PythonType::from(body.as_ref());
-                let orelse = PythonType::from(orelse.as_ref());
-                // TODO(charlie): If we have two known types, we should return a union. As-is,
-                // callers that ignore the `Unknown` type will allow invalid expressions (e.g.,
-                // if you're testing for strings, you may accept `String` or `Unknown`, and you'd
-                // now accept, e.g., `1 if True else "a"`, which resolves to `Unknown`).
-                if body == orelse {
-                    body
-                } else {
-                    PythonType::Unknown
-                }
-            }
-            Expr::BinOp(ast::ExprBinOp {
-                left, op, right, ..
-            }) => {
-                match op {
-                    // Ex) "a" + "b"
-                    Operator::Add => {
-                        match (
-                            PythonType::from(left.as_ref()),
-                            PythonType::from(right.as_ref()),
-                        ) {
-                            (PythonType::String, PythonType::String) => return PythonType::String,
-                            (PythonType::Bytes, PythonType::Bytes) => return PythonType::Bytes,
-                            // TODO(charlie): If we have two known types, they may be incompatible.
-                            // Return an error (e.g., for `1 + "a"`).
-                            _ => {}
-                        }
-                    }
-                    // Ex) "a" % "b"
-                    Operator::Mod => match PythonType::from(left.as_ref()) {
-                        PythonType::String => return PythonType::String,
-                        PythonType::Bytes => return PythonType::Bytes,
-                        _ => {}
-                    },
-                    _ => {}
-                }
-                PythonType::Unknown
-            }
-            Expr::Constant(ast::ExprConstant { value, .. }) => match value {
-                Constant::Str(_) => PythonType::String,
-                Constant::Int(_) => PythonType::Integer,
-                Constant::Float(_) => PythonType::Float,
-                Constant::Bool(_) => PythonType::Bool,
-                Constant::Complex { .. } => PythonType::Complex,
-                Constant::None => PythonType::None,
-                Constant::Ellipsis => PythonType::Ellipsis,
-                Constant::Bytes(_) => PythonType::Bytes,
-            },
-            _ => PythonType::Unknown,
+/// A numeric type, or a type that can be trivially coerced to a numeric type.
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum NumberLike {
+    /// An integer literal, such as `1` or `0x1`.
+    Integer,
+    /// A floating-point literal, such as `1.0` or `1e10`.
+    Float,
+    /// A complex literal, such as `1j` or `1+1j`.
+    Complex,
+    /// A boolean literal, such as `True` or `False`.
+    Bool,
+}
+
+impl NumberLike {
+    /// Coerces two number-like types to the "highest" number-like type.
+    #[must_use]
+    pub fn coerce(self, other: NumberLike) -> NumberLike {
+        match (self, other) {
+            (NumberLike::Complex, _) | (_, NumberLike::Complex) => NumberLike::Complex,
+            (NumberLike::Float, _) | (_, NumberLike::Float) => NumberLike::Float,
+            _ => NumberLike::Integer,
         }
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use rustc_hash::FxHashSet;
+
+    use ruff_python_ast::Expr;
+    use ruff_python_parser::parse_expression;
+
+    use crate::analyze::type_inference::{NumberLike, PythonType, ResolvedPythonType};
+
+    fn parse(expression: &str) -> Expr {
+        parse_expression(expression, "").unwrap()
+    }
+
+    #[test]
+    fn type_inference() {
+        // Atoms.
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Integer))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("'Hello, world'")),
+            ResolvedPythonType::Atom(PythonType::String)
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("b'Hello, world'")),
+            ResolvedPythonType::Atom(PythonType::Bytes)
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("'Hello' % 'world'")),
+            ResolvedPythonType::Atom(PythonType::String)
+        );
+
+        // Boolean operators.
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1 and 2")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Integer))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1 and True")),
+            ResolvedPythonType::Union(FxHashSet::from_iter([
+                PythonType::Number(NumberLike::Integer),
+                PythonType::Number(NumberLike::Bool)
+            ]))
+        );
+
+        // Binary operators.
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1.0 * 2")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Float))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("2 * 1.0")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Float))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1.0 * 2j")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Complex))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1 / True")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Float))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1 / 2")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Float))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("{1, 2} - {2}")),
+            ResolvedPythonType::Atom(PythonType::Set)
+        );
+
+        // Unary operators.
+        assert_eq!(
+            ResolvedPythonType::from(&parse("-1")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Integer))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("-1.0")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Float))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("-1j")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Complex))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("-True")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Integer))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("not 'Hello'")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Bool))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("not x.y.z")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Bool))
+        );
+
+        // Conditional expressions.
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1 if True else 2")),
+            ResolvedPythonType::Atom(PythonType::Number(NumberLike::Integer))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1 if True else 2.0")),
+            ResolvedPythonType::Union(FxHashSet::from_iter([
+                PythonType::Number(NumberLike::Integer),
+                PythonType::Number(NumberLike::Float)
+            ]))
+        );
+        assert_eq!(
+            ResolvedPythonType::from(&parse("1 if True else False")),
+            ResolvedPythonType::Union(FxHashSet::from_iter([
+                PythonType::Number(NumberLike::Integer),
+                PythonType::Number(NumberLike::Bool)
+            ]))
+        );
+    }
+}

From bf4c6473c8f4b5a124577e3a6dbb96b0d89e0d8a Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Sun, 13 Aug 2023 23:51:36 -0400
Subject: [PATCH 098/155] Remove unnecessary `expr_name` function (#6544)

---
 .../flake8_comprehensions/rules/helpers.rs    | 17 +++----
 .../rules/unnecessary_call_around_sorted.rs   | 19 ++++----
 .../rules/unnecessary_collection_call.rs      | 13 +++---
 .../rules/unnecessary_comprehension.rs        | 33 +++++++-------
 .../unnecessary_double_cast_or_process.rs     | 44 +++++++++----------
 .../rules/unnecessary_literal_dict.rs         |  2 +-
 .../rules/unnecessary_map.rs                  | 20 ++++-----
 .../rules/unnecessary_subscript_reversal.rs   | 12 +++--
 8 files changed, 69 insertions(+), 91 deletions(-)

diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/helpers.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/helpers.rs
index af748a5f68..f22a8dd908 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/helpers.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/helpers.rs
@@ -1,12 +1,4 @@
-use ruff_python_ast::{self as ast, Expr, Keyword};
-
-pub(super) fn expr_name(func: &Expr) -> Option<&str> {
-    if let Expr::Name(ast::ExprName { id, .. }) = func {
-        Some(id)
-    } else {
-        None
-    }
-}
+use ruff_python_ast::{Expr, Keyword};
 
 pub(super) fn exactly_one_argument_with_matching_function<'a>(
     name: &str,
@@ -20,7 +12,8 @@ pub(super) fn exactly_one_argument_with_matching_function<'a>(
     if !keywords.is_empty() {
         return None;
     }
-    if expr_name(func)? != name {
+    let func = func.as_name_expr()?;
+    if func.id != name {
         return None;
     }
     Some(arg)
@@ -31,8 +24,8 @@ pub(super) fn first_argument_with_matching_function<'a>(
     func: &Expr,
     args: &'a [Expr],
 ) -> Option<&'a Expr> {
-    if expr_name(func)? == name {
-        Some(args.first()?)
+    if func.as_name_expr().is_some_and(|func| func.id == name) {
+        args.first()
     } else {
         None
     }
diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs
index 6757c96aa3..ae09498b29 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs
@@ -1,14 +1,11 @@
-use ruff_python_ast::{self as ast, Expr, Ranged};
-
 use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Fix};
 use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::{self as ast, Expr, Ranged};
 
 use crate::checkers::ast::Checker;
 use crate::registry::AsRule;
 use crate::rules::flake8_comprehensions::fixes;
 
-use super::helpers;
-
 /// ## What it does
 /// Checks for unnecessary `list` or `reversed` calls around `sorted`
 /// calls.
@@ -57,10 +54,10 @@ pub(crate) fn unnecessary_call_around_sorted(
     func: &Expr,
     args: &[Expr],
 ) {
-    let Some(outer) = helpers::expr_name(func) else {
+    let Some(outer) = func.as_name_expr() else {
         return;
     };
-    if !(outer == "list" || outer == "reversed") {
+    if !matches!(outer.id.as_str(), "list" | "reversed") {
         return;
     }
     let Some(arg) = args.first() else {
@@ -69,18 +66,18 @@ pub(crate) fn unnecessary_call_around_sorted(
     let Expr::Call(ast::ExprCall { func, .. }) = arg else {
         return;
     };
-    let Some(inner) = helpers::expr_name(func) else {
+    let Some(inner) = func.as_name_expr() else {
         return;
     };
-    if inner != "sorted" {
+    if inner.id != "sorted" {
         return;
     }
-    if !checker.semantic().is_builtin(inner) || !checker.semantic().is_builtin(outer) {
+    if !checker.semantic().is_builtin(&inner.id) || !checker.semantic().is_builtin(&outer.id) {
         return;
     }
     let mut diagnostic = Diagnostic::new(
         UnnecessaryCallAroundSorted {
-            func: outer.to_string(),
+            func: outer.id.to_string(),
         },
         expr.range(),
     );
@@ -91,7 +88,7 @@ pub(crate) fn unnecessary_call_around_sorted(
                 checker.stylist(),
                 expr,
             )?;
-            if outer == "reversed" {
+            if outer.id == "reversed" {
                 Ok(Fix::suggested(edit))
             } else {
                 Ok(Fix::automatic(edit))
diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs
index 444a1856e1..4ce85562c5 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs
@@ -1,15 +1,12 @@
-use ruff_python_ast::{Expr, Keyword, Ranged};
-
 use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic};
 use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::{Expr, Keyword, Ranged};
 
 use crate::checkers::ast::Checker;
 use crate::registry::AsRule;
 use crate::rules::flake8_comprehensions::fixes;
 use crate::rules::flake8_comprehensions::settings::Settings;
 
-use super::helpers;
-
 /// ## What it does
 /// Checks for unnecessary `dict`, `list` or `tuple` calls that can be
 /// rewritten as empty literals.
@@ -63,10 +60,10 @@ pub(crate) fn unnecessary_collection_call(
     if !args.is_empty() {
         return;
     }
-    let Some(id) = helpers::expr_name(func) else {
+    let Some(func) = func.as_name_expr() else {
         return;
     };
-    match id {
+    match func.id.as_str() {
         "dict"
             if keywords.is_empty()
                 || (!settings.allow_dict_calls_with_keyword_arguments
@@ -79,12 +76,12 @@ pub(crate) fn unnecessary_collection_call(
         }
         _ => return,
     };
-    if !checker.semantic().is_builtin(id) {
+    if !checker.semantic().is_builtin(func.id.as_str()) {
         return;
     }
     let mut diagnostic = Diagnostic::new(
         UnnecessaryCollectionCall {
-            obj_type: id.to_string(),
+            obj_type: func.id.to_string(),
         },
         expr.range(),
     );
diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs
index c9a7887dab..861dd766ce 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs
@@ -1,14 +1,11 @@
-use ruff_python_ast::{self as ast, Comprehension, Expr, Ranged};
-
 use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic};
 use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::{self as ast, Comprehension, Expr, Ranged};
 
 use crate::checkers::ast::Checker;
 use crate::registry::AsRule;
 use crate::rules::flake8_comprehensions::fixes;
 
-use super::helpers;
-
 /// ## What it does
 /// Checks for unnecessary `dict`, `list`, and `set` comprehension.
 ///
@@ -88,28 +85,28 @@ pub(crate) fn unnecessary_dict_comprehension(
     if !generator.ifs.is_empty() || generator.is_async {
         return;
     }
-    let Some(key_id) = helpers::expr_name(key) else {
+    let Some(key) = key.as_name_expr() else {
         return;
     };
-    let Some(value_id) = helpers::expr_name(value) else {
+    let Some(value) = value.as_name_expr() else {
         return;
     };
     let Expr::Tuple(ast::ExprTuple { elts, .. }) = &generator.target else {
         return;
     };
-    if elts.len() != 2 {
-        return;
-    }
-    let Some(target_key_id) = helpers::expr_name(&elts[0]) else {
+    let [target_key, target_value] = elts.as_slice() else {
         return;
     };
-    if target_key_id != key_id {
-        return;
-    }
-    let Some(target_value_id) = helpers::expr_name(&elts[1]) else {
+    let Some(target_key) = target_key.as_name_expr() else {
         return;
     };
-    if target_value_id != value_id {
+    let Some(target_value) = target_value.as_name_expr() else {
+        return;
+    };
+    if target_key.id != key.id {
+        return;
+    }
+    if target_value.id != value.id {
         return;
     }
     add_diagnostic(checker, expr);
@@ -128,13 +125,13 @@ pub(crate) fn unnecessary_list_set_comprehension(
     if !generator.ifs.is_empty() || generator.is_async {
         return;
     }
-    let Some(elt_id) = helpers::expr_name(elt) else {
+    let Some(elt) = elt.as_name_expr() else {
         return;
     };
-    let Some(target_id) = helpers::expr_name(&generator.target) else {
+    let Some(target) = generator.target.as_name_expr() else {
         return;
     };
-    if elt_id != target_id {
+    if elt.id != target.id {
         return;
     }
     add_diagnostic(checker, expr);
diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs
index 2e740c5434..489c970dce 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs
@@ -1,15 +1,12 @@
-use ruff_python_ast::{self as ast, Arguments, Expr, Keyword, Ranged};
-
 use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic};
 use ruff_macros::{derive_message_formats, violation};
 use ruff_python_ast::comparable::ComparableKeyword;
+use ruff_python_ast::{self as ast, Arguments, Expr, Keyword, Ranged};
 
 use crate::checkers::ast::Checker;
 use crate::registry::AsRule;
 use crate::rules::flake8_comprehensions::fixes;
 
-use super::helpers;
-
 /// ## What it does
 /// Checks for unnecessary `list`, `reversed`, `set`, `sorted`, and `tuple`
 /// call within `list`, `set`, `sorted`, and `tuple` calls.
@@ -72,15 +69,13 @@ pub(crate) fn unnecessary_double_cast_or_process(
     args: &[Expr],
     outer_kw: &[Keyword],
 ) {
-    let Some(outer) = helpers::expr_name(func) else {
+    let Some(outer) = func.as_name_expr() else {
         return;
     };
-    if !(outer == "list"
-        || outer == "tuple"
-        || outer == "set"
-        || outer == "reversed"
-        || outer == "sorted")
-    {
+    if !matches!(
+        outer.id.as_str(),
+        "list" | "tuple" | "set" | "reversed" | "sorted"
+    ) {
         return;
     }
     let Some(arg) = args.first() else {
@@ -96,16 +91,16 @@ pub(crate) fn unnecessary_double_cast_or_process(
     else {
         return;
     };
-    let Some(inner) = helpers::expr_name(func) else {
+    let Some(inner) = func.as_name_expr() else {
         return;
     };
-    if !checker.semantic().is_builtin(inner) || !checker.semantic().is_builtin(outer) {
+    if !checker.semantic().is_builtin(&inner.id) || !checker.semantic().is_builtin(&outer.id) {
         return;
     }
 
     // Avoid collapsing nested `sorted` calls with non-identical keyword arguments
     // (i.e., `key`, `reverse`).
-    if inner == "sorted" && outer == "sorted" {
+    if inner.id == "sorted" && outer.id == "sorted" {
         if inner_kw.len() != outer_kw.len() {
             return;
         }
@@ -118,18 +113,19 @@ pub(crate) fn unnecessary_double_cast_or_process(
         }
     }
 
-    // Ex) set(tuple(...))
-    // Ex) list(tuple(...))
-    // Ex) set(set(...))
-    if ((outer == "set" || outer == "sorted")
-        && (inner == "list" || inner == "tuple" || inner == "reversed" || inner == "sorted"))
-        || (outer == "set" && inner == "set")
-        || ((outer == "list" || outer == "tuple") && (inner == "list" || inner == "tuple"))
-    {
+    // Ex) `set(tuple(...))`
+    // Ex) `list(tuple(...))`
+    // Ex) `set(set(...))`
+    if matches!(
+        (outer.id.as_str(), inner.id.as_str()),
+        ("set" | "sorted", "list" | "tuple" | "reversed" | "sorted")
+            | ("set", "set")
+            | ("list" | "tuple", "list" | "tuple")
+    ) {
         let mut diagnostic = Diagnostic::new(
             UnnecessaryDoubleCastOrProcess {
-                inner: inner.to_string(),
-                outer: outer.to_string(),
+                inner: inner.id.to_string(),
+                outer: outer.id.to_string(),
             },
             expr.range(),
         );
diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs
index 31a30a7624..76b423facc 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs
@@ -70,7 +70,7 @@ pub(crate) fn unnecessary_literal_dict(
     // Accept `dict((1, 2), ...))` `dict([(1, 2), ...])`.
     if !elts
         .iter()
-        .all(|elt| matches!(&elt, Expr::Tuple(ast::ExprTuple { elts, .. } )if elts.len() == 2))
+        .all(|elt| matches!(&elt, Expr::Tuple(ast::ExprTuple { elts, .. }) if elts.len() == 2))
     {
         return;
     }
diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs
index 8b7e19375c..c914753be2 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_map.rs
@@ -68,11 +68,11 @@ pub(crate) fn unnecessary_map(
     func: &Expr,
     args: &[Expr],
 ) {
-    let Some(id) = helpers::expr_name(func) else {
+    let Some(func) = func.as_name_expr() else {
         return;
     };
 
-    let object_type = match id {
+    let object_type = match func.id.as_str() {
         "map" => ObjectType::Generator,
         "list" => ObjectType::List,
         "set" => ObjectType::Set,
@@ -80,20 +80,20 @@ pub(crate) fn unnecessary_map(
         _ => return,
     };
 
-    if !checker.semantic().is_builtin(id) {
+    if !checker.semantic().is_builtin(&func.id) {
         return;
     }
 
     match object_type {
         ObjectType::Generator => {
             // Exclude the parent if already matched by other arms.
-            if let Some(Expr::Call(ast::ExprCall { func, .. })) = parent {
-                if let Some(name) = helpers::expr_name(func) {
-                    if matches!(name, "list" | "set" | "dict") {
-                        return;
-                    }
-                }
-            };
+            if parent
+                .and_then(ruff_python_ast::Expr::as_call_expr)
+                .and_then(|call| call.func.as_name_expr())
+                .is_some_and(|name| matches!(name.id.as_str(), "list" | "set" | "dict"))
+            {
+                return;
+            }
 
             // Only flag, e.g., `map(lambda x: x + 1, iterable)`.
             let [Expr::Lambda(ast::ExprLambda {
diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs
index 60076232c4..092713ab4e 100644
--- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs
+++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs
@@ -1,13 +1,11 @@
 use num_bigint::BigInt;
-use ruff_python_ast::{self as ast, Constant, Expr, Ranged, UnaryOp};
 
 use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::{self as ast, Constant, Expr, Ranged, UnaryOp};
 
 use crate::checkers::ast::Checker;
 
-use super::helpers;
-
 /// ## What it does
 /// Checks for unnecessary subscript reversal of iterable.
 ///
@@ -52,13 +50,13 @@ pub(crate) fn unnecessary_subscript_reversal(
     let Some(first_arg) = args.first() else {
         return;
     };
-    let Some(id) = helpers::expr_name(func) else {
+    let Some(func) = func.as_name_expr() else {
         return;
     };
-    if !(id == "set" || id == "sorted" || id == "reversed") {
+    if !matches!(func.id.as_str(), "reversed" | "set" | "sorted") {
         return;
     }
-    if !checker.semantic().is_builtin(id) {
+    if !checker.semantic().is_builtin(&func.id) {
         return;
     }
     let Expr::Subscript(ast::ExprSubscript { slice, .. }) = first_arg else {
@@ -99,7 +97,7 @@ pub(crate) fn unnecessary_subscript_reversal(
     };
     checker.diagnostics.push(Diagnostic::new(
         UnnecessarySubscriptReversal {
-            func: id.to_string(),
+            func: func.id.to_string(),
         },
         expr.range(),
     ));

From 1a9536c4e213ca0627fb34c8c2bfeb058572b5e2 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 00:09:05 -0400
Subject: [PATCH 099/155] Remove `SemanticModel#find_binding` (#6546)

## Summary

This method is almost never what you actually want, because it doesn't
respect Python's scoping semantics. For example, if you call this within
a class method, it will return class attributes, whereas Python actually
_skips_ symbols in classes unless the load occurs within the class
itself. I also want to move away from these kinds of dynamic lookups and
more towards `resolve_name`, which performs a lookup based on the stored
`BindingId` at the time of symbol resolution, and will make it much
easier for us to separate model building from linting in the near
future.

## Test Plan

`cargo test`
---
 .../rules/private_member_access.rs            | 34 ++++++++---------
 crates/ruff/src/rules/pandas_vet/helpers.rs   | 38 ++++++++++---------
 .../pandas_vet/rules/inplace_argument.rs      | 22 +++--------
 crates/ruff_python_semantic/src/model.rs      | 26 +++++++------
 4 files changed, 55 insertions(+), 65 deletions(-)

diff --git a/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs b/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs
index 4a3c0cafc3..8749d54b52 100644
--- a/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs
+++ b/crates/ruff/src/rules/flake8_self/rules/private_member_access.rs
@@ -2,7 +2,7 @@ use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
 use ruff_python_ast::call_path::collect_call_path;
 use ruff_python_ast::{self as ast, Expr, Ranged};
-use ruff_python_semantic::ScopeKind;
+use ruff_python_semantic::{BindingKind, ScopeKind};
 
 use crate::checkers::ast::Checker;
 
@@ -156,31 +156,27 @@ pub(crate) fn private_member_access(checker: &mut Checker, expr: &Expr) {
             if matches!(call_path.as_slice(), ["self" | "cls" | "mcs"]) {
                 return;
             }
+        }
 
+        if let Expr::Name(name) = value.as_ref() {
             // Ignore accesses on class members from _within_ the class.
             if checker
                 .semantic()
-                .scopes
-                .iter()
-                .rev()
-                .find_map(|scope| match &scope.kind {
-                    ScopeKind::Class(ast::StmtClassDef { name, .. }) => Some(name),
-                    _ => None,
-                })
-                .is_some_and(|name| {
-                    if call_path.as_slice() == [name.as_str()] {
-                        checker
-                            .semantic()
-                            .find_binding(name)
-                            .is_some_and(|binding| {
-                                // TODO(charlie): Could the name ever be bound to a
-                                // _different_ class here?
-                                binding.kind.is_class_definition()
-                            })
+                .resolve_name(name)
+                .and_then(|id| {
+                    if let BindingKind::ClassDefinition(scope) = checker.semantic().binding(id).kind
+                    {
+                        Some(scope)
                     } else {
-                        false
+                        None
                     }
                 })
+                .is_some_and(|scope| {
+                    checker
+                        .semantic()
+                        .current_scope_ids()
+                        .any(|parent| scope == parent)
+                })
             {
                 return;
             }
diff --git a/crates/ruff/src/rules/pandas_vet/helpers.rs b/crates/ruff/src/rules/pandas_vet/helpers.rs
index 1136bfa1c7..295f160754 100644
--- a/crates/ruff/src/rules/pandas_vet/helpers.rs
+++ b/crates/ruff/src/rules/pandas_vet/helpers.rs
@@ -1,4 +1,3 @@
-use ruff_python_ast as ast;
 use ruff_python_ast::Expr;
 use ruff_python_semantic::{BindingKind, Imported, SemanticModel};
 
@@ -26,23 +25,26 @@ pub(super) fn test_expression(expr: &Expr, semantic: &SemanticModel) -> Resoluti
         | Expr::ListComp(_)
         | Expr::DictComp(_)
         | Expr::GeneratorExp(_) => Resolution::IrrelevantExpression,
-        Expr::Name(ast::ExprName { id, .. }) => semantic.find_binding(id).map_or(
-            Resolution::IrrelevantBinding,
-            |binding| match &binding.kind {
-                BindingKind::Annotation
-                | BindingKind::Argument
-                | BindingKind::Assignment
-                | BindingKind::NamedExprAssignment
-                | BindingKind::UnpackedAssignment
-                | BindingKind::LoopVar
-                | BindingKind::Global
-                | BindingKind::Nonlocal(_) => Resolution::RelevantLocal,
-                BindingKind::Import(import) if matches!(import.call_path(), ["pandas"]) => {
-                    Resolution::PandasModule
-                }
-                _ => Resolution::IrrelevantBinding,
-            },
-        ),
+        Expr::Name(name) => {
+            semantic
+                .resolve_name(name)
+                .map_or(Resolution::IrrelevantBinding, |id| {
+                    match &semantic.binding(id).kind {
+                        BindingKind::Annotation
+                        | BindingKind::Argument
+                        | BindingKind::Assignment
+                        | BindingKind::NamedExprAssignment
+                        | BindingKind::UnpackedAssignment
+                        | BindingKind::LoopVar
+                        | BindingKind::Global
+                        | BindingKind::Nonlocal(_) => Resolution::RelevantLocal,
+                        BindingKind::Import(import) if matches!(import.call_path(), ["pandas"]) => {
+                            Resolution::PandasModule
+                        }
+                        _ => Resolution::IrrelevantBinding,
+                    }
+                })
+        }
         _ => Resolution::RelevantLocal,
     }
 }
diff --git a/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs b/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs
index 7ac4a06a89..7cc11c2025 100644
--- a/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs
+++ b/crates/ruff/src/rules/pandas_vet/rules/inplace_argument.rs
@@ -2,8 +2,6 @@ use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation};
 use ruff_macros::{derive_message_formats, violation};
 use ruff_python_ast::helpers::is_const_true;
 use ruff_python_ast::{self as ast, Keyword, PySourceType, Ranged};
-use ruff_python_semantic::BindingKind;
-use ruff_python_semantic::Imported;
 use ruff_source_file::Locator;
 
 use crate::autofix::edits::{remove_argument, Parentheses};
@@ -53,20 +51,12 @@ impl Violation for PandasUseOfInplaceArgument {
 /// PD002
 pub(crate) fn inplace_argument(checker: &mut Checker, call: &ast::ExprCall) {
     // If the function was imported from another module, and it's _not_ Pandas, abort.
-    if let Some(call_path) = checker.semantic().resolve_call_path(&call.func) {
-        if !call_path
-            .first()
-            .and_then(|module| checker.semantic().find_binding(module))
-            .is_some_and(|binding| {
-                if let BindingKind::Import(import) = &binding.kind {
-                    matches!(import.call_path(), ["pandas"])
-                } else {
-                    false
-                }
-            })
-        {
-            return;
-        }
+    if checker
+        .semantic()
+        .resolve_call_path(&call.func)
+        .is_some_and(|call_path| !matches!(call_path.as_slice(), ["pandas", ..]))
+    {
+        return;
     }
 
     let mut seen_star = false;
diff --git a/crates/ruff_python_semantic/src/model.rs b/crates/ruff_python_semantic/src/model.rs
index 0a97a0a638..1221883920 100644
--- a/crates/ruff_python_semantic/src/model.rs
+++ b/crates/ruff_python_semantic/src/model.rs
@@ -233,13 +233,6 @@ impl<'a> SemanticModel<'a> {
         })
     }
 
-    /// Return the current [`Binding`] for a given `name`.
-    pub fn find_binding(&self, member: &str) -> Option<&Binding> {
-        self.current_scopes()
-            .find_map(|scope| scope.get(member))
-            .map(|binding_id| &self.bindings[binding_id])
-    }
-
     /// Return the [`BindingId`] that the given [`BindingId`] shadows, if any.
     ///
     /// Note that this will only return bindings that are shadowed by a binding in a parent scope.
@@ -618,6 +611,11 @@ impl<'a> SemanticModel<'a> {
         Some(binding_id)
     }
 
+    /// Resolves the [`ast::ExprName`] to the [`BindingId`] of the symbol it refers to, if any.
+    pub fn resolve_name(&self, name: &ast::ExprName) -> Option {
+        self.resolved_names.get(&name.into()).copied()
+    }
+
     /// Resolves the [`Expr`] to a fully-qualified symbol-name, if `value` resolves to an imported
     /// or builtin symbol.
     ///
@@ -642,11 +640,10 @@ impl<'a> SemanticModel<'a> {
 
         // If the name was already resolved, look it up; otherwise, search for the symbol.
         let head = match_head(value)?;
-        let binding = if let Some(id) = self.resolved_names.get(&head.into()) {
-            self.binding(*id)
-        } else {
-            self.find_binding(&head.id)?
-        };
+        let binding = self
+            .resolve_name(head)
+            .or_else(|| self.lookup_symbol(&head.id))
+            .map(|id| self.binding(id))?;
 
         match &binding.kind {
             BindingKind::Import(Import { call_path }) => {
@@ -917,6 +914,11 @@ impl<'a> SemanticModel<'a> {
         self.scopes.ancestors(self.scope_id)
     }
 
+    /// Returns an iterator over all scopes IDs, starting from the current [`Scope`].
+    pub fn current_scope_ids(&self) -> impl Iterator + '_ {
+        self.scopes.ancestor_ids(self.scope_id)
+    }
+
     /// Returns the parent of the given [`Scope`], if any.
     pub fn parent_scope(&self, scope: &Scope) -> Option<&Scope<'a>> {
         scope.parent.map(|scope_id| &self.scopes[scope_id])

From 51ae47ad56a676646d0a6032b624753bfa5a8b55 Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Mon, 14 Aug 2023 10:25:37 +0200
Subject: [PATCH 100/155] Remove lex and parsing from formatter benchmark
 (#6547)

---
 Cargo.lock                                 |  1 +
 crates/ruff_benchmark/Cargo.toml           |  1 +
 crates/ruff_benchmark/benches/formatter.rs | 38 ++++++++++++++++------
 3 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index ed93d2eb4d..8043bb4875 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2141,6 +2141,7 @@ dependencies = [
  "ruff",
  "ruff_python_ast",
  "ruff_python_formatter",
+ "ruff_python_index",
  "ruff_python_parser",
  "serde",
  "serde_json",
diff --git a/crates/ruff_benchmark/Cargo.toml b/crates/ruff_benchmark/Cargo.toml
index 734471e1d2..f55927fd06 100644
--- a/crates/ruff_benchmark/Cargo.toml
+++ b/crates/ruff_benchmark/Cargo.toml
@@ -37,6 +37,7 @@ ureq = "2.6.2"
 ruff.path = "../ruff"
 ruff_python_ast.path = "../ruff_python_ast"
 ruff_python_formatter = { path = "../ruff_python_formatter" }
+ruff_python_index = { path = "../ruff_python_index" }
 ruff_python_parser = { path = "../ruff_python_parser" }
 criterion = { version = "0.5.1"}
 
diff --git a/crates/ruff_benchmark/benches/formatter.rs b/crates/ruff_benchmark/benches/formatter.rs
index 6895bd2ac1..efcc986e72 100644
--- a/crates/ruff_benchmark/benches/formatter.rs
+++ b/crates/ruff_benchmark/benches/formatter.rs
@@ -1,8 +1,12 @@
-use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
-use ruff_benchmark::{TestCase, TestCaseSpeed, TestFile, TestFileDownloadError};
-use ruff_python_formatter::{format_module, PyFormatOptions};
 use std::path::Path;
-use std::time::Duration;
+
+use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
+
+use ruff_benchmark::{TestCase, TestFile, TestFileDownloadError};
+use ruff_python_formatter::{format_node, PyFormatOptions};
+use ruff_python_index::CommentRangesBuilder;
+use ruff_python_parser::lexer::lex;
+use ruff_python_parser::{parse_tokens, Mode};
 
 #[cfg(target_os = "windows")]
 #[global_allocator]
@@ -41,19 +45,33 @@ fn benchmark_formatter(criterion: &mut Criterion) {
 
     for case in test_cases {
         group.throughput(Throughput::Bytes(case.code().len() as u64));
-        group.measurement_time(match case.speed() {
-            TestCaseSpeed::Fast => Duration::from_secs(5),
-            TestCaseSpeed::Normal => Duration::from_secs(10),
-            TestCaseSpeed::Slow => Duration::from_secs(20),
-        });
 
         group.bench_with_input(
             BenchmarkId::from_parameter(case.name()),
             &case,
             |b, case| {
+                let mut tokens = Vec::new();
+                let mut comment_ranges = CommentRangesBuilder::default();
+
+                for result in lex(case.code(), Mode::Module) {
+                    let (token, range) = result.expect("Input to be a valid python program.");
+
+                    comment_ranges.visit_token(&token, range);
+                    tokens.push(Ok((token, range)));
+                }
+
+                let comment_ranges = comment_ranges.finish();
+
+                // Parse the AST.
+                let python_ast = parse_tokens(tokens, Mode::Module, "")
+                    .expect("Input to be a valid python program");
+
                 b.iter(|| {
                     let options = PyFormatOptions::from_extension(Path::new(case.name()));
-                    format_module(case.code(), options).expect("Formatting to succeed")
+                    let formatted = format_node(&python_ast, &comment_ranges, case.code(), options)
+                        .expect("Formatting to succeed");
+
+                    formatted.print().expect("Printing to succeed")
                 });
             },
         );

From 24f42f089412681104650e1867d259632bf60276 Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Mon, 14 Aug 2023 11:08:00 +0200
Subject: [PATCH 101/155] Printer: Remove unused state fields (#6548)

---
 crates/ruff_formatter/src/printer/mod.rs      | 21 +++++++------------
 .../src/printer/printer_options/mod.rs        |  6 ++++++
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/crates/ruff_formatter/src/printer/mod.rs b/crates/ruff_formatter/src/printer/mod.rs
index e24ab80ea8..b308f0b67d 100644
--- a/crates/ruff_formatter/src/printer/mod.rs
+++ b/crates/ruff_formatter/src/printer/mod.rs
@@ -695,8 +695,6 @@ impl<'a> Printer<'a> {
                 .buffer
                 .push_str(self.options.line_ending.as_str());
 
-            self.state.generated_line += 1;
-            self.state.generated_column = 0;
             self.state.line_width = 0;
 
             // Fit's only tests if groups up to the first line break fit.
@@ -704,12 +702,11 @@ impl<'a> Printer<'a> {
             self.state.measured_group_fits = false;
         } else {
             self.state.buffer.push(char);
-            self.state.generated_column += 1;
 
             let char_width = if char == '\t' {
-                self.options.tab_width as usize
+                self.options.tab_width as u32
             } else {
-                char.width().unwrap_or(0)
+                char.width().unwrap_or(0) as u32
             };
 
             self.state.line_width += char_width;
@@ -744,9 +741,7 @@ struct PrinterState<'a> {
     source_position: TextSize,
     pending_indent: Indention,
     measured_group_fits: bool,
-    generated_line: usize,
-    generated_column: usize,
-    line_width: usize,
+    line_width: u32,
     line_suffixes: LineSuffixes<'a>,
     verbatim_markers: Vec,
     group_modes: GroupModes,
@@ -1256,12 +1251,12 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
 
     fn fits_text(&mut self, text: &str, args: PrintElementArgs) -> Fits {
         let indent = std::mem::take(&mut self.state.pending_indent);
-        self.state.line_width += indent.level() as usize * self.options().indent_width() as usize
-            + indent.align() as usize;
+        self.state.line_width +=
+            indent.level() as u32 * self.options().indent_width() as u32 + indent.align() as u32;
 
         for c in text.chars() {
             let char_width = match c {
-                '\t' => self.options().tab_width as usize,
+                '\t' => self.options().tab_width as u32,
                 '\n' => {
                     if self.must_be_flat {
                         return Fits::No;
@@ -1275,7 +1270,7 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
                         }
                     };
                 }
-                c => c.width().unwrap_or(0),
+                c => c.width().unwrap_or(0) as u32,
             };
             self.state.line_width += char_width;
         }
@@ -1369,7 +1364,7 @@ impl From for Fits {
 struct FitsState {
     pending_indent: Indention,
     has_line_suffix: bool,
-    line_width: usize,
+    line_width: u32,
 }
 
 #[derive(Copy, Clone, Debug, Eq, PartialEq)]
diff --git a/crates/ruff_formatter/src/printer/printer_options/mod.rs b/crates/ruff_formatter/src/printer/printer_options/mod.rs
index 36b754fccc..291d02661f 100644
--- a/crates/ruff_formatter/src/printer/printer_options/mod.rs
+++ b/crates/ruff_formatter/src/printer/printer_options/mod.rs
@@ -43,6 +43,12 @@ impl From for usize {
     }
 }
 
+impl From for u32 {
+    fn from(width: PrintWidth) -> Self {
+        width.0
+    }
+}
+
 impl<'a, O> From<&'a O> for PrinterOptions
 where
     O: FormatOptions,

From c39bcbadffe25fb974ac1346b9e43ad82e04469b Mon Sep 17 00:00:00 2001
From: konsti 
Date: Mon, 14 Aug 2023 14:01:26 +0200
Subject: [PATCH 102/155] Always run check-formatter-ecosystem on main (#6503)

This makes it easier to get the latest similarity numbers from main
---
 .github/workflows/ci.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 13b1986afd..b2681cec59 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -328,7 +328,7 @@ jobs:
     name: "Formatter ecosystem and progress checks"
     runs-on: ubuntu-latest
     needs: determine_changes
-    if: needs.determine_changes.outputs.formatter == 'true'
+    if: needs.determine_changes.outputs.formatter == 'true' || github.ref == 'refs/heads/main'
     steps:
       - uses: actions/checkout@v3
       - name: "Install Rust toolchain"

From 9584f613b9c63d8bcf0f3574eeafb864d1e7446c Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Mon, 14 Aug 2023 14:02:06 +0200
Subject: [PATCH 103/155] Remove `allow(pedantic)` from formatter (#6549)

---
 .../ruff/src/checkers/ast/analyze/bindings.rs |   2 +-
 crates/ruff/src/line_width.rs                 |   2 +-
 crates/ruff/src/rules/pep8_naming/settings.rs |   2 +-
 .../rules/pyupgrade/rules/format_literals.rs  |   6 +-
 crates/ruff_formatter/src/arguments.rs        |  14 +-
 crates/ruff_formatter/src/buffer.rs           | 121 ++++++++--------
 crates/ruff_formatter/src/builders.rs         |  49 ++++---
 crates/ruff_formatter/src/format_element.rs   |  19 ++-
 .../src/format_element/document.rs            |  58 ++++----
 .../ruff_formatter/src/format_element/tag.rs  |  12 +-
 .../ruff_formatter/src/format_extensions.rs   |   3 +-
 crates/ruff_formatter/src/formatter.rs        |  10 +-
 crates/ruff_formatter/src/group_id.rs         |   2 +-
 crates/ruff_formatter/src/lib.rs              |  62 ++++----
 crates/ruff_formatter/src/macros.rs           |  15 +-
 .../ruff_formatter/src/printer/call_stack.rs  |  26 ++--
 crates/ruff_formatter/src/printer/mod.rs      | 136 ++++++++++--------
 .../src/printer/printer_options/mod.rs        |   8 +-
 crates/ruff_formatter/src/printer/queue.rs    |  65 +++++----
 crates/ruff_formatter/src/printer/stack.rs    |   2 +-
 crates/ruff_python_ast/src/visitor.rs         |  16 +--
 crates/ruff_python_literal/src/escape.rs      |   4 +-
 crates/ruff_python_parser/src/parser.rs       |  12 +-
 crates/ruff_python_parser/src/string.rs       |  10 +-
 crates/ruff_python_trivia/src/tokenizer.rs    |   8 +-
 25 files changed, 348 insertions(+), 316 deletions(-)

diff --git a/crates/ruff/src/checkers/ast/analyze/bindings.rs b/crates/ruff/src/checkers/ast/analyze/bindings.rs
index 91931f3ded..7a474640a7 100644
--- a/crates/ruff/src/checkers/ast/analyze/bindings.rs
+++ b/crates/ruff/src/checkers/ast/analyze/bindings.rs
@@ -16,7 +16,7 @@ pub(crate) fn bindings(checker: &mut Checker) {
         return;
     }
 
-    for binding in checker.semantic.bindings.iter() {
+    for binding in &*checker.semantic.bindings {
         if checker.enabled(Rule::UnusedVariable) {
             if binding.kind.is_bound_exception()
                 && !binding.is_used()
diff --git a/crates/ruff/src/line_width.rs b/crates/ruff/src/line_width.rs
index 8c1844185d..ee8e4f6bc9 100644
--- a/crates/ruff/src/line_width.rs
+++ b/crates/ruff/src/line_width.rs
@@ -59,7 +59,7 @@ impl Eq for LineWidth {}
 
 impl PartialOrd for LineWidth {
     fn partial_cmp(&self, other: &Self) -> Option {
-        self.width.partial_cmp(&other.width)
+        Some(self.cmp(other))
     }
 }
 
diff --git a/crates/ruff/src/rules/pep8_naming/settings.rs b/crates/ruff/src/rules/pep8_naming/settings.rs
index 5e8bbe23d3..0f67a8c19f 100644
--- a/crates/ruff/src/rules/pep8_naming/settings.rs
+++ b/crates/ruff/src/rules/pep8_naming/settings.rs
@@ -114,7 +114,7 @@ impl TryFrom for Settings {
                 .ignore_names
                 .unwrap_or_else(default_ignore_names)
                 .into_iter()
-                .chain(options.extend_ignore_names.unwrap_or_default().into_iter())
+                .chain(options.extend_ignore_names.unwrap_or_default())
                 .map(|name| IdentifierPattern::new(&name).map_err(SettingsError::InvalidIgnoreName))
                 .collect::, Self::Error>>()?,
             classmethod_decorators: options.classmethod_decorators.unwrap_or_default(),
diff --git a/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs b/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs
index 360e8b855f..90ad01b228 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/format_literals.rs
@@ -132,7 +132,7 @@ static FORMAT_SPECIFIER: Lazy =
     Lazy::new(|| Regex::new(r"\{(?P\d+)(?P.*?)}").unwrap());
 
 /// Remove the explicit positional indices from a format string.
-fn remove_specifiers<'a>(value: &mut Expression<'a>, arena: &'a mut typed_arena::Arena) {
+fn remove_specifiers<'a>(value: &mut Expression<'a>, arena: &'a typed_arena::Arena) {
     match value {
         Expression::SimpleString(expr) => {
             expr.value = arena.alloc(
@@ -217,8 +217,8 @@ fn generate_call(
 
     // Fix the string itself.
     let item = match_attribute(&mut call.func)?;
-    let mut arena = typed_arena::Arena::new();
-    remove_specifiers(&mut item.value, &mut arena);
+    let arena = typed_arena::Arena::new();
+    remove_specifiers(&mut item.value, &arena);
 
     // Remove the parentheses (first and last characters).
     let mut output = expression.codegen_stylist(stylist);
diff --git a/crates/ruff_formatter/src/arguments.rs b/crates/ruff_formatter/src/arguments.rs
index 01ee8f91e8..dae1a2df3e 100644
--- a/crates/ruff_formatter/src/arguments.rs
+++ b/crates/ruff_formatter/src/arguments.rs
@@ -3,8 +3,8 @@ use crate::FormatResult;
 use std::ffi::c_void;
 use std::marker::PhantomData;
 
-/// Mono-morphed type to format an object. Used by the [crate::format!], [crate::format_args!], and
-/// [crate::write!] macros.
+/// Mono-morphed type to format an object. Used by the [`crate::format`!], [`crate::format_args`!], and
+/// [`crate::write`!] macros.
 ///
 /// This struct is similar to a dynamic dispatch (using `dyn Format`) because it stores a pointer to the value.
 /// However, it doesn't store the pointer to `dyn Format`'s vtable, instead it statically resolves the function
@@ -33,23 +33,26 @@ impl<'fmt, Context> Argument<'fmt, Context> {
     #[doc(hidden)]
     #[inline]
     pub fn new>(value: &'fmt F) -> Self {
+        #[allow(clippy::inline_always)]
         #[inline(always)]
         fn formatter, Context>(
             ptr: *const c_void,
             fmt: &mut Formatter,
         ) -> FormatResult<()> {
             // SAFETY: Safe because the 'fmt lifetime is captured by the 'lifetime' field.
-            F::fmt(unsafe { &*(ptr as *const F) }, fmt)
+            #[allow(unsafe_code)]
+            F::fmt(unsafe { &*ptr.cast::() }, fmt)
         }
 
         Self {
-            value: value as *const F as *const c_void,
+            value: (value as *const F).cast::(),
             lifetime: PhantomData,
             formatter: formatter::,
         }
     }
 
     /// Formats the value stored by this argument using the given formatter.
+    #[allow(clippy::inline_always)]
     #[inline(always)]
     pub(super) fn format(&self, f: &mut Formatter) -> FormatResult<()> {
         (self.formatter)(self.value, f)
@@ -79,6 +82,7 @@ impl<'fmt, Context> Argument<'fmt, Context> {
 pub struct Arguments<'fmt, Context>(pub &'fmt [Argument<'fmt, Context>]);
 
 impl<'fmt, Context> Arguments<'fmt, Context> {
+    #[allow(clippy::inline_always)]
     #[doc(hidden)]
     #[inline(always)]
     pub fn new(arguments: &'fmt [Argument<'fmt, Context>]) -> Self {
@@ -87,6 +91,7 @@ impl<'fmt, Context> Arguments<'fmt, Context> {
 
     /// Returns the arguments
     #[inline]
+    #[allow(clippy::trivially_copy_pass_by_ref)] // Bug in Clippy? Sizeof Arguments is 16
     pub(super) fn items(&self) -> &'fmt [Argument<'fmt, Context>] {
         self.0
     }
@@ -101,6 +106,7 @@ impl Clone for Arguments<'_, Context> {
 }
 
 impl Format for Arguments<'_, Context> {
+    #[allow(clippy::inline_always)]
     #[inline(always)]
     fn fmt(&self, formatter: &mut Formatter) -> FormatResult<()> {
         formatter.write_fmt(*self)
diff --git a/crates/ruff_formatter/src/buffer.rs b/crates/ruff_formatter/src/buffer.rs
index 13cb542085..b6dab51a80 100644
--- a/crates/ruff_formatter/src/buffer.rs
+++ b/crates/ruff_formatter/src/buffer.rs
@@ -7,15 +7,15 @@ use std::any::{Any, TypeId};
 use std::fmt::Debug;
 use std::ops::{Deref, DerefMut};
 
-/// A trait for writing or formatting into [FormatElement]-accepting buffers or streams.
+/// A trait for writing or formatting into [`FormatElement`]-accepting buffers or streams.
 pub trait Buffer {
     /// The context used during formatting
     type Context;
 
-    /// Writes a [crate::FormatElement] into this buffer, returning whether the write succeeded.
+    /// Writes a [`crate::FormatElement`] into this buffer, returning whether the write succeeded.
     ///
     /// # Errors
-    /// This function will return an instance of [crate::FormatError] on error.
+    /// This function will return an instance of [`crate::FormatError`] on error.
     ///
     /// # Examples
     ///
@@ -122,7 +122,7 @@ impl BufferSnapshot {
                 Err(err) => {
                     panic!(
                         "Tried to unwrap snapshot of type {:?} as {:?}",
-                        err.type_id(),
+                        (*err).type_id(),
                         TypeId::of::()
                     )
                 }
@@ -160,7 +160,7 @@ impl + ?Sized, Context> Buffer for &mut W {
     }
 
     fn restore_snapshot(&mut self, snapshot: BufferSnapshot) {
-        (**self).restore_snapshot(snapshot)
+        (**self).restore_snapshot(snapshot);
     }
 }
 
@@ -426,7 +426,7 @@ where
     }
 
     fn restore_snapshot(&mut self, snapshot: BufferSnapshot) {
-        self.inner.restore_snapshot(snapshot)
+        self.inner.restore_snapshot(snapshot);
     }
 }
 
@@ -508,59 +508,58 @@ fn clean_interned(
     interned: &Interned,
     interned_cache: &mut FxHashMap,
 ) -> Interned {
-    match interned_cache.get(interned) {
-        Some(cleaned) => cleaned.clone(),
-        None => {
-            // Find the first soft line break element or interned element that must be changed
-            let result = interned
-                .iter()
-                .enumerate()
-                .find_map(|(index, element)| match element {
-                    FormatElement::Line(LineMode::Soft | LineMode::SoftOrSpace) => {
-                        let mut cleaned = Vec::new();
-                        cleaned.extend_from_slice(&interned[..index]);
-                        Some((cleaned, &interned[index..]))
-                    }
-                    FormatElement::Interned(inner) => {
-                        let cleaned_inner = clean_interned(inner, interned_cache);
-
-                        if &cleaned_inner != inner {
-                            let mut cleaned = Vec::with_capacity(interned.len());
-                            cleaned.extend_from_slice(&interned[..index]);
-                            cleaned.push(FormatElement::Interned(cleaned_inner));
-                            Some((cleaned, &interned[index + 1..]))
-                        } else {
-                            None
-                        }
-                    }
-
-                    _ => None,
-                });
-
-            let result = match result {
-                // Copy the whole interned buffer so that becomes possible to change the necessary elements.
-                Some((mut cleaned, rest)) => {
-                    for element in rest {
-                        let element = match element {
-                            FormatElement::Line(LineMode::Soft) => continue,
-                            FormatElement::Line(LineMode::SoftOrSpace) => FormatElement::Space,
-                            FormatElement::Interned(interned) => {
-                                FormatElement::Interned(clean_interned(interned, interned_cache))
-                            }
-                            element => element.clone(),
-                        };
-                        cleaned.push(element)
-                    }
-
-                    Interned::new(cleaned)
+    if let Some(cleaned) = interned_cache.get(interned) {
+        cleaned.clone()
+    } else {
+        // Find the first soft line break element or interned element that must be changed
+        let result = interned
+            .iter()
+            .enumerate()
+            .find_map(|(index, element)| match element {
+                FormatElement::Line(LineMode::Soft | LineMode::SoftOrSpace) => {
+                    let mut cleaned = Vec::new();
+                    cleaned.extend_from_slice(&interned[..index]);
+                    Some((cleaned, &interned[index..]))
                 }
-                // No change necessary, return existing interned element
-                None => interned.clone(),
-            };
+                FormatElement::Interned(inner) => {
+                    let cleaned_inner = clean_interned(inner, interned_cache);
 
-            interned_cache.insert(interned.clone(), result.clone());
-            result
-        }
+                    if &cleaned_inner == inner {
+                        None
+                    } else {
+                        let mut cleaned = Vec::with_capacity(interned.len());
+                        cleaned.extend_from_slice(&interned[..index]);
+                        cleaned.push(FormatElement::Interned(cleaned_inner));
+                        Some((cleaned, &interned[index + 1..]))
+                    }
+                }
+
+                _ => None,
+            });
+
+        let result = match result {
+            // Copy the whole interned buffer so that becomes possible to change the necessary elements.
+            Some((mut cleaned, rest)) => {
+                for element in rest {
+                    let element = match element {
+                        FormatElement::Line(LineMode::Soft) => continue,
+                        FormatElement::Line(LineMode::SoftOrSpace) => FormatElement::Space,
+                        FormatElement::Interned(interned) => {
+                            FormatElement::Interned(clean_interned(interned, interned_cache))
+                        }
+                        element => element.clone(),
+                    };
+                    cleaned.push(element);
+                }
+
+                Interned::new(cleaned)
+            }
+            // No change necessary, return existing interned element
+            None => interned.clone(),
+        };
+
+        interned_cache.insert(interned.clone(), result.clone());
+        result
     }
 }
 
@@ -597,7 +596,7 @@ impl Buffer for RemoveSoftLinesBuffer<'_, Context> {
     }
 
     fn restore_snapshot(&mut self, snapshot: BufferSnapshot) {
-        self.inner.restore_snapshot(snapshot)
+        self.inner.restore_snapshot(snapshot);
     }
 }
 
@@ -658,7 +657,7 @@ pub trait BufferExtensions: Buffer + Sized {
     where
         I: IntoIterator,
     {
-        for element in elements.into_iter() {
+        for element in elements {
             self.write_element(element)?;
         }
 
@@ -685,12 +684,12 @@ where
         }
     }
 
-    #[inline(always)]
+    #[inline]
     pub fn write_fmt(&mut self, arguments: Arguments) -> FormatResult<()> {
         self.buffer.write_fmt(arguments)
     }
 
-    #[inline(always)]
+    #[inline]
     pub fn write_element(&mut self, element: FormatElement) -> FormatResult<()> {
         self.buffer.write_element(element)
     }
diff --git a/crates/ruff_formatter/src/builders.rs b/crates/ruff_formatter/src/builders.rs
index 9c5e41d9f5..1cbe01e553 100644
--- a/crates/ruff_formatter/src/builders.rs
+++ b/crates/ruff_formatter/src/builders.rs
@@ -8,6 +8,7 @@ use ruff_text_size::TextRange;
 use std::cell::Cell;
 use std::marker::PhantomData;
 use std::num::NonZeroU8;
+#[allow(clippy::enum_glob_use)]
 use Tag::*;
 
 /// A line break that only gets printed if the enclosing `Group` doesn't fit on a single line.
@@ -34,7 +35,7 @@ use Tag::*;
 /// # Ok(())
 /// # }
 /// ```
-/// See [soft_line_break_or_space] if you want to insert a space between the elements if the enclosing
+/// See [`soft_line_break_or_space`] if you want to insert a space between the elements if the enclosing
 /// `Group` fits on a single line.
 ///
 /// Soft line breaks are emitted if the enclosing `Group` doesn't fit on a single line
@@ -217,7 +218,7 @@ impl std::fmt::Debug for Line {
 ///
 /// # Line feeds
 /// Tokens may contain line breaks but they must use the line feeds (`\n`).
-/// The [crate::Printer] converts the line feed characters to the character specified in the [crate::PrinterOptions].
+/// The [`crate::Printer`] converts the line feed characters to the character specified in the [`crate::PrinterOptions`].
 ///
 /// # Examples
 ///
@@ -520,7 +521,7 @@ impl Format for LineSuffixBoundary {
 ///
 /// This does not directly influence how this content will be printed, but some
 /// parts of the formatter may inspect the [labelled element](Tag::StartLabelled)
-/// using [FormatElements::has_label].
+/// using [`FormatElements::has_label`].
 ///
 /// ## Examples
 ///
@@ -648,7 +649,7 @@ impl Format for Space {
 /// the line breaks have to be manually added.
 ///
 /// This helper should be used only in rare cases, instead you should rely more on
-/// [block_indent] and [soft_block_indent]
+/// [`block_indent`] and [`soft_block_indent`]
 ///
 /// # Examples
 ///
@@ -970,7 +971,7 @@ impl std::fmt::Debug for Align<'_, Context> {
 /// Block indents indent a block of code, such as in a function body, and therefore insert a line
 /// break before and after the content.
 ///
-/// Doesn't create an indention if the passed in content is [FormatElement.is_empty].
+/// Doesn't create an indention if the passed in content is [`FormatElement.is_empty`].
 ///
 /// # Examples
 ///
@@ -1176,7 +1177,7 @@ impl Format for BlockIndent<'_, Context> {
             IndentMode::Soft => write!(f, [soft_line_break()])?,
             IndentMode::Block => write!(f, [hard_line_break()])?,
             IndentMode::SoftLineOrSpace | IndentMode::SoftSpace => {
-                write!(f, [soft_line_break_or_space()])?
+                write!(f, [soft_line_break_or_space()])?;
             }
         }
 
@@ -1374,17 +1375,19 @@ pub struct Group<'a, Context> {
 }
 
 impl Group<'_, Context> {
+    #[must_use]
     pub fn with_group_id(mut self, group_id: Option) -> Self {
         self.group_id = group_id;
         self
     }
 
-    /// Changes the [PrintMode] of the group from [`Flat`](PrintMode::Flat) to [`Expanded`](PrintMode::Expanded).
+    /// Changes the [`PrintMode`] of the group from [`Flat`](PrintMode::Flat) to [`Expanded`](PrintMode::Expanded).
     /// The result is that any soft-line break gets printed as a regular line break.
     ///
-    /// This is useful for content rendered inside of a [FormatElement::BestFitting] that prints each variant
-    /// in [PrintMode::Flat] to change some content to be printed in [`Expanded`](PrintMode::Expanded) regardless.
+    /// This is useful for content rendered inside of a [`FormatElement::BestFitting`] that prints each variant
+    /// in [`PrintMode::Flat`] to change some content to be printed in [`Expanded`](PrintMode::Expanded) regardless.
     /// See the documentation of the [`best_fitting`] macro for an example.
+    #[must_use]
     pub fn should_expand(mut self, should_expand: bool) -> Self {
         self.should_expand = should_expand;
         self
@@ -1393,9 +1396,10 @@ impl Group<'_, Context> {
 
 impl Format for Group<'_, Context> {
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
-        let mode = match self.should_expand {
-            true => GroupMode::Expand,
-            false => GroupMode::Flat,
+        let mode = if self.should_expand {
+            GroupMode::Expand
+        } else {
+            GroupMode::Flat
         };
 
         f.write_element(FormatElement::Tag(StartGroup(
@@ -1602,7 +1606,7 @@ impl Format for ExpandParent {
 ///
 /// The element has no special meaning if used outside of a `Group`. In that case, the content is always emitted.
 ///
-/// If you're looking for a way to only print something if the `Group` fits on a single line see [self::if_group_fits_on_line].
+/// If you're looking for a way to only print something if the `Group` fits on a single line see [`self::if_group_fits_on_line`].
 ///
 /// # Examples
 ///
@@ -1684,7 +1688,7 @@ where
 /// Adds a conditional content specific for `Group`s that fit on a single line. The content isn't
 /// emitted for `Group`s spanning multiple lines.
 ///
-/// See [if_group_breaks] if you're looking for a way to print content only for groups spanning multiple lines.
+/// See [`if_group_breaks`] if you're looking for a way to print content only for groups spanning multiple lines.
 ///
 /// # Examples
 ///
@@ -1823,6 +1827,7 @@ impl IfGroupBreaks<'_, Context> {
     /// # Ok(())
     /// # }
     /// ```
+    #[must_use]
     pub fn with_group_id(mut self, group_id: Option) -> Self {
         self.group_id = group_id;
         self
@@ -1855,7 +1860,7 @@ impl std::fmt::Debug for IfGroupBreaks<'_, Context> {
 
 /// Increases the indent level by one if the group with the specified id breaks.
 ///
-/// This IR has the same semantics as using [if_group_breaks] and [if_group_fits_on_line] together.
+/// This IR has the same semantics as using [`if_group_breaks`] and [`if_group_fits_on_line`] together.
 ///
 /// ```
 /// # use ruff_formatter::prelude::*;
@@ -1874,7 +1879,7 @@ impl std::fmt::Debug for IfGroupBreaks<'_, Context> {
 ///
 /// If you want to indent some content if the enclosing group breaks, use [`indent`].
 ///
-/// Use [if_group_breaks] or [if_group_fits_on_line] if the fitting and breaking content differs more than just the
+/// Use [`if_group_breaks`] or [`if_group_fits_on_line`] if the fitting and breaking content differs more than just the
 /// indention level.
 ///
 /// # Examples
@@ -1972,7 +1977,7 @@ impl std::fmt::Debug for IndentIfGroupBreaks<'_, Context> {
 
 /// Changes the definition of *fits* for `content`. Instead of measuring it in *flat*, measure it with
 /// all line breaks expanded and test if no line exceeds the line width. The [`FitsExpanded`] acts
-/// as a expands boundary similar to best fitting, meaning that a [hard_line_break] will not cause the parent group to expand.
+/// as a expands boundary similar to best fitting, meaning that a [`hard_line_break`] will not cause the parent group to expand.
 ///
 /// Useful in conjunction with a group with a condition.
 ///
@@ -2034,6 +2039,7 @@ pub struct FitsExpanded<'a, Context> {
 impl FitsExpanded<'_, Context> {
     /// Sets a `condition` to when the content should fit in expanded mode. The content uses the regular fits
     /// definition if the `condition` is not met.
+    #[must_use]
     pub fn with_condition(mut self, condition: Option) -> Self {
         self.condition = condition;
         self
@@ -2061,7 +2067,7 @@ impl Format for FormatWith
 where
     T: Fn(&mut Formatter) -> FormatResult<()>,
 {
-    #[inline(always)]
+    #[inline]
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
         (self.formatter)(f)
     }
@@ -2207,7 +2213,7 @@ impl Format for FormatOnce
 where
     T: FnOnce(&mut Formatter) -> FormatResult<()>,
 {
-    #[inline(always)]
+    #[inline]
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
         let formatter = self.formatter.take().expect("Tried to format a `format_once` at least twice. This is not allowed. You may want to use `format_with` or `format.memoized` instead.");
 
@@ -2222,7 +2228,7 @@ impl std::fmt::Debug for FormatOnce {
 }
 
 /// Builder to join together a sequence of content.
-/// See [Formatter::join]
+/// See [`Formatter::join`]
 #[must_use = "must eventually call `finish()` on Format builders"]
 pub struct JoinBuilder<'fmt, 'buf, Separator, Context> {
     result: FormatResult<()>,
@@ -2367,7 +2373,9 @@ impl<'a, Context> BestFitting<'a, Context> {
     /// You're looking for a way to create a `BestFitting` object, use the `best_fitting![least_expanded, most_expanded]` macro.
     ///
     /// ## Safety
+
     /// The slice must contain at least two variants.
+    #[allow(unsafe_code)]
     pub unsafe fn from_arguments_unchecked(variants: Arguments<'a, Context>) -> Self {
         assert!(
             variants.0.len() >= 2,
@@ -2395,6 +2403,7 @@ impl Format for BestFitting<'_, Context> {
 
         // SAFETY: The constructor guarantees that there are always at least two variants. It's, therefore,
         // safe to call into the unsafe `from_vec_unchecked` function
+        #[allow(unsafe_code)]
         let element = unsafe {
             FormatElement::BestFitting {
                 variants: format_element::BestFittingVariants::from_vec_unchecked(
diff --git a/crates/ruff_formatter/src/format_element.rs b/crates/ruff_formatter/src/format_element.rs
index 7506c9cb75..5598f103e1 100644
--- a/crates/ruff_formatter/src/format_element.rs
+++ b/crates/ruff_formatter/src/format_element.rs
@@ -13,7 +13,7 @@ use ruff_text_size::TextSize;
 
 /// Language agnostic IR for formatting source code.
 ///
-/// Use the helper functions like [crate::builders::space], [crate::builders::soft_line_break] etc. defined in this file to create elements.
+/// Use the helper functions like [`crate::builders::space`], [`crate::builders::soft_line_break`] etc. defined in this file to create elements.
 #[derive(Clone, Eq, PartialEq)]
 pub enum FormatElement {
     /// A space token, see [crate::builders::space] for documentation.
@@ -88,9 +88,7 @@ impl std::fmt::Debug for FormatElement {
                 .debug_struct("BestFitting")
                 .field("variants", variants)
                 .finish(),
-            FormatElement::Interned(interned) => {
-                fmt.debug_list().entries(interned.deref()).finish()
-            }
+            FormatElement::Interned(interned) => fmt.debug_list().entries(&**interned).finish(),
             FormatElement::Tag(tag) => fmt.debug_tuple("Tag").field(tag).finish(),
             FormatElement::SourcePosition(position) => {
                 fmt.debug_tuple("SourcePosition").field(position).finish()
@@ -180,7 +178,7 @@ impl Deref for Interned {
     type Target = [FormatElement];
 
     fn deref(&self) -> &Self::Target {
-        self.0.deref()
+        &self.0
     }
 }
 
@@ -217,12 +215,12 @@ pub fn normalize_newlines(text: &str, terminators: [char; N]) ->
 }
 
 impl FormatElement {
-    /// Returns `true` if self is a [FormatElement::Tag]
+    /// Returns `true` if self is a [`FormatElement::Tag`]
     pub const fn is_tag(&self) -> bool {
         matches!(self, FormatElement::Tag(_))
     }
 
-    /// Returns `true` if self is a [FormatElement::Tag] and [Tag::is_start] is `true`.
+    /// Returns `true` if self is a [`FormatElement::Tag`] and [`Tag::is_start`] is `true`.
     pub const fn is_start_tag(&self) -> bool {
         match self {
             FormatElement::Tag(tag) => tag.is_start(),
@@ -230,7 +228,7 @@ impl FormatElement {
         }
     }
 
-    /// Returns `true` if self is a [FormatElement::Tag] and [Tag::is_end] is `true`.
+    /// Returns `true` if self is a [`FormatElement::Tag`] and [`Tag::is_end`] is `true`.
     pub const fn is_end_tag(&self) -> bool {
         match self {
             FormatElement::Tag(tag) => tag.is_end(),
@@ -313,6 +311,7 @@ impl BestFittingVariants {
     /// ## Safety
     /// The slice must contain at least two variants.
     #[doc(hidden)]
+    #[allow(unsafe_code)]
     pub unsafe fn from_vec_unchecked(variants: Vec>) -> Self {
         debug_assert!(
             variants.len() >= 2,
@@ -359,9 +358,9 @@ impl<'a> IntoIterator for &'a BestFittingVariants {
 }
 
 pub trait FormatElements {
-    /// Returns true if this [FormatElement] is guaranteed to break across multiple lines by the printer.
+    /// Returns true if this [`FormatElement`] is guaranteed to break across multiple lines by the printer.
     /// This is the case if this format element recursively contains a:
-    /// - [crate::builders::empty_line] or [crate::builders::hard_line_break]
+    /// - [`crate::builders::empty_line`] or [`crate::builders::hard_line_break`]
     /// - A token containing '\n'
     ///
     /// Use this with caution, this is only a heuristic and the printer may print the element over multiple
diff --git a/crates/ruff_formatter/src/format_element/document.rs b/crates/ruff_formatter/src/format_element/document.rs
index c645b7d49c..7db6e9de2a 100644
--- a/crates/ruff_formatter/src/format_element/document.rs
+++ b/crates/ruff_formatter/src/format_element/document.rs
@@ -21,9 +21,9 @@ pub struct Document {
 
 impl Document {
     /// Sets [`expand`](tag::Group::expand) to [`GroupMode::Propagated`] if the group contains any of:
-    /// - a group with [`expand`](tag::Group::expand) set to [GroupMode::Propagated] or [GroupMode::Expand].
-    /// - a non-soft [line break](FormatElement::Line) with mode [LineMode::Hard], [LineMode::Empty], or [LineMode::Literal].
-    /// - a [FormatElement::ExpandParent]
+    /// - a group with [`expand`](tag::Group::expand) set to [`GroupMode::Propagated`] or [`GroupMode::Expand`].
+    /// - a non-soft [line break](FormatElement::Line) with mode [`LineMode::Hard`], [`LineMode::Empty`], or [`LineMode::Literal`].
+    /// - a [`FormatElement::ExpandParent`]
     ///
     /// [`BestFitting`] elements act as expand boundaries, meaning that the fact that a
     /// [`BestFitting`]'s content expands is not propagated past the [`BestFitting`] element.
@@ -71,15 +71,16 @@ impl Document {
                         Some(Enclosing::ConditionalGroup(group)) => !group.mode().is_flat(),
                         _ => false,
                     },
-                    FormatElement::Interned(interned) => match checked_interned.get(interned) {
-                        Some(interned_expands) => *interned_expands,
-                        None => {
+                    FormatElement::Interned(interned) => {
+                        if let Some(interned_expands) = checked_interned.get(interned) {
+                            *interned_expands
+                        } else {
                             let interned_expands =
                                 propagate_expands(interned, enclosing, checked_interned);
                             checked_interned.insert(interned, interned_expands);
                             interned_expands
                         }
-                    },
+                    }
                     FormatElement::BestFitting { variants } => {
                         enclosing.push(Enclosing::BestFitting);
 
@@ -114,7 +115,7 @@ impl Document {
 
                 if element_expands {
                     expands = true;
-                    expand_parent(enclosing)
+                    expand_parent(enclosing);
                 }
             }
 
@@ -226,6 +227,7 @@ impl FormatOptions for IrFormatOptions {
 
 impl Format> for &[FormatElement] {
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
+        #[allow(clippy::enum_glob_use)]
         use Tag::*;
 
         write!(f, [ContentArrayStart])?;
@@ -245,16 +247,10 @@ impl Format> for &[FormatElement] {
             first_element = false;
 
             match element {
-                element @ FormatElement::Space
-                | element @ FormatElement::StaticText { .. }
-                | element @ FormatElement::DynamicText { .. }
-                | element @ FormatElement::SourceCodeSlice { .. } => {
-                    if !in_text {
-                        write!(f, [text("\"")])?;
-                    }
-
-                    in_text = true;
-
+                element @ (FormatElement::Space
+                | FormatElement::StaticText { .. }
+                | FormatElement::DynamicText { .. }
+                | FormatElement::SourceCodeSlice { .. }) => {
                     fn write_escaped(
                         element: &FormatElement,
                         f: &mut Formatter,
@@ -277,6 +273,12 @@ impl Format> for &[FormatElement] {
                         }
                     }
 
+                    if !in_text {
+                        write!(f, [text("\"")])?;
+                    }
+
+                    in_text = true;
+
                     match element {
                         FormatElement::Space => {
                             write!(f, [text(" ")])?;
@@ -317,7 +319,7 @@ impl Format> for &[FormatElement] {
                     write!(
                         f,
                         [dynamic_text(
-                            &std::format!("source_position({:?})", position),
+                            &std::format!("source_position({position:?})"),
                             None
                         )]
                     )?;
@@ -335,7 +337,7 @@ impl Format> for &[FormatElement] {
                     ])?;
 
                     for variant in variants {
-                        write!(f, [variant.deref(), hard_line_break()])?;
+                        write!(f, [&**variant, hard_line_break()])?;
                     }
 
                     f.write_elements([
@@ -359,7 +361,7 @@ impl Format> for &[FormatElement] {
                                 [
                                     dynamic_text(&std::format!(""), None),
                                     space(),
-                                    &interned.deref(),
+                                    &&**interned,
                                 ]
                             )?;
                         }
@@ -621,7 +623,7 @@ struct ContentArrayStart;
 
 impl Format> for ContentArrayStart {
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
-        use Tag::*;
+        use Tag::{StartGroup, StartIndent};
 
         write!(f, [text("[")])?;
 
@@ -637,7 +639,7 @@ struct ContentArrayEnd;
 
 impl Format> for ContentArrayEnd {
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
-        use Tag::*;
+        use Tag::{EndGroup, EndIndent};
         f.write_elements([
             FormatElement::Tag(EndIndent),
             FormatElement::Line(LineMode::Soft),
@@ -650,7 +652,7 @@ impl Format> for ContentArrayEnd {
 
 impl FormatElements for [FormatElement] {
     fn will_break(&self) -> bool {
-        use Tag::*;
+        use Tag::{EndLineSuffix, StartLineSuffix};
         let mut ignore_depth = 0usize;
 
         for element in self {
@@ -687,9 +689,6 @@ impl FormatElements for [FormatElement] {
     }
 
     fn start_tag(&self, kind: TagKind) -> Option<&Tag> {
-        // Assert that the document ends at a tag with the specified kind;
-        let _ = self.end_tag(kind)?;
-
         fn traverse_slice<'a>(
             slice: &'a [FormatElement],
             kind: TagKind,
@@ -704,9 +703,8 @@ impl FormatElements for [FormatElement] {
                                 return None;
                             } else if *depth == 1 {
                                 return Some(tag);
-                            } else {
-                                *depth -= 1;
                             }
+                            *depth -= 1;
                         } else {
                             *depth += 1;
                         }
@@ -731,6 +729,8 @@ impl FormatElements for [FormatElement] {
 
             None
         }
+        // Assert that the document ends at a tag with the specified kind;
+        let _ = self.end_tag(kind)?;
 
         let mut depth = 0usize;
 
diff --git a/crates/ruff_formatter/src/format_element/tag.rs b/crates/ruff_formatter/src/format_element/tag.rs
index f586cc8b1c..91609b82c4 100644
--- a/crates/ruff_formatter/src/format_element/tag.rs
+++ b/crates/ruff_formatter/src/format_element/tag.rs
@@ -109,6 +109,7 @@ impl Tag {
     }
 
     pub const fn kind(&self) -> TagKind {
+        #[allow(clippy::enum_glob_use)]
         use Tag::*;
 
         match self {
@@ -180,13 +181,14 @@ impl FitsExpanded {
         Self::default()
     }
 
+    #[must_use]
     pub fn with_condition(mut self, condition: Option) -> Self {
         self.condition = condition;
         self
     }
 
     pub fn propagate_expand(&self) {
-        self.propagate_expand.set(true)
+        self.propagate_expand.set(true);
     }
 }
 
@@ -204,11 +206,13 @@ impl Group {
         }
     }
 
+    #[must_use]
     pub fn with_id(mut self, id: Option) -> Self {
         self.id = id;
         self
     }
 
+    #[must_use]
     pub fn with_mode(mut self, mode: GroupMode) -> Self {
         self.mode = Cell::new(mode);
         self
@@ -220,7 +224,7 @@ impl Group {
 
     pub fn propagate_expand(&self) {
         if self.mode.get() == GroupMode::Flat {
-            self.mode.set(GroupMode::Propagated)
+            self.mode.set(GroupMode::Propagated);
         }
     }
 
@@ -248,7 +252,7 @@ impl ConditionalGroup {
     }
 
     pub fn propagate_expand(&self) {
-        self.mode.set(GroupMode::Propagated)
+        self.mode.set(GroupMode::Propagated);
     }
 
     pub fn mode(&self) -> GroupMode {
@@ -312,6 +316,7 @@ impl Condition {
         }
     }
 
+    #[must_use]
     pub fn with_group_id(mut self, id: Option) -> Self {
         self.group_id = id;
         self
@@ -350,6 +355,7 @@ impl PartialEq for LabelId {
 }
 
 impl LabelId {
+    #[allow(clippy::needless_pass_by_value)]
     pub fn of(label: T) -> Self {
         Self {
             value: label.value(),
diff --git a/crates/ruff_formatter/src/format_extensions.rs b/crates/ruff_formatter/src/format_extensions.rs
index cde30df58a..6183826434 100644
--- a/crates/ruff_formatter/src/format_extensions.rs
+++ b/crates/ruff_formatter/src/format_extensions.rs
@@ -3,7 +3,6 @@
 use crate::prelude::*;
 use std::cell::RefCell;
 use std::marker::PhantomData;
-use std::ops::Deref;
 
 use crate::Buffer;
 
@@ -149,7 +148,7 @@ where
             .get_or_insert_with(|| f.intern(&self.inner));
 
         match result.as_ref() {
-            Ok(Some(FormatElement::Interned(interned))) => Ok(interned.deref()),
+            Ok(Some(FormatElement::Interned(interned))) => Ok(&**interned),
             Ok(Some(other)) => Ok(std::slice::from_ref(other)),
             Ok(None) => Ok(&[]),
             Err(error) => Err(*error),
diff --git a/crates/ruff_formatter/src/formatter.rs b/crates/ruff_formatter/src/formatter.rs
index 2f32010902..c0fa7d1920 100644
--- a/crates/ruff_formatter/src/formatter.rs
+++ b/crates/ruff_formatter/src/formatter.rs
@@ -35,7 +35,7 @@ impl<'buf, Context> Formatter<'buf, Context> {
     }
 
     /// Creates a new group id that is unique to this document. The passed debug name is used in the
-    /// [std::fmt::Debug] of the document if this is a debug build.
+    /// [`std::fmt::Debug`] of the document if this is a debug build.
     /// The name is unused for production builds and has no meaning on the equality of two group ids.
     pub fn group_id(&self, debug_name: &'static str) -> GroupId {
         self.state().group_id(debug_name)
@@ -108,7 +108,7 @@ impl<'buf, Context> Formatter<'buf, Context> {
         JoinBuilder::with_separator(self, joiner)
     }
 
-    /// Concatenates a list of [crate::Format] objects with spaces and line breaks to fit
+    /// Concatenates a list of [`crate::Format`] objects with spaces and line breaks to fit
     /// them on as few lines as possible. Each element introduces a conceptual group. The printer
     /// first tries to print the item in flat mode but then prints it in expanded mode if it doesn't fit.
     ///
@@ -205,7 +205,7 @@ where
 impl Buffer for Formatter<'_, Context> {
     type Context = Context;
 
-    #[inline(always)]
+    #[inline]
     fn write_element(&mut self, element: FormatElement) -> FormatResult<()> {
         self.buffer.write_element(element)
     }
@@ -214,7 +214,7 @@ impl Buffer for Formatter<'_, Context> {
         self.buffer.elements()
     }
 
-    #[inline(always)]
+    #[inline]
     fn write_fmt(&mut self, arguments: Arguments) -> FormatResult<()> {
         for argument in arguments.items() {
             argument.format(self)?;
@@ -235,7 +235,7 @@ impl Buffer for Formatter<'_, Context> {
     }
 
     fn restore_snapshot(&mut self, snapshot: BufferSnapshot) {
-        self.buffer.restore_snapshot(snapshot)
+        self.buffer.restore_snapshot(snapshot);
     }
 }
 
diff --git a/crates/ruff_formatter/src/group_id.rs b/crates/ruff_formatter/src/group_id.rs
index 8f06ae8e37..aa910dd1f3 100644
--- a/crates/ruff_formatter/src/group_id.rs
+++ b/crates/ruff_formatter/src/group_id.rs
@@ -25,7 +25,7 @@ impl std::fmt::Debug for DebugGroupId {
 
 /// Unique identification for a group.
 ///
-/// See [crate::Formatter::group_id] on how to get a unique id.
+/// See [`crate::Formatter::group_id`] on how to get a unique id.
 #[repr(transparent)]
 #[derive(Clone, Copy, Eq, PartialEq, Hash)]
 pub struct ReleaseGroupId {
diff --git a/crates/ruff_formatter/src/lib.rs b/crates/ruff_formatter/src/lib.rs
index 7ca7c5c7df..729d48849a 100644
--- a/crates/ruff_formatter/src/lib.rs
+++ b/crates/ruff_formatter/src/lib.rs
@@ -1,15 +1,15 @@
 //! Infrastructure for code formatting
 //!
-//! This module defines [FormatElement], an IR to format code documents and provides a mean to print
+//! This module defines [`FormatElement`], an IR to format code documents and provides a mean to print
 //! such a document to a string. Objects that know how to format themselves implement the [Format] trait.
 //!
 //! ## Formatting Traits
 //!
 //! * [Format]: Implemented by objects that can be formatted.
-//! * [FormatRule]: Rule that knows how to format an object of another type. Necessary in the situation where
+//! * [`FormatRule`]: Rule that knows how to format an object of another type. Necessary in the situation where
 //!  it's necessary to implement [Format] on an object from another crate. This module defines the
-//!  [FormatRefWithRule] and [FormatOwnedWithRule] structs to pass an item with its corresponding rule.
-//! * [FormatWithRule] implemented by objects that know how to format another type. Useful for implementing
+//!  [`FormatRefWithRule`] and [`FormatOwnedWithRule`] structs to pass an item with its corresponding rule.
+//! * [`FormatWithRule`] implemented by objects that know how to format another type. Useful for implementing
 //!  some reusable formatting logic inside of this module if the type itself doesn't implement [Format]
 //!
 //! ## Formatting Macros
@@ -19,9 +19,6 @@
 //! * [`format_args!`]: Concatenates a sequence of Format objects.
 //! * [`write!`]: Writes a sequence of formatable objects into an output buffer.
 
-#![allow(clippy::pedantic, unsafe_code)]
-#![deny(rustdoc::broken_intra_doc_links)]
-
 mod arguments;
 mod buffer;
 mod builders;
@@ -73,12 +70,12 @@ pub enum IndentStyle {
 impl IndentStyle {
     pub const DEFAULT_SPACES: u8 = 2;
 
-    /// Returns `true` if this is an [IndentStyle::Tab].
+    /// Returns `true` if this is an [`IndentStyle::Tab`].
     pub const fn is_tab(&self) -> bool {
         matches!(self, IndentStyle::Tab)
     }
 
-    /// Returns `true` if this is an [IndentStyle::Space].
+    /// Returns `true` if this is an [`IndentStyle::Space`].
     pub const fn is_space(&self) -> bool {
         matches!(self, IndentStyle::Space(_))
     }
@@ -121,10 +118,10 @@ impl std::fmt::Display for IndentStyle {
 pub struct LineWidth(u16);
 
 impl LineWidth {
-    /// Maximum allowed value for a valid [LineWidth]
+    /// Maximum allowed value for a valid [`LineWidth`]
     pub const MAX: u16 = 320;
 
-    /// Return the numeric value for this [LineWidth]
+    /// Return the numeric value for this [`LineWidth`]
     pub fn value(&self) -> u16 {
         self.0
     }
@@ -136,7 +133,7 @@ impl Default for LineWidth {
     }
 }
 
-/// Error type returned when parsing a [LineWidth] from a string fails
+/// Error type returned when parsing a [`LineWidth`] from a string fails
 pub enum ParseLineWidthError {
     /// The string could not be parsed as a valid [u16]
     ParseError(ParseIntError),
@@ -169,7 +166,7 @@ impl FromStr for LineWidth {
     }
 }
 
-/// Error type returned when converting a u16 to a [LineWidth] fails
+/// Error type returned when converting a u16 to a [`LineWidth`] fails
 #[derive(Clone, Copy, Debug)]
 pub struct LineWidthFromIntError(pub u16);
 
@@ -238,6 +235,7 @@ impl SimpleFormatContext {
         }
     }
 
+    #[must_use]
     pub fn with_source_code(mut self, code: &str) -> Self {
         self.source_code = String::from(code);
         self
@@ -390,20 +388,20 @@ impl Printed {
         self.range
     }
 
-    /// Returns a list of [SourceMarker] mapping byte positions
+    /// Returns a list of [`SourceMarker`] mapping byte positions
     /// in the output string to the input source code.
     /// It's not guaranteed that the markers are sorted by source position.
     pub fn sourcemap(&self) -> &[SourceMarker] {
         &self.sourcemap
     }
 
-    /// Returns a list of [SourceMarker] mapping byte positions
+    /// Returns a list of [`SourceMarker`] mapping byte positions
     /// in the output string to the input source code, consuming the result
     pub fn into_sourcemap(self) -> Vec {
         self.sourcemap
     }
 
-    /// Takes the list of [SourceMarker] mapping byte positions in the output string
+    /// Takes the list of [`SourceMarker`] mapping byte positions in the output string
     /// to the input source code.
     pub fn take_sourcemap(&mut self) -> Vec {
         std::mem::take(&mut self.sourcemap)
@@ -441,7 +439,7 @@ impl Printed {
 pub type FormatResult = Result;
 
 /// Formatting trait for types that can create a formatted representation. The `ruff_formatter` equivalent
-/// to [std::fmt::Display].
+/// to [`std::fmt::Display`].
 ///
 /// ## Example
 /// Implementing `Format` for a custom struct
@@ -480,7 +478,7 @@ impl Format for &T
 where
     T: ?Sized + Format,
 {
-    #[inline(always)]
+    #[inline]
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
         Format::fmt(&**self, f)
     }
@@ -490,7 +488,7 @@ impl Format for &mut T
 where
     T: ?Sized + Format,
 {
-    #[inline(always)]
+    #[inline]
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
         Format::fmt(&**self, f)
     }
@@ -518,7 +516,7 @@ impl Format for () {
 
 /// Rule that knows how to format an object of type `T`.
 ///
-/// Implementing [Format] on the object itself is preferred over implementing [FormatRule] but
+/// Implementing [Format] on the object itself is preferred over implementing [`FormatRule`] but
 /// this isn't possible inside of a dependent crate for external type.
 ///
 /// For example, the `ruff_js_formatter` crate isn't able to implement [Format] on `JsIfStatement`
@@ -535,6 +533,7 @@ pub trait FormatRuleWithOptions: FormatRule {
     type Options;
 
     /// Returns a new rule that uses the given options to format an object.
+    #[must_use]
     fn with_options(self, options: Self::Options) -> Self;
 }
 
@@ -547,9 +546,9 @@ pub trait FormatRuleWithOptions: FormatRule {
 ///
 /// ## Examples
 ///
-/// This can be useful if you want to format a `SyntaxNode` inside ruff_formatter.. `SyntaxNode` doesn't implement [Format]
+/// This can be useful if you want to format a `SyntaxNode` inside `ruff_formatter`.. `SyntaxNode` doesn't implement [Format]
 /// itself but the language specific crate implements `AsFormat` and `IntoFormat` for it and the returned [Format]
-/// implement [FormatWithRule].
+/// implement [`FormatWithRule`].
 ///
 /// ```ignore
 /// use ruff_formatter::prelude::*;
@@ -597,6 +596,7 @@ impl FormatRefWithRule<'_, T, R, C>
 where
     R: FormatRuleWithOptions,
 {
+    #[must_use]
     pub fn with_options(mut self, options: O) -> Self {
         self.rule = self.rule.with_options(options);
         self
@@ -618,7 +618,7 @@ impl Format for FormatRefWithRule<'_, T, R, C>
 where
     R: FormatRule,
 {
-    #[inline(always)]
+    #[inline]
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
         self.rule.fmt(self.item, f)
     }
@@ -647,6 +647,7 @@ where
         }
     }
 
+    #[must_use]
     pub fn with_item(mut self, item: T) -> Self {
         self.item = item;
         self
@@ -661,7 +662,7 @@ impl Format for FormatOwnedWithRule
 where
     R: FormatRule,
 {
-    #[inline(always)]
+    #[inline]
     fn fmt(&self, f: &mut Formatter) -> FormatResult<()> {
         self.rule.fmt(&self.item, f)
     }
@@ -671,6 +672,7 @@ impl FormatOwnedWithRule
 where
     R: FormatRuleWithOptions,
 {
+    #[must_use]
     pub fn with_options(mut self, options: O) -> Self {
         self.rule = self.rule.with_options(options);
         self
@@ -729,7 +731,7 @@ where
 /// # Ok(())
 /// # }
 /// ```
-#[inline(always)]
+#[inline]
 pub fn write(
     output: &mut dyn Buffer,
     args: Arguments,
@@ -790,9 +792,9 @@ where
 
 /// This structure stores the state that is relevant for the formatting of the whole document.
 ///
-/// This structure is different from [crate::Formatter] in that the formatting infrastructure
-/// creates a new [crate::Formatter] for every [crate::write!] call, whereas this structure stays alive
-/// for the whole process of formatting a root with [crate::format!].
+/// This structure is different from [`crate::Formatter`] in that the formatting infrastructure
+/// creates a new [`crate::Formatter`] for every [`crate::write`!] call, whereas this structure stays alive
+/// for the whole process of formatting a root with [`crate::format`!].
 pub struct FormatState {
     context: Context,
 
@@ -815,7 +817,7 @@ impl FormatState {
     pub fn new(context: Context) -> Self {
         Self {
             context,
-            group_id_builder: Default::default(),
+            group_id_builder: UniqueGroupIdBuilder::default(),
         }
     }
 
@@ -834,7 +836,7 @@ impl FormatState {
     }
 
     /// Creates a new group id that is unique to this document. The passed debug name is used in the
-    /// [std::fmt::Debug] of the document if this is a debug build.
+    /// [`std::fmt::Debug`] of the document if this is a debug build.
     /// The name is unused for production builds and has no meaning on the equality of two group ids.
     pub fn group_id(&self, debug_name: &'static str) -> GroupId {
         self.group_id_builder.group_id(debug_name)
diff --git a/crates/ruff_formatter/src/macros.rs b/crates/ruff_formatter/src/macros.rs
index 4f5bcdf050..44ee89a43b 100644
--- a/crates/ruff_formatter/src/macros.rs
+++ b/crates/ruff_formatter/src/macros.rs
@@ -1,9 +1,9 @@
 /// Constructs the parameters for other formatting macros.
 ///
-/// This macro functions by taking a list of objects implementing [crate::Format]. It canonicalize the
+/// This macro functions by taking a list of objects implementing [`crate::Format`]. It canonicalize the
 /// arguments into a single type.
 ///
-/// This macro produces a value of type [crate::Arguments]. This value can be passed to
+/// This macro produces a value of type [`crate::Arguments`]. This value can be passed to
 /// the macros within [crate]. All other formatting macros ([`format!`](crate::format!),
 /// [`write!`](crate::write!)) are proxied through this one. This macro avoids heap allocations.
 ///
@@ -41,7 +41,7 @@ macro_rules! format_args {
 ///
 /// This macro accepts a 'buffer' and a list of format arguments. Each argument will be formatted
 /// and the result will be passed to the buffer. The writer may be any value with a `write_fmt` method;
-/// generally this comes from an implementation of the [crate::Buffer] trait.
+/// generally this comes from an implementation of the [`crate::Buffer`] trait.
 ///
 /// # Examples
 ///
@@ -116,8 +116,8 @@ macro_rules! dbg_write {
 
 /// Creates the Format IR for a value.
 ///
-/// The first argument `format!` receives is the [crate::FormatContext] that specify how elements must be formatted.
-/// Additional parameters passed get formatted by using their [crate::Format] implementation.
+/// The first argument `format!` receives is the [`crate::FormatContext`] that specify how elements must be formatted.
+/// Additional parameters passed get formatted by using their [`crate::Format`] implementation.
 ///
 ///
 /// ## Examples
@@ -314,13 +314,13 @@ macro_rules! format {
 /// ## Behavior
 /// This IR is similar to Prettier's `conditionalGroup`. The printer measures each variant, except the [`MostExpanded`], in [`Flat`] mode
 /// to find the first variant that fits and prints this variant in [`Flat`] mode. If no variant fits, then
-/// the printer falls back to printing the [`MostExpanded`] variant in `[`Expanded`] mode.
+/// the printer falls back to printing the [`MostExpanded`] variant in [`Expanded`] mode.
 ///
 /// The definition of *fits* differs to groups in that the printer only tests if it is possible to print
 /// the content up to the first non-soft line break without exceeding the configured print width.
 /// This definition differs from groups as that non-soft line breaks make group expand.
 ///
-/// [crate::BestFitting] acts as a "break" boundary, meaning that it is considered to fit
+/// [`crate::BestFitting`] acts as a "break" boundary, meaning that it is considered to fit
 ///
 ///
 /// [`Flat`]: crate::format_element::PrintMode::Flat
@@ -329,6 +329,7 @@ macro_rules! format {
 #[macro_export]
 macro_rules! best_fitting {
     ($least_expanded:expr, $($tail:expr),+ $(,)?) => {{
+        #[allow(unsafe_code)]
         unsafe {
             $crate::BestFitting::from_arguments_unchecked($crate::format_args!($least_expanded, $($tail),+))
         }
diff --git a/crates/ruff_formatter/src/printer/call_stack.rs b/crates/ruff_formatter/src/printer/call_stack.rs
index a262f210a7..858510ae7f 100644
--- a/crates/ruff_formatter/src/printer/call_stack.rs
+++ b/crates/ruff_formatter/src/printer/call_stack.rs
@@ -20,10 +20,10 @@ pub(super) struct StackFrame {
 
 /// Stores arguments passed to `print_element` call, holding the state specific to printing an element.
 /// E.g. the `indent` depends on the token the Printer's currently processing. That's why
-/// it must be stored outside of the [PrinterState] that stores the state common to all elements.
+/// it must be stored outside of the [`PrinterState`] that stores the state common to all elements.
 ///
 /// The state is passed by value, which is why it's important that it isn't storing any heavy
-/// data structures. Such structures should be stored on the [PrinterState] instead.
+/// data structures. Such structures should be stored on the [`PrinterState`] instead.
 #[derive(Debug, Copy, Clone, Eq, PartialEq)]
 pub(super) struct PrintElementArgs {
     indent: Indention,
@@ -39,15 +39,15 @@ impl PrintElementArgs {
         }
     }
 
-    pub(super) fn mode(&self) -> PrintMode {
+    pub(super) fn mode(self) -> PrintMode {
         self.mode
     }
 
-    pub(super) fn measure_mode(&self) -> MeasureMode {
+    pub(super) fn measure_mode(self) -> MeasureMode {
         self.measure_mode
     }
 
-    pub(super) fn indention(&self) -> Indention {
+    pub(super) fn indention(self) -> Indention {
         self.indent
     }
 
@@ -92,9 +92,9 @@ impl Default for PrintElementArgs {
     }
 }
 
-/// Call stack that stores the [PrintElementCallArgs].
+/// Call stack that stores the [`PrintElementCallArgs`].
 ///
-/// New [PrintElementCallArgs] are pushed onto the stack for every [`start`](Tag::is_start) [`Tag`](FormatElement::Tag)
+/// New [`PrintElementCallArgs`] are pushed onto the stack for every [`start`](Tag::is_start) [`Tag`](FormatElement::Tag)
 /// and popped when reaching the corresponding [`end`](Tag::is_end) [`Tag`](FormatElement::Tag).
 pub(super) trait CallStack {
     type Stack: Stack + Debug;
@@ -158,7 +158,7 @@ pub(super) trait CallStack {
         }
     }
 
-    /// Returns the [PrintElementArgs] for the current stack frame.
+    /// Returns the [`PrintElementArgs`] for the current stack frame.
     fn top(&self) -> PrintElementArgs {
         self.stack()
             .top()
@@ -166,7 +166,7 @@ pub(super) trait CallStack {
             .args
     }
 
-    /// Returns the [TagKind] of the current stack frame or [None] if this is the root stack frame.
+    /// Returns the [`TagKind`] of the current stack frame or [None] if this is the root stack frame.
     fn top_kind(&self) -> Option {
         match self
             .stack()
@@ -179,16 +179,16 @@ pub(super) trait CallStack {
         }
     }
 
-    /// Creates a new stack frame for a [FormatElement::Tag] of `kind` with `args` as the call arguments.
+    /// Creates a new stack frame for a [`FormatElement::Tag`] of `kind` with `args` as the call arguments.
     fn push(&mut self, kind: TagKind, args: PrintElementArgs) {
         self.stack_mut().push(StackFrame {
             kind: StackFrameKind::Tag(kind),
             args,
-        })
+        });
     }
 }
 
-/// Call stack used for printing the [FormatElement]s
+/// Call stack used for printing the [`FormatElement`]s
 #[derive(Debug, Clone)]
 pub(super) struct PrintCallStack(Vec);
 
@@ -215,7 +215,7 @@ impl CallStack for PrintCallStack {
 
 /// Call stack used for measuring if some content fits on the line.
 ///
-/// The stack is a view on top of the [PrintCallStack] because the stack frames are still necessary for printing.
+/// The stack is a view on top of the [`PrintCallStack`] because the stack frames are still necessary for printing.
 #[must_use]
 pub(super) struct FitsCallStack<'print> {
     stack: StackedStack<'print, StackFrame>,
diff --git a/crates/ruff_formatter/src/printer/mod.rs b/crates/ruff_formatter/src/printer/mod.rs
index b308f0b67d..b518ce76fe 100644
--- a/crates/ruff_formatter/src/printer/mod.rs
+++ b/crates/ruff_formatter/src/printer/mod.rs
@@ -84,6 +84,7 @@ impl<'a> Printer<'a> {
         queue: &mut PrintQueue<'a>,
         element: &'a FormatElement,
     ) -> PrintResult<()> {
+        #[allow(clippy::enum_glob_use)]
         use Tag::*;
 
         let args = stack.top();
@@ -94,7 +95,7 @@ impl<'a> Printer<'a> {
             FormatElement::DynamicText { text } => self.print_text(text, None),
             FormatElement::SourceCodeSlice { slice, .. } => {
                 let text = slice.text(self.source_code);
-                self.print_text(text, Some(slice.range()))
+                self.print_text(text, Some(slice.range()));
             }
             FormatElement::Line(line_mode) => {
                 if args.mode().is_flat()
@@ -221,6 +222,8 @@ impl<'a> Printer<'a> {
 
             FormatElement::Tag(StartVerbatim(kind)) => {
                 if let VerbatimKind::Verbatim { length } = kind {
+                    // SAFETY: Ruff only supports formatting files <= 4GB
+                    #[allow(clippy::cast_possible_truncation)]
                     self.state.verbatim_markers.push(TextRange::at(
                         TextSize::from(self.state.buffer.len() as u32),
                         *length,
@@ -291,7 +294,7 @@ impl<'a> Printer<'a> {
         kind: TagKind,
         mode: GroupMode,
         args: PrintElementArgs,
-        queue: &mut PrintQueue<'a>,
+        queue: &PrintQueue<'a>,
         stack: &mut PrintCallStack,
     ) -> PrintResult {
         let group_mode = match mode {
@@ -384,7 +387,7 @@ impl<'a> Printer<'a> {
 
         if let Some(last) = self.state.source_markers.last() {
             if last != &marker {
-                self.state.source_markers.push(marker)
+                self.state.source_markers.push(marker);
             }
         } else {
             self.state.source_markers.push(marker);
@@ -411,10 +414,11 @@ impl<'a> Printer<'a> {
                         queue.push(suffix);
                     }
                     LineSuffixEntry::Args(args) => {
-                        stack.push(TagKind::LineSuffix, args);
                         const LINE_SUFFIX_END: &FormatElement =
                             &FormatElement::Tag(Tag::EndLineSuffix);
 
+                        stack.push(TagKind::LineSuffix, args);
+
                         queue.push(LINE_SUFFIX_END);
                     }
                 }
@@ -437,7 +441,7 @@ impl<'a> Printer<'a> {
             self.state.measured_group_fits = true;
             let normal_variants = &variants[..variants.len() - 1];
 
-            for variant in normal_variants.iter() {
+            for variant in normal_variants {
                 // Test if this variant fits and if so, use it. Otherwise try the next
                 // variant.
 
@@ -614,7 +618,7 @@ impl<'a> Printer<'a> {
         }
     }
 
-    /// Semantic alias for [Self::print_entry] for fill items.
+    /// Semantic alias for [`Self::print_entry`] for fill items.
     fn print_fill_item(
         &mut self,
         queue: &mut PrintQueue<'a>,
@@ -624,7 +628,7 @@ impl<'a> Printer<'a> {
         self.print_entry(queue, stack, args)
     }
 
-    /// Semantic alias for [Self::print_entry] for fill separators.
+    /// Semantic alias for [`Self::print_entry`] for fill separators.
     fn print_fill_separator(
         &mut self,
         queue: &mut PrintQueue<'a>,
@@ -636,7 +640,7 @@ impl<'a> Printer<'a> {
 
     /// Fully print an element (print the element itself and all its descendants)
     ///
-    /// Unlike [print_element], this function ensures the entire element has
+    /// Unlike [`print_element`], this function ensures the entire element has
     /// been printed when it returns and the queue is back to its original state
     fn print_entry(
         &mut self,
@@ -703,9 +707,11 @@ impl<'a> Printer<'a> {
         } else {
             self.state.buffer.push(char);
 
+            #[allow(clippy::cast_possible_truncation)]
             let char_width = if char == '\t' {
-                self.options.tab_width as u32
+                u32::from(self.options.tab_width)
             } else {
+                // SAFETY: A u32 is sufficient to represent the width of a file <= 4GB
                 char.width().unwrap_or(0) as u32
             };
 
@@ -791,7 +797,7 @@ enum Indention {
 }
 
 impl Indention {
-    const fn is_empty(&self) -> bool {
+    const fn is_empty(self) -> bool {
         matches!(self, Indention::Level(0))
     }
 
@@ -801,27 +807,27 @@ impl Indention {
     }
 
     /// Returns the indention level
-    fn level(&self) -> u16 {
+    fn level(self) -> u16 {
         match self {
-            Indention::Level(count) => *count,
-            Indention::Align { level: indent, .. } => *indent,
+            Indention::Level(count) => count,
+            Indention::Align { level: indent, .. } => indent,
         }
     }
 
     /// Returns the number of trailing align spaces or 0 if none
-    fn align(&self) -> u8 {
+    fn align(self) -> u8 {
         match self {
             Indention::Level(_) => 0,
-            Indention::Align { align, .. } => (*align).into(),
+            Indention::Align { align, .. } => align.into(),
         }
     }
 
     /// Increments the level by one.
     ///
-    /// The behaviour depends on the [`indent_style`][IndentStyle] if this is an [Indent::Align]:
+    /// The behaviour depends on the [`indent_style`][IndentStyle] if this is an [`Indent::Align`]:
     /// - **Tabs**: `align` is converted into an indent. This results in `level` increasing by two: once for the align, once for the level increment
     /// - **Spaces**: Increments the `level` by one and keeps the `align` unchanged.
-    /// Keeps any  the current value is [Indent::Align] and increments the level by one.
+    /// Keeps any  the current value is [`Indent::Align`] and increments the level by one.
     fn increment_level(self, indent_style: IndentStyle) -> Self {
         match self {
             Indention::Level(count) => Indention::Level(count + 1),
@@ -838,8 +844,8 @@ impl Indention {
     }
 
     /// Decrements the indent by one by:
-    /// - Reducing the level by one if this is [Indent::Level]
-    /// - Removing the `align` if this is [Indent::Align]
+    /// - Reducing the level by one if this is [`Indent::Level`]
+    /// - Removing the `align` if this is [`Indent::Align`]
     ///
     /// No-op if the level is already zero.
     fn decrement(self) -> Self {
@@ -851,7 +857,7 @@ impl Indention {
 
     /// Adds an `align` of `count` spaces to the current indention.
     ///
-    /// It increments the `level` value if the current value is [Indent::IndentAlign].
+    /// It increments the `level` value if the current value is [`Indent::IndentAlign`].
     fn set_align(self, count: NonZeroU8) -> Self {
         match self {
             Indention::Level(indent_count) => Indention::Align {
@@ -955,9 +961,9 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
         Ok(true)
     }
 
-    /// Tests if the content of a `Fill` item fits in [PrintMode::Flat].
+    /// Tests if the content of a `Fill` item fits in [`PrintMode::Flat`].
     ///
-    /// Returns `Err` if the top element of the queue is not a [Tag::StartEntry]
+    /// Returns `Err` if the top element of the queue is not a [`Tag::StartEntry`]
     /// or if the document has any mismatching start/end tags.
     fn fill_item_fits(&mut self) -> PrintResult {
         self.fill_entry_fits(PrintMode::Flat)
@@ -965,17 +971,17 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
 
     /// Tests if the content of a `Fill` separator fits with `mode`.
     ///
-    /// Returns `Err` if the top element of the queue is not a [Tag::StartEntry]
+    /// Returns `Err` if the top element of the queue is not a [`Tag::StartEntry`]
     /// or if the document has any mismatching start/end tags.
     fn fill_separator_fits(&mut self, mode: PrintMode) -> PrintResult {
         self.fill_entry_fits(mode)
     }
 
-    /// Tests if the elements between the [Tag::StartEntry] and [Tag::EndEntry]
+    /// Tests if the elements between the [`Tag::StartEntry`] and [`Tag::EndEntry`]
     /// of a fill item or separator fits with `mode`.
     ///
-    /// Returns `Err` if the queue isn't positioned at a [Tag::StartEntry] or if
-    /// the matching [Tag::EndEntry] is missing.
+    /// Returns `Err` if the queue isn't positioned at a [`Tag::StartEntry`] or if
+    /// the matching [`Tag::EndEntry`] is missing.
     fn fill_entry_fits(&mut self, mode: PrintMode) -> PrintResult {
         let start_entry = self.queue.top();
 
@@ -997,6 +1003,7 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
 
     /// Tests if the passed element fits on the current line or not.
     fn fits_element(&mut self, element: &'a FormatElement) -> PrintResult {
+        #[allow(clippy::enum_glob_use)]
         use Tag::*;
 
         let args = self.stack.top();
@@ -1093,7 +1100,7 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
             }
 
             FormatElement::Tag(StartGroup(group)) => {
-                return self.fits_group(TagKind::Group, group.mode(), group.id(), args);
+                return Ok(self.fits_group(TagKind::Group, group.mode(), group.id(), args));
             }
 
             FormatElement::Tag(StartConditionalGroup(group)) => {
@@ -1108,10 +1115,14 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
                 };
 
                 if condition.mode == print_mode {
-                    return self.fits_group(TagKind::ConditionalGroup, group.mode(), None, args);
-                } else {
-                    self.stack.push(TagKind::ConditionalGroup, args);
+                    return Ok(self.fits_group(
+                        TagKind::ConditionalGroup,
+                        group.mode(),
+                        None,
+                        args,
+                    ));
                 }
+                self.stack.push(TagKind::ConditionalGroup, args);
             }
 
             FormatElement::Tag(StartConditionalContent(condition)) => {
@@ -1183,14 +1194,14 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
                         TagKind::FitsExpanded,
                         args.with_print_mode(PrintMode::Expanded)
                             .with_measure_mode(MeasureMode::AllLines),
-                    )
+                    );
                 } else {
                     if propagate_expand.get() && args.mode().is_flat() {
                         return Ok(Fits::No);
                     }
 
                     // As usual
-                    self.stack.push(TagKind::FitsExpanded, args)
+                    self.stack.push(TagKind::FitsExpanded, args);
                 }
             }
 
@@ -1227,17 +1238,17 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
         mode: GroupMode,
         id: Option,
         args: PrintElementArgs,
-    ) -> PrintResult {
+    ) -> Fits {
         if self.must_be_flat && !mode.is_flat() {
-            return Ok(Fits::No);
+            return Fits::No;
         }
 
         // Continue printing groups in expanded mode if measuring a `best_fitting` element where
         // a group expands.
-        let print_mode = if !mode.is_flat() {
-            PrintMode::Expanded
-        } else {
+        let print_mode = if mode.is_flat() {
             args.mode()
+        } else {
+            PrintMode::Expanded
         };
 
         self.stack.push(kind, args.with_print_mode(print_mode));
@@ -1246,30 +1257,32 @@ impl<'a, 'print> FitsMeasurer<'a, 'print> {
             self.group_modes_mut().insert_print_mode(id, print_mode);
         }
 
-        Ok(Fits::Maybe)
+        Fits::Maybe
     }
 
     fn fits_text(&mut self, text: &str, args: PrintElementArgs) -> Fits {
         let indent = std::mem::take(&mut self.state.pending_indent);
-        self.state.line_width +=
-            indent.level() as u32 * self.options().indent_width() as u32 + indent.align() as u32;
+        self.state.line_width += u32::from(indent.level())
+            * u32::from(self.options().indent_width())
+            + u32::from(indent.align());
 
         for c in text.chars() {
             let char_width = match c {
-                '\t' => self.options().tab_width as u32,
+                '\t' => u32::from(self.options().tab_width),
                 '\n' => {
                     if self.must_be_flat {
                         return Fits::No;
-                    } else {
-                        match args.measure_mode() {
-                            MeasureMode::FirstLine => return Fits::Yes,
-                            MeasureMode::AllLines => {
-                                self.state.line_width = 0;
-                                continue;
-                            }
+                    }
+                    match args.measure_mode() {
+                        MeasureMode::FirstLine => return Fits::Yes,
+                        MeasureMode::AllLines => {
+                            self.state.line_width = 0;
+                            continue;
                         }
-                    };
+                    }
                 }
+                // SAFETY: A u32 is sufficient to format files <= 4GB
+                #[allow(clippy::cast_possible_truncation)]
                 c => c.width().unwrap_or(0) as u32,
             };
             self.state.line_width += char_width;
@@ -1352,9 +1365,10 @@ enum Fits {
 
 impl From for Fits {
     fn from(value: bool) -> Self {
-        match value {
-            true => Fits::Yes,
-            false => Fits::No,
+        if value {
+            Fits::Yes
+        } else {
+            Fits::No
         }
     }
 }
@@ -1418,7 +1432,7 @@ mod tests {
             ],
         });
 
-        assert_eq!(r#"["a", "b", "c", "d"]"#, result.as_code())
+        assert_eq!(r#"["a", "b", "c", "d"]"#, result.as_code());
     }
 
     #[test]
@@ -1447,7 +1461,7 @@ mod tests {
   b
 a"#,
             formatted.as_code()
-        )
+        );
     }
 
     #[test]
@@ -1489,13 +1503,13 @@ two lines`,
   "b",
 ]"#,
             result.as_code()
-        )
+        );
     }
     #[test]
     fn it_breaks_a_group_if_it_contains_a_hard_line_break() {
         let result = format(&group(&format_args![text("a"), block_indent(&text("b"))]));
 
-        assert_eq!("a\n  b\n", result.as_code())
+        assert_eq!("a\n  b\n", result.as_code());
     }
 
     #[test]
@@ -1559,7 +1573,7 @@ two lines`,
             text("b"),
         ]);
 
-        assert_eq!("a\nb", result.as_code())
+        assert_eq!("a\nb", result.as_code());
     }
 
     #[test]
@@ -1572,7 +1586,7 @@ two lines`,
             text("b"),
         ]);
 
-        assert_eq!("a\n\n\n\nb", result.as_code())
+        assert_eq!("a\n\n\n\nb", result.as_code());
     }
 
     #[test]
@@ -1586,7 +1600,7 @@ two lines`,
             text("b"),
         ]);
 
-        assert_eq!("a\n\n\nb", result.as_code())
+        assert_eq!("a\n\n\nb", result.as_code());
     }
 
     #[test]
@@ -1648,7 +1662,7 @@ two lines`,
         assert_eq!(
             printed.as_code(),
             "1, 2, 3,\n723493294,\n[5],\n[\n\t123456789\n]"
-        )
+        );
     }
 
     #[test]
@@ -1678,7 +1692,7 @@ two lines`,
             &line_suffix(&format_args![space(), text("// trailing")])
         ]);
 
-        assert_eq!(printed.as_code(), "[1, 2, 3]; // trailing")
+        assert_eq!(printed.as_code(), "[1, 2, 3]; // trailing");
     }
 
     #[test]
diff --git a/crates/ruff_formatter/src/printer/printer_options/mod.rs b/crates/ruff_formatter/src/printer/printer_options/mod.rs
index 291d02661f..d68f60ef2e 100644
--- a/crates/ruff_formatter/src/printer/printer_options/mod.rs
+++ b/crates/ruff_formatter/src/printer/printer_options/mod.rs
@@ -1,6 +1,6 @@
 use crate::{FormatOptions, IndentStyle, LineWidth};
 
-/// Options that affect how the [crate::Printer] prints the format tokens
+/// Options that affect how the [`crate::Printer`] prints the format tokens
 #[derive(Clone, Debug, Eq, PartialEq)]
 pub struct PrinterOptions {
     /// Width of a single tab character (does it equal 2, 4, ... spaces?)
@@ -33,7 +33,7 @@ impl Default for PrintWidth {
 
 impl From for PrintWidth {
     fn from(width: LineWidth) -> Self {
-        Self(u16::from(width) as u32)
+        Self(u32::from(u16::from(width)))
     }
 }
 
@@ -61,11 +61,13 @@ where
 }
 
 impl PrinterOptions {
+    #[must_use]
     pub fn with_print_width(mut self, width: PrintWidth) -> Self {
         self.print_width = width;
         self
     }
 
+    #[must_use]
     pub fn with_indent(mut self, style: IndentStyle) -> Self {
         self.indent_style = style;
 
@@ -114,7 +116,7 @@ impl Default for PrinterOptions {
         PrinterOptions {
             tab_width: 2,
             print_width: PrintWidth::default(),
-            indent_style: Default::default(),
+            indent_style: IndentStyle::default(),
             line_ending: LineEnding::LineFeed,
         }
     }
diff --git a/crates/ruff_formatter/src/printer/queue.rs b/crates/ruff_formatter/src/printer/queue.rs
index 6ef645b339..93914d2b03 100644
--- a/crates/ruff_formatter/src/printer/queue.rs
+++ b/crates/ruff_formatter/src/printer/queue.rs
@@ -7,7 +7,7 @@ use std::fmt::Debug;
 use std::iter::FusedIterator;
 use std::marker::PhantomData;
 
-/// Queue of [FormatElement]s.
+/// Queue of [`FormatElement`]s.
 pub(super) trait Queue<'a> {
     type Stack: Stack<&'a [FormatElement]>;
 
@@ -40,19 +40,19 @@ pub(super) trait Queue<'a> {
         }
     }
 
-    /// Returns the next element, not traversing into [FormatElement::Interned].
+    /// Returns the next element, not traversing into [`FormatElement::Interned`].
     fn top_with_interned(&self) -> Option<&'a FormatElement> {
         self.stack()
             .top()
             .map(|top_slice| &top_slice[self.next_index()])
     }
 
-    /// Returns the next element, recursively resolving the first element of [FormatElement::Interned].
+    /// Returns the next element, recursively resolving the first element of [`FormatElement::Interned`].
     fn top(&self) -> Option<&'a FormatElement> {
         let mut top = self.top_with_interned();
 
         while let Some(FormatElement::Interned(interned)) = top {
-            top = interned.first()
+            top = interned.first();
         }
 
         top
@@ -60,7 +60,7 @@ pub(super) trait Queue<'a> {
 
     /// Queues a single element to process before the other elements in this queue.
     fn push(&mut self, element: &'a FormatElement) {
-        self.extend_back(std::slice::from_ref(element))
+        self.extend_back(std::slice::from_ref(element));
     }
 
     /// Queues a slice of elements to process before the other elements in this queue.
@@ -73,7 +73,7 @@ pub(super) trait Queue<'a> {
                 let next_index = self.next_index();
                 let stack = self.stack_mut();
                 if let Some(top) = stack.pop() {
-                    stack.push(&top[next_index..])
+                    stack.push(&top[next_index..]);
                 }
 
                 stack.push(slice);
@@ -150,14 +150,14 @@ impl<'a> Queue<'a> for PrintQueue<'a> {
     }
 
     fn set_next_index(&mut self, index: usize) {
-        self.next_index = index
+        self.next_index = index;
     }
 }
 
 /// Queue for measuring if an element fits on the line.
 ///
-/// The queue is a view on top of the [PrintQueue] because no elements should be removed
-/// from the [PrintQueue] while measuring.
+/// The queue is a view on top of the [`PrintQueue`] because no elements should be removed
+/// from the [`PrintQueue`] while measuring.
 #[must_use]
 #[derive(Debug)]
 pub(super) struct FitsQueue<'a, 'print> {
@@ -203,9 +203,9 @@ impl<'a, 'print> Queue<'a> for FitsQueue<'a, 'print> {
     }
 }
 
-/// Iterator that calls [Queue::pop] until it reaches the end of the document.
+/// Iterator that calls [`Queue::pop`] until it reaches the end of the document.
 ///
-/// The iterator traverses into the content of any [FormatElement::Interned].
+/// The iterator traverses into the content of any [`FormatElement::Interned`].
 pub(super) struct QueueIterator<'a, 'q, Q: Queue<'a>> {
     queue: &'q mut Q,
     lifetime: PhantomData<&'a ()>,
@@ -252,32 +252,31 @@ where
     type Item = &'a FormatElement;
 
     fn next(&mut self) -> Option {
-        match self.depth {
-            0 => None,
-            _ => {
-                let mut top = self.queue.pop();
+        if self.depth == 0 {
+            None
+        } else {
+            let mut top = self.queue.pop();
 
-                while let Some(FormatElement::Interned(interned)) = top {
-                    self.queue.extend_back(interned);
-                    top = self.queue.pop();
-                }
+            while let Some(FormatElement::Interned(interned)) = top {
+                self.queue.extend_back(interned);
+                top = self.queue.pop();
+            }
 
-                match top.expect("Missing end signal.") {
-                    element @ FormatElement::Tag(tag) if tag.kind() == self.kind => {
-                        if tag.is_start() {
-                            self.depth += 1;
-                        } else {
-                            self.depth -= 1;
+            match top.expect("Missing end signal.") {
+                element @ FormatElement::Tag(tag) if tag.kind() == self.kind => {
+                    if tag.is_start() {
+                        self.depth += 1;
+                    } else {
+                        self.depth -= 1;
 
-                            if self.depth == 0 {
-                                return None;
-                            }
+                        if self.depth == 0 {
+                            return None;
                         }
-
-                        Some(element)
                     }
-                    element => Some(element),
+
+                    Some(element)
                 }
+                element => Some(element),
             }
         }
     }
@@ -287,7 +286,7 @@ impl<'a, Q> FusedIterator for QueueContentIterator<'a, '_, Q> where Q: Queue<'a>
 
 /// A predicate determining when to end measuring if some content fits on the line.
 ///
-/// Called for every [`element`](FormatElement) in the [FitsQueue] when measuring if a content
+/// Called for every [`element`](FormatElement) in the [`FitsQueue`] when measuring if a content
 /// fits on the line. The measuring of the content ends after the first element [`element`](FormatElement) for which this
 /// predicate returns `true` (similar to a take while iterator except that it takes while the predicate returns `false`).
 pub(super) trait FitsEndPredicate {
@@ -303,7 +302,7 @@ impl FitsEndPredicate for AllPredicate {
     }
 }
 
-/// Filter that takes all elements between two matching [Tag::StartEntry] and [Tag::EndEntry] tags.
+/// Filter that takes all elements between two matching [`Tag::StartEntry`] and [`Tag::EndEntry`] tags.
 #[derive(Debug)]
 pub(super) enum SingleEntryPredicate {
     Entry { depth: usize },
diff --git a/crates/ruff_formatter/src/printer/stack.rs b/crates/ruff_formatter/src/printer/stack.rs
index 1bc8da8047..4a1c4c92a2 100644
--- a/crates/ruff_formatter/src/printer/stack.rs
+++ b/crates/ruff_formatter/src/printer/stack.rs
@@ -19,7 +19,7 @@ impl Stack for Vec {
     }
 
     fn push(&mut self, value: T) {
-        self.push(value)
+        self.push(value);
     }
 
     fn top(&self) -> Option<&T> {
diff --git a/crates/ruff_python_ast/src/visitor.rs b/crates/ruff_python_ast/src/visitor.rs
index a4a517026b..ffe005e50c 100644
--- a/crates/ruff_python_ast/src/visitor.rs
+++ b/crates/ruff_python_ast/src/visitor.rs
@@ -715,23 +715,19 @@ pub fn walk_pattern<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, pattern: &'a P
 }
 
 #[allow(unused_variables)]
-pub fn walk_expr_context<'a, V: Visitor<'a> + ?Sized>(
-    visitor: &mut V,
-    expr_context: &'a ExprContext,
-) {
-}
+pub fn walk_expr_context<'a, V: Visitor<'a> + ?Sized>(visitor: &V, expr_context: &'a ExprContext) {}
 
 #[allow(unused_variables)]
-pub fn walk_bool_op<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, bool_op: &'a BoolOp) {}
+pub fn walk_bool_op<'a, V: Visitor<'a> + ?Sized>(visitor: &V, bool_op: &'a BoolOp) {}
 
 #[allow(unused_variables)]
-pub fn walk_operator<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, operator: &'a Operator) {}
+pub fn walk_operator<'a, V: Visitor<'a> + ?Sized>(visitor: &V, operator: &'a Operator) {}
 
 #[allow(unused_variables)]
-pub fn walk_unary_op<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, unary_op: &'a UnaryOp) {}
+pub fn walk_unary_op<'a, V: Visitor<'a> + ?Sized>(visitor: &V, unary_op: &'a UnaryOp) {}
 
 #[allow(unused_variables)]
-pub fn walk_cmp_op<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, cmp_op: &'a CmpOp) {}
+pub fn walk_cmp_op<'a, V: Visitor<'a> + ?Sized>(visitor: &V, cmp_op: &'a CmpOp) {}
 
 #[allow(unused_variables)]
-pub fn walk_alias<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, alias: &'a Alias) {}
+pub fn walk_alias<'a, V: Visitor<'a> + ?Sized>(visitor: &V, alias: &'a Alias) {}
diff --git a/crates/ruff_python_literal/src/escape.rs b/crates/ruff_python_literal/src/escape.rs
index c291e13034..01de325f10 100644
--- a/crates/ruff_python_literal/src/escape.rs
+++ b/crates/ruff_python_literal/src/escape.rs
@@ -341,7 +341,7 @@ impl AsciiEscape<'_> {
         let mut single_count = 0;
         let mut double_count = 0;
 
-        for ch in source.iter() {
+        for ch in source {
             let incr = match ch {
                 b'\'' => {
                     single_count += 1;
@@ -425,7 +425,7 @@ impl<'a> Escape for AsciiEscape<'a> {
 
     #[cold]
     fn write_body_slow(&self, formatter: &mut impl std::fmt::Write) -> std::fmt::Result {
-        for ch in self.source.iter() {
+        for ch in self.source {
             Self::write_char(*ch, self.layout().quote, formatter)?;
         }
         Ok(())
diff --git a/crates/ruff_python_parser/src/parser.rs b/crates/ruff_python_parser/src/parser.rs
index f87093ccaf..ff62cb26c4 100644
--- a/crates/ruff_python_parser/src/parser.rs
+++ b/crates/ruff_python_parser/src/parser.rs
@@ -775,7 +775,7 @@ type X[T] \
 
     #[test]
     fn test_type_as_identifier() {
-        let source = r#"\
+        let source = r"\
 type *a + b, c   # ((type * a) + b), c
 type *(a + b), c   # (type * (a + b)), c
 type (*a + b, c)   # type ((*(a + b)), c)
@@ -806,7 +806,7 @@ type (
 type = 1
 type = x = 1
 x = type = 1
-"#;
+";
         insta::assert_debug_snapshot!(parse_suite(source, "").unwrap());
     }
 
@@ -863,7 +863,7 @@ y = 100(no)
 
     #[test]
     fn test_match_as_identifier() {
-        let source = r#"\
+        let source = r"\
 match *a + b, c   # ((match * a) + b), c
 match *(a + b), c   # (match * (a + b)), c
 match (*a + b, c)   # match ((*(a + b)), c)
@@ -885,7 +885,7 @@ match match:
         pass
 match = lambda query: query == event
 print(match(12))
-"#;
+";
         insta::assert_debug_snapshot!(parse_suite(source, "").unwrap());
     }
 
@@ -1124,7 +1124,7 @@ class Abcd:
     #[test]
     fn test_ipython_escape_commands() {
         let parse_ast = parse(
-            r#"
+            r"
 # Normal Python code
 (
     a
@@ -1189,7 +1189,7 @@ foo[0]??
 foo[0][1]?
 foo.bar[0].baz[1]??
 foo.bar[0].baz[2].egg??
-"#
+"
             .trim(),
             Mode::Jupyter,
             "",
diff --git a/crates/ruff_python_parser/src/string.rs b/crates/ruff_python_parser/src/string.rs
index 4c99e64995..63b884e99c 100644
--- a/crates/ruff_python_parser/src/string.rs
+++ b/crates/ruff_python_parser/src/string.rs
@@ -387,7 +387,7 @@ impl<'a> StringParser<'a> {
                 '{' => {
                     if !constant_piece.is_empty() {
                         spec_constructor.push(Expr::from(ast::ExprConstant {
-                            value: constant_piece.drain(..).collect::().into(),
+                            value: std::mem::take(&mut constant_piece).into(),
                             kind: None,
                             range: self.range(start_location),
                         }));
@@ -408,7 +408,7 @@ impl<'a> StringParser<'a> {
         }
         if !constant_piece.is_empty() {
             spec_constructor.push(Expr::from(ast::ExprConstant {
-                value: constant_piece.drain(..).collect::().into(),
+                value: std::mem::take(&mut constant_piece).into(),
                 kind: None,
                 range: self.range(start_location),
             }));
@@ -446,7 +446,7 @@ impl<'a> StringParser<'a> {
                     }
                     if !content.is_empty() {
                         values.push(Expr::from(ast::ExprConstant {
-                            value: content.drain(..).collect::().into(),
+                            value: std::mem::take(&mut content).into(),
                             kind: None,
                             range: self.range(start_location),
                         }));
@@ -1003,7 +1003,7 @@ mod tests {
     #[test]
     fn test_escape_char_in_byte_literal() {
         // backslash does not escape
-        let source = r##"b"omkmok\Xaa""##; // spell-checker:ignore omkmok
+        let source = r#"b"omkmok\Xaa""#; // spell-checker:ignore omkmok
         let parse_ast = parse_suite(source, "").unwrap();
         insta::assert_debug_snapshot!(parse_ast);
     }
@@ -1024,7 +1024,7 @@ mod tests {
 
     #[test]
     fn test_escape_octet() {
-        let source = r##"b'\43a\4\1234'"##;
+        let source = r"b'\43a\4\1234'";
         let parse_ast = parse_suite(source, "").unwrap();
         insta::assert_debug_snapshot!(parse_ast);
     }
diff --git a/crates/ruff_python_trivia/src/tokenizer.rs b/crates/ruff_python_trivia/src/tokenizer.rs
index e36d0772b9..e553ab97b2 100644
--- a/crates/ruff_python_trivia/src/tokenizer.rs
+++ b/crates/ruff_python_trivia/src/tokenizer.rs
@@ -877,8 +877,8 @@ mod tests {
     #[test]
     fn single_quoted_multiline_string_containing_comment() {
         let test_case = tokenize(
-            r#"'This string contains a hash looking like a comment\
-# This is not a comment'"#,
+            r"'This string contains a hash looking like a comment\
+# This is not a comment'",
         );
 
         assert_debug_snapshot!(test_case.tokenize_reverse());
@@ -928,14 +928,14 @@ mod tests {
 
     #[test]
     fn string_with_escaped_quote() {
-        let test_case = tokenize(r#"'a string \' # containing a hash ' # finally a comment"#);
+        let test_case = tokenize(r"'a string \' # containing a hash ' # finally a comment");
 
         assert_debug_snapshot!(test_case.tokenize_reverse());
     }
 
     #[test]
     fn string_with_double_escaped_backslash() {
-        let test_case = tokenize(r#"'a string \\' # a comment '"#);
+        let test_case = tokenize(r"'a string \\' # a comment '");
 
         assert_debug_snapshot!(test_case.tokenize_reverse());
     }

From 910dbbd9b605eb98a27b06611544fa2de11a1256 Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Mon, 14 Aug 2023 14:15:36 +0200
Subject: [PATCH 104/155] Printer: Reserve buffer upfront (#6550)

---
 crates/ruff_formatter/src/lib.rs         | 16 ++++++++--------
 crates/ruff_formatter/src/printer/mod.rs | 11 ++++++++++-
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/crates/ruff_formatter/src/lib.rs b/crates/ruff_formatter/src/lib.rs
index 729d48849a..e98d998ef3 100644
--- a/crates/ruff_formatter/src/lib.rs
+++ b/crates/ruff_formatter/src/lib.rs
@@ -319,20 +319,20 @@ where
     Context: FormatContext,
 {
     pub fn print(&self) -> PrintResult {
-        let source_code = self.context.source_code();
-        let print_options = self.context.options().as_print_options();
-        let printed = Printer::new(source_code, print_options).print(&self.document)?;
-
-        Ok(printed)
+        let printer = self.create_printer();
+        printer.print(&self.document)
     }
 
     pub fn print_with_indent(&self, indent: u16) -> PrintResult {
+        let printer = self.create_printer();
+        printer.print_with_indent(&self.document, indent)
+    }
+
+    fn create_printer(&self) -> Printer {
         let source_code = self.context.source_code();
         let print_options = self.context.options().as_print_options();
-        let printed =
-            Printer::new(source_code, print_options).print_with_indent(&self.document, indent)?;
 
-        Ok(printed)
+        Printer::new(source_code, print_options)
     }
 }
 
diff --git a/crates/ruff_formatter/src/printer/mod.rs b/crates/ruff_formatter/src/printer/mod.rs
index b518ce76fe..f65eb6fdf3 100644
--- a/crates/ruff_formatter/src/printer/mod.rs
+++ b/crates/ruff_formatter/src/printer/mod.rs
@@ -40,7 +40,7 @@ impl<'a> Printer<'a> {
         Self {
             source_code,
             options,
-            state: PrinterState::default(),
+            state: PrinterState::with_capacity(source_code.as_str().len()),
         }
     }
 
@@ -757,6 +757,15 @@ struct PrinterState<'a> {
     fits_queue: Vec<&'a [FormatElement]>,
 }
 
+impl<'a> PrinterState<'a> {
+    fn with_capacity(capacity: usize) -> Self {
+        Self {
+            buffer: String::with_capacity(capacity),
+            ..Self::default()
+        }
+    }
+}
+
 /// Tracks the mode in which groups with ids are printed. Stores the groups at `group.id()` index.
 /// This is based on the assumption that the group ids for a single document are dense.
 #[derive(Debug, Default)]

From 01eceaf0dccca675173865c665e3bac5ed49e4bb Mon Sep 17 00:00:00 2001
From: konsti 
Date: Mon, 14 Aug 2023 14:28:58 +0200
Subject: [PATCH 105/155] Format docstrings (#6452)

**Summary** Implement docstring formatting

**Test Plan** Matches black's `docstring.py` fixture exactly, added some
new cases for what is hard to debug with black and with what black
doesn't cover.

similarity index:

main:
zulip: 0.99702
django: 0.99784
warehouse: 0.99585
build: 0.75623
transformers: 0.99469
cpython: 0.75989
typeshed: 0.74853

this branch:

zulip: 0.99702
django: 0.99784
warehouse: 0.99585
build: 0.75623
transformers: 0.99464
cpython: 0.75517
typeshed: 0.74853

The regression in transformers is actually an improvement in a file they
don't format with black (they run `black examples tests src utils
setup.py conftest.py`, the difference is in hubconf.py). cpython doesn't
use black.

Closes #6196
---
 .../test/fixtures/ruff/docstring.options.json |  15 +
 .../resources/test/fixtures/ruff/docstring.py | 102 ++
 .../src/expression/string.rs                  | 425 +++++++-
 .../src/statement/suite.rs                    | 130 ++-
 ..._docstring_no_string_normalization.py.snap | 151 +--
 ...cases__comments_non_breaking_space.py.snap | 105 --
 ...patibility@simple_cases__docstring.py.snap | 924 ------------------
 ...ty@simple_cases__docstring_preview.py.snap |   9 +-
 .../tests/snapshots/format@docstring.py.snap  | 448 +++++++++
 9 files changed, 1064 insertions(+), 1245 deletions(-)
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.options.json
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.py
 delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments_non_breaking_space.py.snap
 delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@docstring.py.snap

diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.options.json b/crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.options.json
new file mode 100644
index 0000000000..4a3e3c6dd7
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.options.json
@@ -0,0 +1,15 @@
+[
+  {
+    "indent_style": {
+      "Space": 4
+    }
+  },
+  {
+    "indent_style": {
+      "Space": 2
+    }
+  },
+  {
+    "indent_style": "Tab"
+  }
+]
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.py
new file mode 100644
index 0000000000..60c655f686
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.py
@@ -0,0 +1,102 @@
+def single_line_backslashes1():
+  """ content\     """
+  return
+
+
+def single_line_backslashes2():
+  """ content\\     """
+  return
+
+
+def single_line_backslashes3():
+  """ content\\\     """
+  return
+
+
+def multiline_backslashes1():
+  """This is a docstring with
+  some lines of text\     """
+  return
+
+
+def multiline_backslashes2():
+  """This is a docstring with
+  some lines of text\\     """
+  return
+
+
+def multiline_backslashes3():
+  """This is a docstring with
+  some lines of text\\\     """
+  return
+
+
+def multiple_negatively_indented_docstring_lines():
+    """a
+ b
+  c
+   d
+    e
+    """
+
+
+def overindentend_docstring():
+    """a
+            over-indented
+    """
+
+
+def comment_before_docstring():
+    # don't lose this function comment ...
+    """Does nothing.
+
+    But it has comments
+    """  # ... neither lose this function comment
+
+
+class CommentBeforeDocstring():
+    # don't lose this class comment ...
+    """Empty class.
+
+    But it has comments
+    """  # ... neither lose this class comment
+
+
+class IndentMeSome:
+    def doc_string_without_linebreak_after_colon(self): """ This is somewhat strange
+         a
+      b
+         We format this a is the docstring had started properly indented on the next
+         line if the target indentation. This may we incorrect since source and target
+         indentation can be incorrect, but this is also an edge case.
+         """
+
+
+class IgnoreImplicitlyConcatenatedStrings:
+    """""" ""
+
+
+def docstring_that_ends_with_quote_and_a_line_break1():
+    """
+    he said "the news of my death have been greatly exaggerated"
+    """
+
+
+def docstring_that_ends_with_quote_and_a_line_break2():
+    """he said "the news of my death have been greatly exaggerated"
+    """
+
+
+def docstring_that_ends_with_quote_and_a_line_break3():
+    """he said "the news of my death have been greatly exaggerated"
+
+    """
+
+
+class TabbedIndent:
+	def tabbed_indent(self):
+		"""check for correct tabbed formatting
+		                            ^^^^^^^^^^
+		Normal indented line
+		  	- autor
+		"""
diff --git a/crates/ruff_python_formatter/src/expression/string.rs b/crates/ruff_python_formatter/src/expression/string.rs
index e147eb8cd5..3df7f7650b 100644
--- a/crates/ruff_python_formatter/src/expression/string.rs
+++ b/crates/ruff_python_formatter/src/expression/string.rs
@@ -1,16 +1,16 @@
 use std::borrow::Cow;
 
 use bitflags::bitflags;
+
+use ruff_formatter::{format_args, write, FormatError};
 use ruff_python_ast::node::AnyNodeRef;
+use ruff_python_ast::str::is_implicit_concatenation;
 use ruff_python_ast::{self as ast, ExprConstant, ExprFString, Ranged};
 use ruff_python_parser::lexer::{lex_starts_at, LexicalError, LexicalErrorType};
 use ruff_python_parser::{Mode, Tok};
 use ruff_source_file::Locator;
 use ruff_text_size::{TextLen, TextRange, TextSize};
 
-use ruff_formatter::{format_args, write, FormatError};
-use ruff_python_ast::str::is_implicit_concatenation;
-
 use crate::comments::{leading_comments, trailing_comments};
 use crate::expression::parentheses::{
     in_parentheses_only_group, in_parentheses_only_soft_line_break_or_space,
@@ -78,7 +78,7 @@ pub(super) struct FormatString<'a> {
 pub enum StringLayout {
     #[default]
     Default,
-
+    DocString,
     ImplicitConcatenatedBinaryLeftSide,
 }
 
@@ -109,10 +109,25 @@ impl<'a> Format> for FormatString<'a> {
                 if is_implicit_concatenation(string_content) {
                     in_parentheses_only_group(&FormatStringContinuation::new(self.string)).fmt(f)
                 } else {
-                    FormatStringPart::new(string_range, self.string.quoting(&f.context().locator()))
-                        .fmt(f)
+                    FormatStringPart::new(
+                        string_range,
+                        self.string.quoting(&f.context().locator()),
+                        &f.context().locator(),
+                        f.options().quote_style(),
+                    )
+                    .fmt(f)
                 }
             }
+            StringLayout::DocString => {
+                let string_part = FormatStringPart::new(
+                    self.string.range(),
+                    // f-strings can't be docstrings
+                    Quoting::CanChange,
+                    &f.context().locator(),
+                    f.options().quote_style(),
+                );
+                format_docstring(&string_part, f)
+            }
             StringLayout::ImplicitConcatenatedBinaryLeftSide => {
                 FormatStringContinuation::new(self.string).fmt(f)
             }
@@ -137,6 +152,7 @@ impl Format> for FormatStringContinuation<'_> {
     fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
         let comments = f.context().comments().clone();
         let locator = f.context().locator();
+        let quote_style = f.options().quote_style();
         let mut dangling_comments = comments.dangling_comments(self.string);
 
         let string_range = self.string.range();
@@ -213,7 +229,12 @@ impl Format> for FormatStringContinuation<'_> {
                     joiner.entry(&format_args![
                         line_suffix_boundary(),
                         leading_comments(leading_part_comments),
-                        FormatStringPart::new(token_range, self.string.quoting(&locator)),
+                        FormatStringPart::new(
+                            token_range,
+                            self.string.quoting(&locator),
+                            &locator,
+                            quote_style,
+                        ),
                         trailing_comments(trailing_part_comments)
                     ]);
 
@@ -235,63 +256,67 @@ impl Format> for FormatStringContinuation<'_> {
 }
 
 struct FormatStringPart {
-    part_range: TextRange,
-    quoting: Quoting,
+    prefix: StringPrefix,
+    preferred_quotes: StringQuotes,
+    range: TextRange,
+    is_raw_string: bool,
 }
 
 impl FormatStringPart {
-    const fn new(range: TextRange, quoting: Quoting) -> Self {
+    fn new(range: TextRange, quoting: Quoting, locator: &Locator, quote_style: QuoteStyle) -> Self {
+        let string_content = locator.slice(range);
+
+        let prefix = StringPrefix::parse(string_content);
+        let after_prefix = &string_content[usize::from(prefix.text_len())..];
+
+        let quotes =
+            StringQuotes::parse(after_prefix).expect("Didn't find string quotes after prefix");
+        let relative_raw_content_range = TextRange::new(
+            prefix.text_len() + quotes.text_len(),
+            string_content.text_len() - quotes.text_len(),
+        );
+        let raw_content_range = relative_raw_content_range + range.start();
+
+        let raw_content = &string_content[relative_raw_content_range];
+        let is_raw_string = prefix.is_raw_string();
+        let preferred_quotes = match quoting {
+            Quoting::Preserve => quotes,
+            Quoting::CanChange => {
+                if is_raw_string {
+                    preferred_quotes_raw(raw_content, quotes, quote_style)
+                } else {
+                    preferred_quotes(raw_content, quotes, quote_style)
+                }
+            }
+        };
+
         Self {
-            part_range: range,
-            quoting,
+            prefix,
+            range: raw_content_range,
+            preferred_quotes,
+            is_raw_string,
         }
     }
 }
 
 impl Format> for FormatStringPart {
     fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
-        let string_content = f.context().locator().slice(self.part_range);
-
-        let prefix = StringPrefix::parse(string_content);
-        let after_prefix = &string_content[usize::from(prefix.text_len())..];
-
-        let quotes = StringQuotes::parse(after_prefix).ok_or(FormatError::syntax_error(
-            "Didn't find string quotes after prefix",
-        ))?;
-        let relative_raw_content_range = TextRange::new(
-            prefix.text_len() + quotes.text_len(),
-            string_content.text_len() - quotes.text_len(),
+        let (normalized, contains_newlines) = normalize_string(
+            f.context().locator().slice(self.range),
+            self.preferred_quotes,
+            self.is_raw_string,
         );
-        let raw_content_range = relative_raw_content_range + self.part_range.start();
-
-        let raw_content = &string_content[relative_raw_content_range];
-        let is_raw_string = prefix.is_raw_string();
-        let preferred_quotes = match self.quoting {
-            Quoting::Preserve => quotes,
-            Quoting::CanChange => {
-                if is_raw_string {
-                    preferred_quotes_raw(raw_content, quotes, f.options().quote_style())
-                } else {
-                    preferred_quotes(raw_content, quotes, f.options().quote_style())
-                }
-            }
-        };
-
-        write!(f, [prefix, preferred_quotes])?;
-
-        let (normalized, contains_newlines) =
-            normalize_string(raw_content, preferred_quotes, is_raw_string);
 
+        write!(f, [self.prefix, self.preferred_quotes])?;
         match normalized {
             Cow::Borrowed(_) => {
-                source_text_slice(raw_content_range, contains_newlines).fmt(f)?;
+                source_text_slice(self.range, contains_newlines).fmt(f)?;
             }
             Cow::Owned(normalized) => {
-                dynamic_text(&normalized, Some(raw_content_range.start())).fmt(f)?;
+                dynamic_text(&normalized, Some(self.range.start())).fmt(f)?;
             }
         }
-
-        preferred_quotes.fmt(f)
+        self.preferred_quotes.fmt(f)
     }
 }
 
@@ -639,3 +664,311 @@ fn normalize_string(
 
     (normalized, newlines)
 }
+
+/// For docstring indentation, black counts spaces as 1 and tabs by increasing the indentation up
+/// to the next multiple of 8. This is effectively a port of
+/// [`str.expandtabs`](https://docs.python.org/3/library/stdtypes.html#str.expandtabs),
+/// which black [calls with the default tab width of 8](https://github.com/psf/black/blob/c36e468794f9256d5e922c399240d49782ba04f1/src/black/strings.py#L61)
+fn count_indentation_like_black(line: &str) -> TextSize {
+    let tab_width: u32 = 8;
+    let mut indentation = TextSize::default();
+    for char in line.chars() {
+        if char == '\t' {
+            // Pad to the next multiple of tab_width
+            indentation += TextSize::from(tab_width - (indentation.to_u32().rem_euclid(tab_width)));
+        } else if char.is_whitespace() {
+            indentation += char.text_len();
+        } else {
+            return indentation;
+        }
+    }
+    indentation
+}
+
+/// Format a docstring by trimming whitespace and adjusting the indentation.
+///
+/// Summary of changes we make:
+/// * Normalize the string like all other strings
+/// * Ignore docstring that have an escaped newline
+/// * Trim all trailing whitespace, except for a chaperone space that avoids quotes or backslashes
+///   in the last line.
+/// * Trim leading whitespace on the first line, again except for a chaperone space
+/// * If there is only content in the first line and after that only whitespace, collapse the
+///   docstring into one line
+/// * Adjust the indentation (see below)
+///
+/// # Docstring indentation
+///
+/// Unlike any other string, like black we change the indentation of docstring lines.
+///
+/// We want to preserve the indentation inside the docstring relative to the suite statement/block
+/// indent that the docstring statement is in, but also want to apply the change of the outer
+/// indentation in the docstring, e.g.
+/// ```python
+/// def sparkle_sky():
+///   """Make a pretty sparkly sky.
+///   *       * ✨        *.    .
+///      *       *      ✨      .
+///      .  *      . ✨    * .  .
+///   """
+/// ```
+/// should become
+/// ```python
+/// def sparkle_sky():
+///     """Make a pretty sparkly sky.
+///     *       * ✨        *.    .
+///        *       *      ✨      .
+///        .  *      . ✨    * .  .
+///     """
+/// ```
+/// We can't compute the full indentation here since we don't know what the block indent of
+/// the doc comment will be yet and which we can only have added by formatting each line
+/// separately with a hard line break. This means we need to strip shared indentation from
+/// docstring while preserving the in-docstring bigger-than-suite-statement indentation. Example:
+/// ```python
+/// def f():
+///  """first line
+///  line a
+///     line b
+///  """
+/// ```
+/// The docstring indentation is 2, the block indents will change this to 4 (but we can't
+/// determine this at this point). The indentation of line a is 2, so we trim `  line a`
+/// to `line a`. For line b it's 5, so we trim it to `line b` and pad with 5-2=3 spaces to
+/// `   line b`. The closing quotes, being on their own line, are stripped get only the
+/// default indentation. Fully formatted:
+/// ```python
+/// def f():
+///    """first line
+///    line a
+///       line b
+///    """
+/// ```
+///
+/// Tabs are counted by padding them to the next multiple of 8 according to
+/// [`str.expandtabs`](https://docs.python.org/3/library/stdtypes.html#str.expandtabs). When
+/// we see indentation that contains a tab or any other none ascii-space whitespace we rewrite the
+/// string.
+///
+/// Additionally, if any line in the docstring has less indentation than the docstring
+/// (effectively a negative indentation wrt. to the current level), we pad all lines to the
+/// level of the docstring with spaces.
+/// ```python
+/// def f():
+///    """first line
+/// line a
+///    line b
+///      line c
+///    """
+/// ```
+/// Here line a is 3 columns negatively indented, so we pad all lines by an extra 3 spaces:
+/// ```python
+/// def f():
+///    """first line
+///    line a
+///       line b
+///         line c
+///    """
+/// ```
+fn format_docstring(string_part: &FormatStringPart, f: &mut PyFormatter) -> FormatResult<()> {
+    let locator = f.context().locator();
+
+    // Black doesn't change the indentation of docstrings that contain an escaped newline
+    if locator.slice(string_part.range).contains("\\\n") {
+        return string_part.fmt(f);
+    }
+
+    let (normalized, _) = normalize_string(
+        locator.slice(string_part.range),
+        string_part.preferred_quotes,
+        string_part.is_raw_string,
+    );
+    // is_borrowed is unstable :/
+    let already_normalized = matches!(normalized, Cow::Borrowed(_));
+
+    let mut lines = normalized.lines().peekable();
+
+    // Start the string
+    write!(
+        f,
+        [
+            source_position(string_part.range.start()),
+            string_part.prefix,
+            string_part.preferred_quotes
+        ]
+    )?;
+    // We track where in the source docstring we are (in source code byte offsets)
+    let mut offset = string_part.range.start();
+
+    // The first line directly after the opening quotes has different rules than the rest, mainly
+    // that we remove all leading whitespace as there's no indentation
+    let first = lines.next().unwrap_or_default();
+    // Black trims whitespace using [`str.strip()`](https://docs.python.org/3/library/stdtypes.html#str.strip)
+    // https://github.com/psf/black/blob/b4dca26c7d93f930bbd5a7b552807370b60d4298/src/black/strings.py#L77-L85
+    // So we use the unicode whitespace definition through `trim_{start,end}` instead of the python
+    // tokenizer whitespace definition in `trim_whitespace_{start,end}`.
+    let trim_end = first.trim_end();
+    let trim_both = trim_end.trim_start();
+
+    // Edge case: The first line is `""" "content`, so we need to insert chaperone space that keep
+    // inner quotes and closing quotes from getting to close to avoid `""""content`
+    if trim_both.starts_with(string_part.preferred_quotes.style.as_char()) {
+        space().fmt(f)?;
+    }
+
+    if !trim_end.is_empty() {
+        // For the first line of the docstring we strip the leading and trailing whitespace, e.g.
+        // `"""   content   ` to `"""content`
+        let leading_whitespace = trim_end.text_len() - trim_both.text_len();
+        let trimmed_line_range =
+            TextRange::at(offset, trim_end.text_len()).add_start(leading_whitespace);
+        if already_normalized {
+            source_text_slice(trimmed_line_range, ContainsNewlines::No).fmt(f)?;
+        } else {
+            dynamic_text(trim_both, Some(trimmed_line_range.start())).fmt(f)?;
+        }
+    }
+    offset += first.text_len();
+
+    // Check if we have a single line (or empty) docstring
+    if normalized[first.len()..].trim().is_empty() {
+        // For `"""\n"""` or other whitespace between the quotes, black keeps a single whitespace,
+        // but `""""""` doesn't get one inserted.
+        if needs_chaperone_space(string_part, trim_end)
+            || (trim_end.is_empty() && !normalized.is_empty())
+        {
+            space().fmt(f)?;
+        }
+        string_part.preferred_quotes.fmt(f)?;
+        return Ok(());
+    }
+
+    hard_line_break().fmt(f)?;
+    // We know that the normalized string has \n line endings
+    offset += "\n".text_len();
+
+    // If some line of the docstring is less indented than the function body, we pad all lines to
+    // align it with the docstring statement. Conversely, if all lines are over-indented, we strip
+    // the extra indentation. We call this stripped indentation since it's relative to the block
+    // indent printer-made indentation.
+    let stripped_indentation = lines
+        .clone()
+        // We don't want to count whitespace-only lines as miss-indented
+        .filter(|line| !line.trim().is_empty())
+        .map(count_indentation_like_black)
+        .min()
+        .unwrap_or_default();
+
+    while let Some(line) = lines.next() {
+        let is_last = lines.peek().is_none();
+        format_docstring_line(
+            line,
+            is_last,
+            offset,
+            stripped_indentation,
+            already_normalized,
+            f,
+        )?;
+        // We know that the normalized string has \n line endings
+        offset += line.text_len() + "\n".text_len();
+    }
+
+    // Same special case in the last line as for the first line
+    let trim_end = normalized
+        .as_ref()
+        .trim_end_matches(|c: char| c.is_whitespace() && c != '\n');
+    if needs_chaperone_space(string_part, trim_end) {
+        space().fmt(f)?;
+    }
+
+    write!(
+        f,
+        [
+            string_part.preferred_quotes,
+            source_position(string_part.range.end())
+        ]
+    )
+}
+
+/// If the last line of the docstring is `content" """` or `content\ """`, we need a chaperone space
+/// that avoids `content""""` and `content\"""`. This does only applies to un-escaped backslashes,
+/// so `content\\ """` doesn't need a space while `content\\\ """` does.
+fn needs_chaperone_space(string_part: &FormatStringPart, trim_end: &str) -> bool {
+    trim_end.ends_with(string_part.preferred_quotes.style.as_char())
+        || trim_end.chars().rev().take_while(|c| *c == '\\').count() % 2 == 1
+}
+
+/// Format a docstring line that is not the first line
+fn format_docstring_line(
+    line: &str,
+    is_last: bool,
+    offset: TextSize,
+    stripped_indentation: TextSize,
+    already_normalized: bool,
+    f: &mut PyFormatter,
+) -> FormatResult<()> {
+    let trim_end = line.trim_end();
+    if trim_end.is_empty() {
+        return if is_last {
+            // If the doc string ends with `    """`, the last line is `    `, but we don't want to
+            // insert an empty line (but close the docstring)
+            Ok(())
+        } else {
+            empty_line().fmt(f)
+        };
+    }
+
+    let tab_or_non_ascii_space = trim_end
+        .chars()
+        .take_while(|c| c.is_whitespace())
+        .any(|c| c != ' ');
+
+    if tab_or_non_ascii_space {
+        // We strip the indentation that is shared with the docstring statement, unless a line
+        // was indented less than the docstring statement, in which we strip only this much
+        // indentation to implicitly pad all lines by the difference, or all lines were
+        // overindented, in which case we strip the additional whitespace (see example in
+        // [`format_docstring`] doc comment). We then prepend the in-docstring indentation to the
+        // string.
+        let indent_len = count_indentation_like_black(trim_end) - stripped_indentation;
+        let in_docstring_indent = " ".repeat(indent_len.to_usize()) + trim_end.trim_start();
+        dynamic_text(&in_docstring_indent, Some(offset)).fmt(f)?;
+    } else {
+        // Take the string with the trailing whitespace removed, then also skip the leading
+        // whitespace
+        let trimmed_line_range =
+            TextRange::at(offset, trim_end.text_len()).add_start(stripped_indentation);
+        if already_normalized {
+            source_text_slice(trimmed_line_range, ContainsNewlines::No).fmt(f)?;
+        } else {
+            // All indents are ascii spaces, so the slicing is correct
+            dynamic_text(
+                &trim_end[stripped_indentation.to_usize()..],
+                Some(trimmed_line_range.start()),
+            )
+            .fmt(f)?;
+        }
+    }
+
+    // We handled the case that the closing quotes are on their own line above (the last line is
+    // empty except for whitespace). If they are on the same line as content, we don't insert a line
+    // break.
+    if !is_last {
+        hard_line_break().fmt(f)?;
+    }
+
+    Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::expression::string::count_indentation_like_black;
+
+    #[test]
+    fn test_indentation_like_black() {
+        assert_eq!(count_indentation_like_black("\t \t  \t").to_u32(), 24);
+        assert_eq!(count_indentation_like_black("\t        \t").to_u32(), 24);
+        assert_eq!(count_indentation_like_black("\t\t\t").to_u32(), 24);
+        assert_eq!(count_indentation_like_black("    ").to_u32(), 4);
+    }
+}
diff --git a/crates/ruff_python_formatter/src/statement/suite.rs b/crates/ruff_python_formatter/src/statement/suite.rs
index ad3da3c927..02a9a8180b 100644
--- a/crates/ruff_python_formatter/src/statement/suite.rs
+++ b/crates/ruff_python_formatter/src/statement/suite.rs
@@ -1,9 +1,15 @@
 use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions};
 use ruff_python_ast::helpers::is_compound_statement;
-use ruff_python_ast::{self as ast, Constant, Expr, Ranged, Stmt, Suite};
+use ruff_python_ast::str::is_implicit_concatenation;
+use ruff_python_ast::{self as ast, Expr, Ranged, Stmt, Suite};
+use ruff_python_ast::{Constant, ExprConstant};
 use ruff_python_trivia::{lines_after_ignoring_trivia, lines_before};
+use ruff_source_file::Locator;
 
+use crate::comments::{leading_comments, trailing_comments};
 use crate::context::{NodeLevel, WithNodeLevel};
+use crate::expression::expr_constant::ExprConstantLayout;
+use crate::expression::string::StringLayout;
 use crate::prelude::*;
 
 /// Level at which the [`Suite`] appears in the source code.
@@ -71,44 +77,76 @@ impl FormatRule> for FormatSuite {
                 }
                 write!(f, [first.format()])?;
             }
-            SuiteKind::Class if is_docstring(first) => {
-                if !comments.has_leading_comments(first) && lines_before(first.start(), source) > 1
-                {
-                    // Allow up to one empty line before a class docstring, e.g., this is
-                    // stable formatting:
+            SuiteKind::Function => {
+                if let Some(constant) = get_docstring(first, &f.context().locator()) {
+                    write!(
+                        f,
+                        [
+                            // We format the expression, but the statement carries the comments
+                            leading_comments(comments.leading_comments(first)),
+                            constant
+                                .format()
+                                .with_options(ExprConstantLayout::String(StringLayout::DocString)),
+                            trailing_comments(comments.trailing_comments(first)),
+                        ]
+                    )?;
+                } else {
+                    write!(f, [first.format()])?;
+                }
+            }
+            SuiteKind::Class => {
+                if let Some(constant) = get_docstring(first, &f.context().locator()) {
+                    if !comments.has_leading_comments(first)
+                        && lines_before(first.start(), source) > 1
+                    {
+                        // Allow up to one empty line before a class docstring
+                        // ```python
+                        // class Test:
+                        //
+                        //     """Docstring"""
+                        // ```
+                        write!(f, [empty_line()])?;
+                    }
+                    write!(
+                        f,
+                        [
+                            // We format the expression, but the statement carries the comments
+                            leading_comments(comments.leading_comments(first)),
+                            constant
+                                .format()
+                                .with_options(ExprConstantLayout::String(StringLayout::DocString)),
+                            trailing_comments(comments.trailing_comments(first)),
+                        ]
+                    )?;
+
+                    // Enforce an empty line after a class docstring
                     // ```python
                     // class Test:
+                    //     """Docstring"""
+                    //
+                    //     ...
+                    //
+                    //
+                    // class Test:
                     //
                     //     """Docstring"""
+                    //
+                    //     ...
                     // ```
-                    write!(f, [empty_line()])?;
-                }
-                write!(f, [first.format()])?;
-
-                // Enforce an empty line after a class docstring, e.g., these are both stable
-                // formatting:
-                // ```python
-                // class Test:
-                //     """Docstring"""
-                //
-                //     ...
-                //
-                //
-                // class Test:
-                //
-                //     """Docstring"""
-                //
-                //     ...
-                // ```
-                if let Some(second) = iter.next() {
-                    // Format the subsequent statement immediately. This rule takes precedence
-                    // over the rules in the loop below (and most of them won't apply anyway,
-                    // e.g., we know the first statement isn't an import).
-                    write!(f, [empty_line(), second.format()])?;
-                    last = second;
+                    // Unlike black, we add the newline also after single quoted docstrings
+                    if let Some(second) = iter.next() {
+                        // Format the subsequent statement immediately. This rule takes precedence
+                        // over the rules in the loop below (and most of them won't apply anyway,
+                        // e.g., we know the first statement isn't an import).
+                        write!(f, [empty_line(), second.format()])?;
+                        last = second;
+                    }
+                } else {
+                    // No docstring, use normal formatting
+                    write!(f, [first.format()])?;
                 }
             }
-            _ => {
+            SuiteKind::TopLevel => {
                 write!(f, [first.format()])?;
             }
         }
@@ -218,18 +256,27 @@ const fn is_import_definition(stmt: &Stmt) -> bool {
     matches!(stmt, Stmt::Import(_) | Stmt::ImportFrom(_))
 }
 
-fn is_docstring(stmt: &Stmt) -> bool {
+/// Checks if the statement is a simple string that can be formatted as a docstring
+fn get_docstring<'a>(stmt: &'a Stmt, locator: &Locator) -> Option<&'a ExprConstant> {
     let Stmt::Expr(ast::StmtExpr { value, .. }) = stmt else {
-        return false;
+        return None;
     };
 
-    matches!(
-        value.as_ref(),
-        Expr::Constant(ast::ExprConstant {
-            value: Constant::Str(..),
-            ..
-        })
-    )
+    let Expr::Constant(constant) = value.as_ref() else {
+        return None;
+    };
+    if let ExprConstant {
+        value: Constant::Str(..),
+        range,
+        ..
+    } = constant
+    {
+        if is_implicit_concatenation(locator.slice(*range)) {
+            return None;
+        }
+        return Some(constant);
+    }
+    None
 }
 
 impl FormatRuleWithOptions> for FormatSuite {
@@ -260,7 +307,6 @@ impl<'ast> IntoFormat> for Suite {
 #[cfg(test)]
 mod tests {
     use ruff_formatter::format;
-
     use ruff_python_parser::parse_suite;
 
     use crate::comments::Comments;
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@miscellaneous__docstring_no_string_normalization.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@miscellaneous__docstring_no_string_normalization.py.snap
index 80c7ba60ec..0b680fd94c 100644
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@miscellaneous__docstring_no_string_normalization.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@miscellaneous__docstring_no_string_normalization.py.snap
@@ -135,7 +135,7 @@ def multiline_backslash_3():
 ```diff
 --- Black
 +++ Ruff
-@@ -1,73 +1,75 @@
+@@ -1,24 +1,24 @@
  class ALonelyClass:
 -    '''
 +    """
@@ -167,96 +167,7 @@ def multiline_backslash_3():
      pass
  
  
- def foo():
--    """This is a docstring with
--    some lines of text here
--    """
-+    """This is a docstring with             
-+  some lines of text here
-+  """
-     return
- 
- 
- def baz():
-     '''"This" is a string with some
--    embedded "quotes"'''
-+  embedded "quotes"'''
-     return
- 
- 
- def poit():
-     """
--    Lorem ipsum dolor sit amet.
-+  Lorem ipsum dolor sit amet.       
- 
--    Consectetur adipiscing elit:
--     - sed do eiusmod tempor incididunt ut labore
--     - dolore magna aliqua
--       - enim ad minim veniam
--       - quis nostrud exercitation ullamco laboris nisi
--     - aliquip ex ea commodo consequat
--    """
-+  Consectetur adipiscing elit:
-+   - sed do eiusmod tempor incididunt ut labore
-+   - dolore magna aliqua
-+     - enim ad minim veniam
-+     - quis nostrud exercitation ullamco laboris nisi
-+   - aliquip ex ea commodo consequat
-+  """
-     pass
- 
- 
- def under_indent():
-     """
--      These lines are indented in a way that does not
--    make sense.
--    """
-+  These lines are indented in a way that does not
-+make sense.
-+  """
-     pass
- 
- 
- def over_indent():
-     """
--    This has a shallow indent
--      - But some lines are deeper
--      - And the closing quote is too deep
-+  This has a shallow indent
-+    - But some lines are deeper
-+    - And the closing quote is too deep
-     """
-     pass
- 
- 
- def single_line():
--    """But with a newline after it!"""
-+    """But with a newline after it!
-+
-+    """
-     pass
- 
- 
-@@ -83,41 +85,41 @@
- 
- def and_that():
-     """
--    "hey yah" """
-+  "hey yah" """
- 
- 
- def and_this():
--    '''
--    "hey yah"'''
-+    ''' 
-+  "hey yah"'''
- 
- 
- def believe_it_or_not_this_is_in_the_py_stdlib():
--    '''
--    "hey yah"'''
-+    ''' 
-+"hey yah"'''
+@@ -97,27 +97,27 @@
  
  
  def shockingly_the_quotes_are_normalized_v2():
@@ -285,14 +196,14 @@ def multiline_backslash_3():
 -    '''
 -    hey there \ '''
 +    """
-+  hey there \ """
++    hey there \ """
  
  
  def multiline_backslash_3():
 -    '''
 -    already escaped \\'''
 +    """
-+  already escaped \\ """
++    already escaped \\"""
 ```
 
 ## Ruff Output
@@ -323,53 +234,51 @@ def shockingly_the_quotes_are_normalized():
 
 
 def foo():
-    """This is a docstring with             
-  some lines of text here
-  """
+    """This is a docstring with
+    some lines of text here
+    """
     return
 
 
 def baz():
     '''"This" is a string with some
-  embedded "quotes"'''
+    embedded "quotes"'''
     return
 
 
 def poit():
     """
-  Lorem ipsum dolor sit amet.       
+    Lorem ipsum dolor sit amet.
 
-  Consectetur adipiscing elit:
-   - sed do eiusmod tempor incididunt ut labore
-   - dolore magna aliqua
-     - enim ad minim veniam
-     - quis nostrud exercitation ullamco laboris nisi
-   - aliquip ex ea commodo consequat
-  """
+    Consectetur adipiscing elit:
+     - sed do eiusmod tempor incididunt ut labore
+     - dolore magna aliqua
+       - enim ad minim veniam
+       - quis nostrud exercitation ullamco laboris nisi
+     - aliquip ex ea commodo consequat
+    """
     pass
 
 
 def under_indent():
     """
-  These lines are indented in a way that does not
-make sense.
-  """
+      These lines are indented in a way that does not
+    make sense.
+    """
     pass
 
 
 def over_indent():
     """
-  This has a shallow indent
-    - But some lines are deeper
-    - And the closing quote is too deep
+    This has a shallow indent
+      - But some lines are deeper
+      - And the closing quote is too deep
     """
     pass
 
 
 def single_line():
-    """But with a newline after it!
-
-    """
+    """But with a newline after it!"""
     pass
 
 
@@ -385,17 +294,17 @@ def that():
 
 def and_that():
     """
-  "hey yah" """
+    "hey yah" """
 
 
 def and_this():
-    ''' 
-  "hey yah"'''
+    '''
+    "hey yah"'''
 
 
 def believe_it_or_not_this_is_in_the_py_stdlib():
-    ''' 
-"hey yah"'''
+    '''
+    "hey yah"'''
 
 
 def shockingly_the_quotes_are_normalized_v2():
@@ -417,12 +326,12 @@ def multiline_backslash_1():
 
 def multiline_backslash_2():
     """
-  hey there \ """
+    hey there \ """
 
 
 def multiline_backslash_3():
     """
-  already escaped \\ """
+    already escaped \\"""
 ```
 
 ## Black Output
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments_non_breaking_space.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments_non_breaking_space.py.snap
deleted file mode 100644
index e8c73055d0..0000000000
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments_non_breaking_space.py.snap
+++ /dev/null
@@ -1,105 +0,0 @@
----
-source: crates/ruff_python_formatter/tests/fixtures.rs
-input_file: crates/ruff_python_formatter/resources/test/fixtures/black/simple_cases/comments_non_breaking_space.py
----
-## Input
-
-```py
-from .config import (  ConfigTypeAttributes,    Int,    Path,    # String,
-    # DEFAULT_TYPE_ATTRIBUTES,
-)
-
-result = 1  # A simple comment
-result = (    1, ) # Another one
-
-result = 1    # type: ignore
-result = 1# This comment is talking about type: ignore
-square = Square(4) # type: Optional[Square]
-
-def function(a:int=42):
-    """ This docstring is already formatted
-       a
-       b
-    """
-    #    There's a NBSP + 3 spaces before
-    #    And 4 spaces on the next line
-    pass
-```
-
-## Black Differences
-
-```diff
---- Black
-+++ Ruff
-@@ -14,9 +14,9 @@
- 
- 
- def function(a: int = 42):
--    """This docstring is already formatted
--    a
--    b
-+    """ This docstring is already formatted
-+       a
-+       b
-     """
-     #    There's a NBSP + 3 spaces before
-     #    And 4 spaces on the next line
-```
-
-## Ruff Output
-
-```py
-from .config import (
-    ConfigTypeAttributes,
-    Int,
-    Path,  # String,
-    # DEFAULT_TYPE_ATTRIBUTES,
-)
-
-result = 1  # A simple comment
-result = (1,)  # Another one
-
-result = 1  #  type: ignore
-result = 1  # This comment is talking about type: ignore
-square = Square(4)  #  type: Optional[Square]
-
-
-def function(a: int = 42):
-    """ This docstring is already formatted
-       a
-       b
-    """
-    #    There's a NBSP + 3 spaces before
-    #    And 4 spaces on the next line
-    pass
-```
-
-## Black Output
-
-```py
-from .config import (
-    ConfigTypeAttributes,
-    Int,
-    Path,  # String,
-    # DEFAULT_TYPE_ATTRIBUTES,
-)
-
-result = 1  # A simple comment
-result = (1,)  # Another one
-
-result = 1  #  type: ignore
-result = 1  # This comment is talking about type: ignore
-square = Square(4)  #  type: Optional[Square]
-
-
-def function(a: int = 42):
-    """This docstring is already formatted
-    a
-    b
-    """
-    #    There's a NBSP + 3 spaces before
-    #    And 4 spaces on the next line
-    pass
-```
-
-
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring.py.snap
deleted file mode 100644
index 60a50df3a5..0000000000
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring.py.snap
+++ /dev/null
@@ -1,924 +0,0 @@
----
-source: crates/ruff_python_formatter/tests/fixtures.rs
-input_file: crates/ruff_python_formatter/resources/test/fixtures/black/simple_cases/docstring.py
----
-## Input
-
-```py
-class MyClass:
-  """ Multiline
-  class docstring
-  """
-
-  def method(self):
-    """Multiline
-    method docstring
-    """
-    pass
-
-
-def foo():
-  """This is a docstring with             
-  some lines of text here
-  """
-  return
-
-
-def bar():
-  '''This is another docstring
-  with more lines of text
-  '''
-  return
-
-
-def baz():
-  '''"This" is a string with some
-  embedded "quotes"'''
-  return
-
-
-def troz():
-	'''Indentation with tabs
-	is just as OK
-	'''
-	return
-
-
-def zort():
-        """Another
-        multiline
-        docstring
-        """
-        pass
-
-def poit():
-  """
-  Lorem ipsum dolor sit amet.       
-
-  Consectetur adipiscing elit:
-   - sed do eiusmod tempor incididunt ut labore
-   - dolore magna aliqua
-     - enim ad minim veniam
-     - quis nostrud exercitation ullamco laboris nisi
-   - aliquip ex ea commodo consequat
-  """
-  pass
-
-
-def under_indent():
-  """
-  These lines are indented in a way that does not
-make sense.
-  """
-  pass
-
-
-def over_indent():
-  """
-  This has a shallow indent
-    - But some lines are deeper
-    - And the closing quote is too deep
-    """
-  pass
-
-
-def single_line():
-    """But with a newline after it!
-
-    """
-    pass
-
-
-def this():
-    r"""
-    'hey ho'
-    """
-
-
-def that():
-  """ "hey yah" """
-
-
-def and_that():
-  """
-  "hey yah" """
-
-
-def and_this():
-  ''' 
-  "hey yah"'''
-
-
-def multiline_whitespace():
-    '''
-    
-    
-    
-    
-    '''
-
-
-def oneline_whitespace():
-    '''      '''
-
-
-def empty():
-    """"""
-
-
-def single_quotes():
-    'testing'
-
-
-def believe_it_or_not_this_is_in_the_py_stdlib(): ''' 
-"hey yah"'''
-
-
-def ignored_docstring():
-    """a => \
-b"""  
-
-def single_line_docstring_with_whitespace():
-    """   This should be stripped """
-
-def docstring_with_inline_tabs_and_space_indentation():
-    """hey
-
-    tab	separated	value
-    	tab at start of line and then a tab	separated	value
-    				multiple tabs at the beginning	and	inline
-    	 	  	mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-    			 	  		
-    line ends with some tabs		
-    """
-
-
-def docstring_with_inline_tabs_and_tab_indentation():
-	"""hey
-
-	tab	separated	value
-		tab at start of line and then a tab	separated	value
-					multiple tabs at the beginning	and	inline
-		 	  	mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-				 	  		
-	line ends with some tabs		
-	"""
-	pass
-
-
-def backslash_space():
-    """\ """
-
-
-def multiline_backslash_1():
-  '''
-  hey\there\
-  \ '''
-
-
-def multiline_backslash_2():
-  '''
-  hey there \ '''
-
-# Regression test for #3425
-def multiline_backslash_really_long_dont_crash():
-    """
-    hey there hello guten tag hi hoow are you ola zdravstvuyte ciao como estas ca va \ """
-
-
-def multiline_backslash_3():
-  '''
-  already escaped \\ '''
-
-
-def my_god_its_full_of_stars_1():
-    "I'm sorry Dave\u2001"
-
-
-# the space below is actually a \u2001, removed in output
-def my_god_its_full_of_stars_2():
-    "I'm sorry Dave "
-
-
-def docstring_almost_at_line_limit():
-    """long docstring................................................................."""
-
-
-def docstring_almost_at_line_limit2():
-    """long docstring.................................................................
-
-    ..................................................................................
-    """
-
-
-def docstring_at_line_limit():
-    """long docstring................................................................"""
-
-
-def multiline_docstring_at_line_limit():
-    """first line-----------------------------------------------------------------------
-
-    second line----------------------------------------------------------------------"""
-
-
-def stable_quote_normalization_with_immediate_inner_single_quote(self):
-    ''''
-
-    
-    '''
-```
-
-## Black Differences
-
-```diff
---- Black
-+++ Ruff
-@@ -1,83 +1,85 @@
- class MyClass:
--    """Multiline
--    class docstring
--    """
-+    """ Multiline
-+  class docstring
-+  """
- 
-     def method(self):
-         """Multiline
--        method docstring
--        """
-+    method docstring
-+    """
-         pass
- 
- 
- def foo():
--    """This is a docstring with
--    some lines of text here
--    """
-+    """This is a docstring with             
-+  some lines of text here
-+  """
-     return
- 
- 
- def bar():
-     """This is another docstring
--    with more lines of text
--    """
-+  with more lines of text
-+  """
-     return
- 
- 
- def baz():
-     '''"This" is a string with some
--    embedded "quotes"'''
-+  embedded "quotes"'''
-     return
- 
- 
- def troz():
-     """Indentation with tabs
--    is just as OK
--    """
-+	is just as OK
-+	"""
-     return
- 
- 
- def zort():
-     """Another
--    multiline
--    docstring
--    """
-+        multiline
-+        docstring
-+        """
-     pass
- 
- 
- def poit():
-     """
--    Lorem ipsum dolor sit amet.
-+  Lorem ipsum dolor sit amet.       
- 
--    Consectetur adipiscing elit:
--     - sed do eiusmod tempor incididunt ut labore
--     - dolore magna aliqua
--       - enim ad minim veniam
--       - quis nostrud exercitation ullamco laboris nisi
--     - aliquip ex ea commodo consequat
--    """
-+  Consectetur adipiscing elit:
-+   - sed do eiusmod tempor incididunt ut labore
-+   - dolore magna aliqua
-+     - enim ad minim veniam
-+     - quis nostrud exercitation ullamco laboris nisi
-+   - aliquip ex ea commodo consequat
-+  """
-     pass
- 
- 
- def under_indent():
-     """
--      These lines are indented in a way that does not
--    make sense.
--    """
-+  These lines are indented in a way that does not
-+make sense.
-+  """
-     pass
- 
- 
- def over_indent():
-     """
--    This has a shallow indent
--      - But some lines are deeper
--      - And the closing quote is too deep
-+  This has a shallow indent
-+    - But some lines are deeper
-+    - And the closing quote is too deep
-     """
-     pass
- 
- 
- def single_line():
--    """But with a newline after it!"""
-+    """But with a newline after it!
-+
-+    """
-     pass
- 
- 
-@@ -93,20 +95,25 @@
- 
- def and_that():
-     """
--    "hey yah" """
-+  "hey yah" """
- 
- 
- def and_this():
--    '''
--    "hey yah"'''
-+    ''' 
-+  "hey yah"'''
- 
- 
- def multiline_whitespace():
--    """ """
-+    """
-+    
-+    
-+    
-+    
-+    """
- 
- 
- def oneline_whitespace():
--    """ """
-+    """      """
- 
- 
- def empty():
-@@ -118,8 +125,8 @@
- 
- 
- def believe_it_or_not_this_is_in_the_py_stdlib():
--    '''
--    "hey yah"'''
-+    ''' 
-+"hey yah"'''
- 
- 
- def ignored_docstring():
-@@ -128,31 +135,31 @@
- 
- 
- def single_line_docstring_with_whitespace():
--    """This should be stripped"""
-+    """   This should be stripped """
- 
- 
- def docstring_with_inline_tabs_and_space_indentation():
-     """hey
- 
-     tab	separated	value
--        tab at start of line and then a tab	separated	value
--                                multiple tabs at the beginning	and	inline
--                        mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
--
--    line ends with some tabs
-+    	tab at start of line and then a tab	separated	value
-+    				multiple tabs at the beginning	and	inline
-+    	 	  	mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-+    			 	  		
-+    line ends with some tabs		
-     """
- 
- 
- def docstring_with_inline_tabs_and_tab_indentation():
-     """hey
- 
--    tab	separated	value
--            tab at start of line and then a tab	separated	value
--                                    multiple tabs at the beginning	and	inline
--                            mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
--
--    line ends with some tabs
--    """
-+	tab	separated	value
-+		tab at start of line and then a tab	separated	value
-+					multiple tabs at the beginning	and	inline
-+		 	  	mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-+				 	  		
-+	line ends with some tabs		
-+	"""
-     pass
- 
- 
-@@ -168,7 +175,7 @@
- 
- def multiline_backslash_2():
-     """
--    hey there \ """
-+  hey there \ """
- 
- 
- # Regression test for #3425
-@@ -179,7 +186,7 @@
- 
- def multiline_backslash_3():
-     """
--    already escaped \\"""
-+  already escaped \\ """
- 
- 
- def my_god_its_full_of_stars_1():
-@@ -188,7 +195,7 @@
- 
- # the space below is actually a \u2001, removed in output
- def my_god_its_full_of_stars_2():
--    "I'm sorry Dave"
-+    "I'm sorry Dave "
- 
- 
- def docstring_almost_at_line_limit():
-```
-
-## Ruff Output
-
-```py
-class MyClass:
-    """ Multiline
-  class docstring
-  """
-
-    def method(self):
-        """Multiline
-    method docstring
-    """
-        pass
-
-
-def foo():
-    """This is a docstring with             
-  some lines of text here
-  """
-    return
-
-
-def bar():
-    """This is another docstring
-  with more lines of text
-  """
-    return
-
-
-def baz():
-    '''"This" is a string with some
-  embedded "quotes"'''
-    return
-
-
-def troz():
-    """Indentation with tabs
-	is just as OK
-	"""
-    return
-
-
-def zort():
-    """Another
-        multiline
-        docstring
-        """
-    pass
-
-
-def poit():
-    """
-  Lorem ipsum dolor sit amet.       
-
-  Consectetur adipiscing elit:
-   - sed do eiusmod tempor incididunt ut labore
-   - dolore magna aliqua
-     - enim ad minim veniam
-     - quis nostrud exercitation ullamco laboris nisi
-   - aliquip ex ea commodo consequat
-  """
-    pass
-
-
-def under_indent():
-    """
-  These lines are indented in a way that does not
-make sense.
-  """
-    pass
-
-
-def over_indent():
-    """
-  This has a shallow indent
-    - But some lines are deeper
-    - And the closing quote is too deep
-    """
-    pass
-
-
-def single_line():
-    """But with a newline after it!
-
-    """
-    pass
-
-
-def this():
-    r"""
-    'hey ho'
-    """
-
-
-def that():
-    """ "hey yah" """
-
-
-def and_that():
-    """
-  "hey yah" """
-
-
-def and_this():
-    ''' 
-  "hey yah"'''
-
-
-def multiline_whitespace():
-    """
-    
-    
-    
-    
-    """
-
-
-def oneline_whitespace():
-    """      """
-
-
-def empty():
-    """"""
-
-
-def single_quotes():
-    "testing"
-
-
-def believe_it_or_not_this_is_in_the_py_stdlib():
-    ''' 
-"hey yah"'''
-
-
-def ignored_docstring():
-    """a => \
-b"""
-
-
-def single_line_docstring_with_whitespace():
-    """   This should be stripped """
-
-
-def docstring_with_inline_tabs_and_space_indentation():
-    """hey
-
-    tab	separated	value
-    	tab at start of line and then a tab	separated	value
-    				multiple tabs at the beginning	and	inline
-    	 	  	mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-    			 	  		
-    line ends with some tabs		
-    """
-
-
-def docstring_with_inline_tabs_and_tab_indentation():
-    """hey
-
-	tab	separated	value
-		tab at start of line and then a tab	separated	value
-					multiple tabs at the beginning	and	inline
-		 	  	mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-				 	  		
-	line ends with some tabs		
-	"""
-    pass
-
-
-def backslash_space():
-    """\ """
-
-
-def multiline_backslash_1():
-    """
-  hey\there\
-  \ """
-
-
-def multiline_backslash_2():
-    """
-  hey there \ """
-
-
-# Regression test for #3425
-def multiline_backslash_really_long_dont_crash():
-    """
-    hey there hello guten tag hi hoow are you ola zdravstvuyte ciao como estas ca va \ """
-
-
-def multiline_backslash_3():
-    """
-  already escaped \\ """
-
-
-def my_god_its_full_of_stars_1():
-    "I'm sorry Dave\u2001"
-
-
-# the space below is actually a \u2001, removed in output
-def my_god_its_full_of_stars_2():
-    "I'm sorry Dave "
-
-
-def docstring_almost_at_line_limit():
-    """long docstring................................................................."""
-
-
-def docstring_almost_at_line_limit2():
-    """long docstring.................................................................
-
-    ..................................................................................
-    """
-
-
-def docstring_at_line_limit():
-    """long docstring................................................................"""
-
-
-def multiline_docstring_at_line_limit():
-    """first line-----------------------------------------------------------------------
-
-    second line----------------------------------------------------------------------"""
-
-
-def stable_quote_normalization_with_immediate_inner_single_quote(self):
-    """'
-
-    
-    """
-```
-
-## Black Output
-
-```py
-class MyClass:
-    """Multiline
-    class docstring
-    """
-
-    def method(self):
-        """Multiline
-        method docstring
-        """
-        pass
-
-
-def foo():
-    """This is a docstring with
-    some lines of text here
-    """
-    return
-
-
-def bar():
-    """This is another docstring
-    with more lines of text
-    """
-    return
-
-
-def baz():
-    '''"This" is a string with some
-    embedded "quotes"'''
-    return
-
-
-def troz():
-    """Indentation with tabs
-    is just as OK
-    """
-    return
-
-
-def zort():
-    """Another
-    multiline
-    docstring
-    """
-    pass
-
-
-def poit():
-    """
-    Lorem ipsum dolor sit amet.
-
-    Consectetur adipiscing elit:
-     - sed do eiusmod tempor incididunt ut labore
-     - dolore magna aliqua
-       - enim ad minim veniam
-       - quis nostrud exercitation ullamco laboris nisi
-     - aliquip ex ea commodo consequat
-    """
-    pass
-
-
-def under_indent():
-    """
-      These lines are indented in a way that does not
-    make sense.
-    """
-    pass
-
-
-def over_indent():
-    """
-    This has a shallow indent
-      - But some lines are deeper
-      - And the closing quote is too deep
-    """
-    pass
-
-
-def single_line():
-    """But with a newline after it!"""
-    pass
-
-
-def this():
-    r"""
-    'hey ho'
-    """
-
-
-def that():
-    """ "hey yah" """
-
-
-def and_that():
-    """
-    "hey yah" """
-
-
-def and_this():
-    '''
-    "hey yah"'''
-
-
-def multiline_whitespace():
-    """ """
-
-
-def oneline_whitespace():
-    """ """
-
-
-def empty():
-    """"""
-
-
-def single_quotes():
-    "testing"
-
-
-def believe_it_or_not_this_is_in_the_py_stdlib():
-    '''
-    "hey yah"'''
-
-
-def ignored_docstring():
-    """a => \
-b"""
-
-
-def single_line_docstring_with_whitespace():
-    """This should be stripped"""
-
-
-def docstring_with_inline_tabs_and_space_indentation():
-    """hey
-
-    tab	separated	value
-        tab at start of line and then a tab	separated	value
-                                multiple tabs at the beginning	and	inline
-                        mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-
-    line ends with some tabs
-    """
-
-
-def docstring_with_inline_tabs_and_tab_indentation():
-    """hey
-
-    tab	separated	value
-            tab at start of line and then a tab	separated	value
-                                    multiple tabs at the beginning	and	inline
-                            mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
-
-    line ends with some tabs
-    """
-    pass
-
-
-def backslash_space():
-    """\ """
-
-
-def multiline_backslash_1():
-    """
-  hey\there\
-  \ """
-
-
-def multiline_backslash_2():
-    """
-    hey there \ """
-
-
-# Regression test for #3425
-def multiline_backslash_really_long_dont_crash():
-    """
-    hey there hello guten tag hi hoow are you ola zdravstvuyte ciao como estas ca va \ """
-
-
-def multiline_backslash_3():
-    """
-    already escaped \\"""
-
-
-def my_god_its_full_of_stars_1():
-    "I'm sorry Dave\u2001"
-
-
-# the space below is actually a \u2001, removed in output
-def my_god_its_full_of_stars_2():
-    "I'm sorry Dave"
-
-
-def docstring_almost_at_line_limit():
-    """long docstring................................................................."""
-
-
-def docstring_almost_at_line_limit2():
-    """long docstring.................................................................
-
-    ..................................................................................
-    """
-
-
-def docstring_at_line_limit():
-    """long docstring................................................................"""
-
-
-def multiline_docstring_at_line_limit():
-    """first line-----------------------------------------------------------------------
-
-    second line----------------------------------------------------------------------"""
-
-
-def stable_quote_normalization_with_immediate_inner_single_quote(self):
-    """'
-
-    
-    """
-```
-
-
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring_preview.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring_preview.py.snap
index 427408a63c..dad30c4cb8 100644
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring_preview.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__docstring_preview.py.snap
@@ -62,11 +62,7 @@ def single_quote_docstring_over_line_limit2():
 ```diff
 --- Black
 +++ Ruff
-@@ -1,9 +1,11 @@
- def docstring_almost_at_line_limit():
--    """long docstring................................................................."""
-+    """long docstring.................................................................
-+    """
+@@ -3,7 +3,8 @@
  
  
  def docstring_almost_at_line_limit_with_prefix():
@@ -82,8 +78,7 @@ def single_quote_docstring_over_line_limit2():
 
 ```py
 def docstring_almost_at_line_limit():
-    """long docstring.................................................................
-    """
+    """long docstring................................................................."""
 
 
 def docstring_almost_at_line_limit_with_prefix():
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@docstring.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@docstring.py.snap
new file mode 100644
index 0000000000..0a3c9a62a6
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@docstring.py.snap
@@ -0,0 +1,448 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring.py
+---
+## Input
+```py
+def single_line_backslashes1():
+  """ content\     """
+  return
+
+
+def single_line_backslashes2():
+  """ content\\     """
+  return
+
+
+def single_line_backslashes3():
+  """ content\\\     """
+  return
+
+
+def multiline_backslashes1():
+  """This is a docstring with
+  some lines of text\     """
+  return
+
+
+def multiline_backslashes2():
+  """This is a docstring with
+  some lines of text\\     """
+  return
+
+
+def multiline_backslashes3():
+  """This is a docstring with
+  some lines of text\\\     """
+  return
+
+
+def multiple_negatively_indented_docstring_lines():
+    """a
+ b
+  c
+   d
+    e
+    """
+
+
+def overindentend_docstring():
+    """a
+            over-indented
+    """
+
+
+def comment_before_docstring():
+    # don't lose this function comment ...
+    """Does nothing.
+
+    But it has comments
+    """  # ... neither lose this function comment
+
+
+class CommentBeforeDocstring():
+    # don't lose this class comment ...
+    """Empty class.
+
+    But it has comments
+    """  # ... neither lose this class comment
+
+
+class IndentMeSome:
+    def doc_string_without_linebreak_after_colon(self): """ This is somewhat strange
+         a
+      b
+         We format this a is the docstring had started properly indented on the next
+         line if the target indentation. This may we incorrect since source and target
+         indentation can be incorrect, but this is also an edge case.
+         """
+
+
+class IgnoreImplicitlyConcatenatedStrings:
+    """""" ""
+
+
+def docstring_that_ends_with_quote_and_a_line_break1():
+    """
+    he said "the news of my death have been greatly exaggerated"
+    """
+
+
+def docstring_that_ends_with_quote_and_a_line_break2():
+    """he said "the news of my death have been greatly exaggerated"
+    """
+
+
+def docstring_that_ends_with_quote_and_a_line_break3():
+    """he said "the news of my death have been greatly exaggerated"
+
+    """
+
+
+class TabbedIndent:
+	def tabbed_indent(self):
+		"""check for correct tabbed formatting
+		                            ^^^^^^^^^^
+		Normal indented line
+		  	- autor
+		"""
+```
+
+## Outputs
+### Output 1
+```
+indent-style            = Spaces, size: 4
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def single_line_backslashes1():
+    """content\ """
+    return
+
+
+def single_line_backslashes2():
+    """content\\"""
+    return
+
+
+def single_line_backslashes3():
+    """content\\\ """
+    return
+
+
+def multiline_backslashes1():
+    """This is a docstring with
+    some lines of text\ """
+    return
+
+
+def multiline_backslashes2():
+    """This is a docstring with
+    some lines of text\\"""
+    return
+
+
+def multiline_backslashes3():
+    """This is a docstring with
+    some lines of text\\\ """
+    return
+
+
+def multiple_negatively_indented_docstring_lines():
+    """a
+    b
+     c
+      d
+       e
+    """
+
+
+def overindentend_docstring():
+    """a
+    over-indented
+    """
+
+
+def comment_before_docstring():
+    # don't lose this function comment ...
+    """Does nothing.
+
+    But it has comments
+    """  # ... neither lose this function comment
+
+
+class CommentBeforeDocstring:
+    # don't lose this class comment ...
+    """Empty class.
+
+    But it has comments
+    """  # ... neither lose this class comment
+
+
+class IndentMeSome:
+    def doc_string_without_linebreak_after_colon(self):
+        """This is somewhat strange
+           a
+        b
+           We format this a is the docstring had started properly indented on the next
+           line if the target indentation. This may we incorrect since source and target
+           indentation can be incorrect, but this is also an edge case.
+        """
+
+
+class IgnoreImplicitlyConcatenatedStrings:
+    """""" ""
+
+
+def docstring_that_ends_with_quote_and_a_line_break1():
+    """
+    he said "the news of my death have been greatly exaggerated"
+    """
+
+
+def docstring_that_ends_with_quote_and_a_line_break2():
+    """he said "the news of my death have been greatly exaggerated" """
+
+
+def docstring_that_ends_with_quote_and_a_line_break3():
+    """he said "the news of my death have been greatly exaggerated" """
+
+
+class TabbedIndent:
+    def tabbed_indent(self):
+        """check for correct tabbed formatting
+                                    ^^^^^^^^^^
+        Normal indented line
+                - autor
+        """
+```
+
+
+### Output 2
+```
+indent-style            = Spaces, size: 2
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def single_line_backslashes1():
+  """content\ """
+  return
+
+
+def single_line_backslashes2():
+  """content\\"""
+  return
+
+
+def single_line_backslashes3():
+  """content\\\ """
+  return
+
+
+def multiline_backslashes1():
+  """This is a docstring with
+  some lines of text\ """
+  return
+
+
+def multiline_backslashes2():
+  """This is a docstring with
+  some lines of text\\"""
+  return
+
+
+def multiline_backslashes3():
+  """This is a docstring with
+  some lines of text\\\ """
+  return
+
+
+def multiple_negatively_indented_docstring_lines():
+  """a
+  b
+   c
+    d
+     e
+  """
+
+
+def overindentend_docstring():
+  """a
+  over-indented
+  """
+
+
+def comment_before_docstring():
+  # don't lose this function comment ...
+  """Does nothing.
+
+  But it has comments
+  """  # ... neither lose this function comment
+
+
+class CommentBeforeDocstring:
+  # don't lose this class comment ...
+  """Empty class.
+
+  But it has comments
+  """  # ... neither lose this class comment
+
+
+class IndentMeSome:
+  def doc_string_without_linebreak_after_colon(self):
+    """This is somewhat strange
+       a
+    b
+       We format this a is the docstring had started properly indented on the next
+       line if the target indentation. This may we incorrect since source and target
+       indentation can be incorrect, but this is also an edge case.
+    """
+
+
+class IgnoreImplicitlyConcatenatedStrings:
+  """""" ""
+
+
+def docstring_that_ends_with_quote_and_a_line_break1():
+  """
+  he said "the news of my death have been greatly exaggerated"
+  """
+
+
+def docstring_that_ends_with_quote_and_a_line_break2():
+  """he said "the news of my death have been greatly exaggerated" """
+
+
+def docstring_that_ends_with_quote_and_a_line_break3():
+  """he said "the news of my death have been greatly exaggerated" """
+
+
+class TabbedIndent:
+  def tabbed_indent(self):
+    """check for correct tabbed formatting
+                                ^^^^^^^^^^
+    Normal indented line
+            - autor
+    """
+```
+
+
+### Output 3
+```
+indent-style            = Tab
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def single_line_backslashes1():
+	"""content\ """
+	return
+
+
+def single_line_backslashes2():
+	"""content\\"""
+	return
+
+
+def single_line_backslashes3():
+	"""content\\\ """
+	return
+
+
+def multiline_backslashes1():
+	"""This is a docstring with
+	some lines of text\ """
+	return
+
+
+def multiline_backslashes2():
+	"""This is a docstring with
+	some lines of text\\"""
+	return
+
+
+def multiline_backslashes3():
+	"""This is a docstring with
+	some lines of text\\\ """
+	return
+
+
+def multiple_negatively_indented_docstring_lines():
+	"""a
+	b
+	 c
+	  d
+	   e
+	"""
+
+
+def overindentend_docstring():
+	"""a
+	over-indented
+	"""
+
+
+def comment_before_docstring():
+	# don't lose this function comment ...
+	"""Does nothing.
+
+	But it has comments
+	"""  # ... neither lose this function comment
+
+
+class CommentBeforeDocstring:
+	# don't lose this class comment ...
+	"""Empty class.
+
+	But it has comments
+	"""  # ... neither lose this class comment
+
+
+class IndentMeSome:
+	def doc_string_without_linebreak_after_colon(self):
+		"""This is somewhat strange
+		   a
+		b
+		   We format this a is the docstring had started properly indented on the next
+		   line if the target indentation. This may we incorrect since source and target
+		   indentation can be incorrect, but this is also an edge case.
+		"""
+
+
+class IgnoreImplicitlyConcatenatedStrings:
+	"""""" ""
+
+
+def docstring_that_ends_with_quote_and_a_line_break1():
+	"""
+	he said "the news of my death have been greatly exaggerated"
+	"""
+
+
+def docstring_that_ends_with_quote_and_a_line_break2():
+	"""he said "the news of my death have been greatly exaggerated" """
+
+
+def docstring_that_ends_with_quote_and_a_line_break3():
+	"""he said "the news of my death have been greatly exaggerated" """
+
+
+class TabbedIndent:
+	def tabbed_indent(self):
+		"""check for correct tabbed formatting
+		                            ^^^^^^^^^^
+		Normal indented line
+		        - autor
+		"""
+```
+
+
+

From 680d171ae5e08d816c39568f23b80cc40e9b0cd2 Mon Sep 17 00:00:00 2001
From: Tom Kuson 
Date: Mon, 14 Aug 2023 14:22:48 +0100
Subject: [PATCH 106/155] Tweak documentation for `FBT002` (#6556)

---
 .../check_boolean_default_value_in_function_definition.rs    | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs b/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs
index 37037d3ea0..ecf8ff7dc8 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs
+++ b/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs
@@ -14,14 +14,15 @@ use crate::rules::flake8_boolean_trap::helpers::{add_if_boolean, is_allowed_func
 /// Calling a function with boolean default means that the keyword argument
 /// argument can be omitted, which makes the function call ambiguous.
 ///
-/// Instead, define the relevant argument as keyword-only.
+/// Instead, consider defining the relevant argument as a required keyword
+/// argument to force callers to be explicit about their intent.
 ///
 /// ## Example
 /// ```python
 /// from math import ceil, floor
 ///
 ///
-/// def round_number(number: float, *, up: bool = True) -> int:
+/// def round_number(number: float, up: bool = True) -> int:
 ///     return ceil(number) if up else floor(number)
 ///
 ///

From fc0c9507d0c47841b1bf28fc905f4b7ede7d8c86 Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Mon, 14 Aug 2023 15:29:05 +0200
Subject: [PATCH 107/155] Override fmt_dangling_comments for frequent nodes
 (#6551)

---
 crates/ruff_formatter/src/lib.rs                            | 3 ++-
 crates/ruff_python_formatter/src/expression/expr_compare.rs | 5 +++++
 crates/ruff_python_formatter/src/expression/expr_name.rs    | 5 +++++
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/crates/ruff_formatter/src/lib.rs b/crates/ruff_formatter/src/lib.rs
index e98d998ef3..a6cd1f578e 100644
--- a/crates/ruff_formatter/src/lib.rs
+++ b/crates/ruff_formatter/src/lib.rs
@@ -780,7 +780,8 @@ where
     Context: FormatContext,
 {
     let mut state = FormatState::new(context);
-    let mut buffer = VecBuffer::with_capacity(arguments.items().len(), &mut state);
+    let mut buffer =
+        VecBuffer::with_capacity(state.context().source_code().as_str().len(), &mut state);
 
     buffer.write_fmt(arguments)?;
 
diff --git a/crates/ruff_python_formatter/src/expression/expr_compare.rs b/crates/ruff_python_formatter/src/expression/expr_compare.rs
index c01014ef80..07c85526cf 100644
--- a/crates/ruff_python_formatter/src/expression/expr_compare.rs
+++ b/crates/ruff_python_formatter/src/expression/expr_compare.rs
@@ -69,6 +69,11 @@ impl FormatNodeRule for FormatExprCompare {
 
         in_parentheses_only_group(&inner).fmt(f)
     }
+
+    fn fmt_dangling_comments(&self, _node: &ExprCompare, _f: &mut PyFormatter) -> FormatResult<()> {
+        // Node can not have dangling comments
+        Ok(())
+    }
 }
 
 impl NeedsParentheses for ExprCompare {
diff --git a/crates/ruff_python_formatter/src/expression/expr_name.rs b/crates/ruff_python_formatter/src/expression/expr_name.rs
index 2653f343b4..99d5374498 100644
--- a/crates/ruff_python_formatter/src/expression/expr_name.rs
+++ b/crates/ruff_python_formatter/src/expression/expr_name.rs
@@ -22,6 +22,11 @@ impl FormatNodeRule for FormatExprName {
 
         write!(f, [source_text_slice(*range, ContainsNewlines::No)])
     }
+
+    fn fmt_dangling_comments(&self, _node: &ExprName, _f: &mut PyFormatter) -> FormatResult<()> {
+        // Node cannot have dangling comments
+        Ok(())
+    }
 }
 
 impl NeedsParentheses for ExprName {

From f16e780e0ac74e6c9bd94435ce1992324b26eab2 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 09:46:54 -0400
Subject: [PATCH 108/155] Add an implicit concatenation flag to string and
 bytes constants (#6512)

## Summary

Per the discussion in
https://github.com/astral-sh/ruff/discussions/6183, this PR adds an
`implicit_concatenated` flag to the string and bytes constant variants.
It's not actually _used_ anywhere as of this PR, but it is covered by
the tests.

Specifically, we now use a struct for the string and bytes cases, along
with the `Expr::FString` node. That struct holds the value, plus the
flag:

```rust
#[derive(Clone, Debug, PartialEq, is_macro::Is)]
pub enum Constant {
    Str(StringConstant),
    Bytes(BytesConstant),
    ...
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StringConstant {
    /// The string value as resolved by the parser (i.e., without quotes, or escape sequences, or
    /// implicit concatenations).
    pub value: String,
    /// Whether the string contains multiple string tokens that were implicitly concatenated.
    pub implicit_concatenated: bool,
}

impl Deref for StringConstant {
    type Target = str;
    fn deref(&self) -> &Self::Target {
        self.value.as_str()
    }
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BytesConstant {
    /// The bytes value as resolved by the parser (i.e., without quotes, or escape sequences, or
    /// implicit concatenations).
    pub value: Vec,
    /// Whether the string contains multiple string tokens that were implicitly concatenated.
    pub implicit_concatenated: bool,
}

impl Deref for BytesConstant {
    type Target = [u8];
    fn deref(&self) -> &Self::Target {
        self.value.as_slice()
    }
}
```

## Test Plan

`cargo test`
---
 .../src/checkers/ast/analyze/expression.rs    |   8 +-
 crates/ruff/src/checkers/ast/mod.rs           |   2 +-
 .../rules/airflow/rules/task_variable_name.rs |   2 +-
 .../rules/check_positional_boolean_in_def.rs  |   2 +-
 .../rules/getattr_with_constant.rs            |   2 +-
 .../rules/setattr_with_constant.rs            |   2 +-
 .../rules/unreliable_callable_check.rs        |   4 +-
 .../rules/all_with_model_form.rs              |   8 +-
 .../flake8_pyi/rules/unrecognized_platform.rs |   2 +-
 .../flake8_pytest_style/rules/helpers.rs      |   6 +-
 .../flake8_pytest_style/rules/parametrize.rs  |  36 +-
 .../rules/flake8_simplify/rules/ast_expr.rs   |   4 +-
 .../src/rules/flake8_simplify/rules/ast_if.rs |  16 +-
 .../path_constructor_current_directory.rs     |   4 +-
 crates/ruff/src/rules/flynt/helpers.rs        |   2 +-
 .../flynt/rules/static_join_to_fstring.rs     |  32 +-
 .../src/rules/pandas_vet/rules/read_table.rs  |   4 +-
 .../ruff/src/rules/pyflakes/rules/strings.rs  |   6 +-
 .../pylint/rules/assert_on_string_literal.rs  |   2 +-
 .../pylint/rules/bad_string_format_type.rs    |   5 +-
 crates/ruff/src/rules/pylint/rules/logging.rs |   2 +-
 .../pylint/rules/magic_value_comparison.rs    |   4 +-
 ...convert_named_tuple_functional_to_class.rs |   5 +-
 .../convert_typed_dict_functional_to_class.rs |   5 +-
 .../rules/pyupgrade/rules/native_literals.rs  |  10 +-
 .../rules/printf_string_formatting.rs         |   5 +-
 .../pyupgrade/rules/redundant_open_modes.rs   |  10 +-
 .../tryceratops/rules/raise_vanilla_args.rs   |   6 +-
 crates/ruff_python_ast/src/all.rs             |   2 +-
 crates/ruff_python_ast/src/comparable.rs      |  26 +-
 crates/ruff_python_ast/src/helpers.rs         |  23 +-
 crates/ruff_python_ast/src/node.rs            |   6 +-
 crates/ruff_python_ast/src/nodes.rs           |  80 ++-
 crates/ruff_python_ast/src/relocate.rs        |   2 +-
 crates/ruff_python_ast/src/visitor.rs         |   2 +-
 crates/ruff_python_codegen/src/generator.rs   |  12 +-
 ...parser__parser__tests__dict_unpacking.snap |  20 +-
 ..._tests__generator_expression_argument.snap |  15 +-
 ...f_python_parser__parser__tests__match.snap |  20 +-
 ...on_parser__parser__tests__parse_class.snap |   5 +-
 ...parser__parser__tests__parse_f_string.snap |   6 +-
 ...n_parser__parser__tests__parse_kwargs.snap |   5 +-
 ..._parser__parser__tests__parse_print_2.snap |   5 +-
 ...ser__parser__tests__parse_print_hello.snap |   5 +-
 ...n_parser__parser__tests__parse_string.snap |   5 +-
 ...parser__tests__parse_type_declaration.snap |   5 +-
 ...f_python_parser__parser__tests__patma.snap |  35 +-
 ...uff_python_parser__parser__tests__try.snap |  12 +-
 ...ython_parser__parser__tests__try_star.snap |  27 +-
 ...arser__string__tests__backspace_alias.snap |   5 +-
 ...hon_parser__string__tests__bell_alias.snap |   5 +-
 ..._string__tests__carriage_return_alias.snap |   5 +-
 ...r_tabulation_with_justification_alias.snap |   5 +-
 ...n_parser__string__tests__delete_alias.snap |   5 +-
 ...er__string__tests__double_quoted_byte.snap | 519 +++++++++---------
 ...n_parser__string__tests__escape_alias.snap |   5 +-
 ...g__tests__escape_char_in_byte_literal.snap |  27 +-
 ...n_parser__string__tests__escape_octet.snap |  17 +-
 ...arser__string__tests__form_feed_alias.snap |   5 +-
 ...string__tests__fstring_constant_range.snap |  16 +-
 ...ing__tests__fstring_escaped_character.snap |   6 +-
 ...tring__tests__fstring_escaped_newline.snap |   6 +-
 ...ing__tests__fstring_line_continuation.snap |   6 +-
 ...ring_parse_self_documenting_base_more.snap |  10 +-
 ...fstring_parse_self_documenting_format.snap |   6 +-
 ...ing__tests__fstring_unescaped_newline.snap |   6 +-
 ...thon_parser__string__tests__hts_alias.snap |   5 +-
 ...tring__tests__parse_f_string_concat_1.snap |   6 +-
 ...tring__tests__parse_f_string_concat_2.snap |   6 +-
 ...tring__tests__parse_f_string_concat_3.snap |  11 +-
 ...tring__tests__parse_f_string_concat_4.snap |  63 +++
 ..._parser__string__tests__parse_fstring.snap |   5 +-
 ...ring_nested_concatenation_string_spec.snap |  50 ++
 ...ing__tests__parse_fstring_nested_spec.snap |   1 +
 ...sts__parse_fstring_nested_string_spec.snap |  50 ++
 ..._tests__parse_fstring_not_nested_spec.snap |   6 +-
 ...r__string__tests__parse_string_concat.snap |   5 +-
 ..._parse_string_triple_quotes_with_kind.snap |   5 +-
 ...ing__tests__parse_u_f_string_concat_1.snap |   6 +-
 ...ing__tests__parse_u_f_string_concat_2.snap |   6 +-
 ...tring__tests__parse_u_string_concat_1.snap |   5 +-
 ...tring__tests__parse_u_string_concat_2.snap |   5 +-
 ...er__string__tests__raw_byte_literal_1.snap |  15 +-
 ...er__string__tests__raw_byte_literal_2.snap |  11 +-
 ...on_parser__string__tests__raw_fstring.snap |   1 +
 ...er__string__tests__single_quoted_byte.snap | 519 +++++++++---------
 ...ing__tests__triple_quoted_raw_fstring.snap |   1 +
 crates/ruff_python_parser/src/string.rs       |  63 ++-
 88 files changed, 1252 insertions(+), 761 deletions(-)
 create mode 100644 crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_4.snap
 create mode 100644 crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_concatenation_string_spec.snap
 create mode 100644 crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_string_spec.snap

diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs
index d452a718a3..15cf51627d 100644
--- a/crates/ruff/src/checkers/ast/analyze/expression.rs
+++ b/crates/ruff/src/checkers/ast/analyze/expression.rs
@@ -418,9 +418,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) {
 
                             if checker.enabled(Rule::BadStringFormatCharacter) {
                                 pylint::rules::bad_string_format_character::call(
-                                    checker,
-                                    val.as_str(),
-                                    location,
+                                    checker, val, location,
                                 );
                             }
                         }
@@ -918,7 +916,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) {
                 pylint::rules::await_outside_async(checker, expr);
             }
         }
-        Expr::FString(ast::ExprFString { values, range: _ }) => {
+        Expr::FString(ast::ExprFString { values, .. }) => {
             if checker.enabled(Rule::FStringMissingPlaceholders) {
                 pyflakes::rules::f_string_missing_placeholders(expr, values, checker);
             }
@@ -945,7 +943,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) {
             range: _,
         }) => {
             if let Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(value),
+                value: Constant::Str(ast::StringConstant { value, .. }),
                 ..
             }) = left.as_ref()
             {
diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs
index 0cb15891ec..4eb0589eb2 100644
--- a/crates/ruff/src/checkers/ast/mod.rs
+++ b/crates/ruff/src/checkers/ast/mod.rs
@@ -1275,7 +1275,7 @@ where
 
     fn visit_format_spec(&mut self, format_spec: &'b Expr) {
         match format_spec {
-            Expr::FString(ast::ExprFString { values, range: _ }) => {
+            Expr::FString(ast::ExprFString { values, .. }) => {
                 for value in values {
                     self.visit_expr(value);
                 }
diff --git a/crates/ruff/src/rules/airflow/rules/task_variable_name.rs b/crates/ruff/src/rules/airflow/rules/task_variable_name.rs
index 9c73477af5..6a33944448 100644
--- a/crates/ruff/src/rules/airflow/rules/task_variable_name.rs
+++ b/crates/ruff/src/rules/airflow/rules/task_variable_name.rs
@@ -80,7 +80,7 @@ pub(crate) fn variable_name_task_id(
     // If the keyword argument is not a string, we can't do anything.
     let task_id = match &keyword.value {
         Expr::Constant(constant) => match &constant.value {
-            Constant::Str(value) => value,
+            Constant::Str(ast::StringConstant { value, .. }) => value,
             _ => return None,
         },
         _ => return None,
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_positional_boolean_in_def.rs b/crates/ruff/src/rules/flake8_boolean_trap/rules/check_positional_boolean_in_def.rs
index a60dc6ae6a..b1197a75a7 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_positional_boolean_in_def.rs
+++ b/crates/ruff/src/rules/flake8_boolean_trap/rules/check_positional_boolean_in_def.rs
@@ -112,7 +112,7 @@ pub(crate) fn check_positional_boolean_in_def(
         let hint = match expr.as_ref() {
             Expr::Name(name) => &name.id == "bool",
             Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(value),
+                value: Constant::Str(ast::StringConstant { value, .. }),
                 ..
             }) => value == "bool",
             _ => false,
diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/getattr_with_constant.rs b/crates/ruff/src/rules/flake8_bugbear/rules/getattr_with_constant.rs
index 94de14785c..c7c5944c81 100644
--- a/crates/ruff/src/rules/flake8_bugbear/rules/getattr_with_constant.rs
+++ b/crates/ruff/src/rules/flake8_bugbear/rules/getattr_with_constant.rs
@@ -64,7 +64,7 @@ pub(crate) fn getattr_with_constant(
         return;
     };
     let Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(value),
+        value: Constant::Str(ast::StringConstant { value, .. }),
         ..
     }) = arg
     else {
diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs b/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs
index ab5bc1462e..9bb1802b85 100644
--- a/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs
+++ b/crates/ruff/src/rules/flake8_bugbear/rules/setattr_with_constant.rs
@@ -88,7 +88,7 @@ pub(crate) fn setattr_with_constant(
     if !is_identifier(name) {
         return;
     }
-    if is_mangled_private(name.as_str()) {
+    if is_mangled_private(name) {
         return;
     }
     // We can only replace a `setattr` call (which is an `Expr`) with an assignment
diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs b/crates/ruff/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs
index d9532a927b..eefcf16bd7 100644
--- a/crates/ruff/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs
+++ b/crates/ruff/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs
@@ -68,13 +68,13 @@ pub(crate) fn unreliable_callable_check(
         return;
     };
     let Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(string),
+        value: Constant::Str(ast::StringConstant { value, .. }),
         ..
     }) = attr
     else {
         return;
     };
-    if string != "__call__" {
+    if value != "__call__" {
         return;
     }
 
diff --git a/crates/ruff/src/rules/flake8_django/rules/all_with_model_form.rs b/crates/ruff/src/rules/flake8_django/rules/all_with_model_form.rs
index 77dea2d27d..a54f7e08d2 100644
--- a/crates/ruff/src/rules/flake8_django/rules/all_with_model_form.rs
+++ b/crates/ruff/src/rules/flake8_django/rules/all_with_model_form.rs
@@ -83,13 +83,13 @@ pub(crate) fn all_with_model_form(
                     continue;
                 };
                 match value {
-                    Constant::Str(s) => {
-                        if s == "__all__" {
+                    Constant::Str(ast::StringConstant { value, .. }) => {
+                        if value == "__all__" {
                             return Some(Diagnostic::new(DjangoAllWithModelForm, element.range()));
                         }
                     }
-                    Constant::Bytes(b) => {
-                        if b == "__all__".as_bytes() {
+                    Constant::Bytes(ast::BytesConstant { value, .. }) => {
+                        if value == "__all__".as_bytes() {
                             return Some(Diagnostic::new(DjangoAllWithModelForm, element.range()));
                         }
                     }
diff --git a/crates/ruff/src/rules/flake8_pyi/rules/unrecognized_platform.rs b/crates/ruff/src/rules/flake8_pyi/rules/unrecognized_platform.rs
index 971bfd4b03..75d48b7326 100644
--- a/crates/ruff/src/rules/flake8_pyi/rules/unrecognized_platform.rs
+++ b/crates/ruff/src/rules/flake8_pyi/rules/unrecognized_platform.rs
@@ -123,7 +123,7 @@ pub(crate) fn unrecognized_platform(checker: &mut Checker, test: &Expr) {
     }
 
     if let Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(value),
+        value: Constant::Str(ast::StringConstant { value, .. }),
         ..
     }) = right
     {
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs
index df35d5a44f..43a183267f 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/helpers.rs
@@ -46,11 +46,11 @@ pub(super) fn is_pytest_parametrize(decorator: &Decorator, semantic: &SemanticMo
 
 pub(super) fn keyword_is_literal(keyword: &Keyword, literal: &str) -> bool {
     if let Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(string),
+        value: Constant::Str(ast::StringConstant { value, .. }),
         ..
     }) = &keyword.value
     {
-        string == literal
+        value == literal
     } else {
         false
     }
@@ -63,7 +63,7 @@ pub(super) fn is_empty_or_null_string(expr: &Expr) -> bool {
             ..
         }) => string.is_empty(),
         Expr::Constant(constant) if constant.value.is_none() => true,
-        Expr::FString(ast::ExprFString { values, range: _ }) => {
+        Expr::FString(ast::ExprFString { values, .. }) => {
             values.iter().all(is_empty_or_null_string)
         }
         _ => false,
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
index e42a3d9550..8c635daaf2 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
@@ -50,9 +50,9 @@ impl Violation for PytestParametrizeValuesWrongType {
 }
 
 fn elts_to_csv(elts: &[Expr], generator: Generator) -> Option {
-    let all_literals = elts.iter().all(|e| {
+    let all_literals = elts.iter().all(|expr| {
         matches!(
-            e,
+            expr,
             Expr::Constant(ast::ExprConstant {
                 value: Constant::Str(_),
                 ..
@@ -65,19 +65,23 @@ fn elts_to_csv(elts: &[Expr], generator: Generator) -> Option {
     }
 
     let node = Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(elts.iter().fold(String::new(), |mut acc, elt| {
-            if let Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(ref s),
-                ..
-            }) = elt
-            {
-                if !acc.is_empty() {
-                    acc.push(',');
+        value: elts
+            .iter()
+            .fold(String::new(), |mut acc, elt| {
+                if let Expr::Constant(ast::ExprConstant {
+                    value: Constant::Str(ast::StringConstant { value, .. }),
+                    ..
+                }) = elt
+                {
+                    if !acc.is_empty() {
+                        acc.push(',');
+                    }
+                    acc.push_str(value.as_str());
                 }
-                acc.push_str(s);
-            }
-            acc
-        })),
+                acc
+            })
+            .into(),
+
         kind: None,
         range: TextRange::default(),
     });
@@ -166,7 +170,7 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) {
                                     .iter()
                                     .map(|name| {
                                         Expr::Constant(ast::ExprConstant {
-                                            value: Constant::Str((*name).to_string()),
+                                            value: (*name).to_string().into(),
                                             kind: None,
                                             range: TextRange::default(),
                                         })
@@ -201,7 +205,7 @@ fn check_names(checker: &mut Checker, decorator: &Decorator, expr: &Expr) {
                                     .iter()
                                     .map(|name| {
                                         Expr::Constant(ast::ExprConstant {
-                                            value: Constant::Str((*name).to_string()),
+                                            value: (*name).to_string().into(),
                                             kind: None,
                                             range: TextRange::default(),
                                         })
diff --git a/crates/ruff/src/rules/flake8_simplify/rules/ast_expr.rs b/crates/ruff/src/rules/flake8_simplify/rules/ast_expr.rs
index 26c8612bf0..380a71bf0d 100644
--- a/crates/ruff/src/rules/flake8_simplify/rules/ast_expr.rs
+++ b/crates/ruff/src/rules/flake8_simplify/rules/ast_expr.rs
@@ -115,7 +115,7 @@ pub(crate) fn use_capital_environment_variables(checker: &mut Checker, expr: &Ex
         return;
     };
     let Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(env_var),
+        value: Constant::Str(ast::StringConstant { value: env_var, .. }),
         ..
     }) = arg
     else {
@@ -167,7 +167,7 @@ fn check_os_environ_subscript(checker: &mut Checker, expr: &Expr) {
         return;
     }
     let Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(env_var),
+        value: Constant::Str(ast::StringConstant { value: env_var, .. }),
         kind,
         range: _,
     }) = slice.as_ref()
diff --git a/crates/ruff/src/rules/flake8_simplify/rules/ast_if.rs b/crates/ruff/src/rules/flake8_simplify/rules/ast_if.rs
index cb18e590f4..be12732220 100644
--- a/crates/ruff/src/rules/flake8_simplify/rules/ast_if.rs
+++ b/crates/ruff/src/rules/flake8_simplify/rules/ast_if.rs
@@ -264,15 +264,13 @@ fn is_main_check(expr: &Expr) -> bool {
     {
         if let Expr::Name(ast::ExprName { id, .. }) = left.as_ref() {
             if id == "__name__" {
-                if comparators.len() == 1 {
-                    if let Expr::Constant(ast::ExprConstant {
-                        value: Constant::Str(value),
-                        ..
-                    }) = &comparators[0]
-                    {
-                        if value == "__main__" {
-                            return true;
-                        }
+                if let [Expr::Constant(ast::ExprConstant {
+                    value: Constant::Str(ast::StringConstant { value, .. }),
+                    ..
+                })] = comparators.as_slice()
+                {
+                    if value == "__main__" {
+                        return true;
                     }
                 }
             }
diff --git a/crates/ruff/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs b/crates/ruff/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs
index 3b582bc214..2a814c01a6 100644
--- a/crates/ruff/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs
+++ b/crates/ruff/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs
@@ -1,4 +1,4 @@
-use ruff_python_ast::{Arguments, Constant, Expr, ExprCall, ExprConstant};
+use ruff_python_ast::{self as ast, Arguments, Constant, Expr, ExprCall, ExprConstant};
 
 use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix};
 use ruff_macros::{derive_message_formats, violation};
@@ -67,7 +67,7 @@ pub(crate) fn path_constructor_current_directory(checker: &mut Checker, expr: &E
     }
 
     let [Expr::Constant(ExprConstant {
-        value: Constant::Str(value),
+        value: Constant::Str(ast::StringConstant { value, .. }),
         kind: _,
         range,
     })] = args.as_slice()
diff --git a/crates/ruff/src/rules/flynt/helpers.rs b/crates/ruff/src/rules/flynt/helpers.rs
index 31368a0fd9..35183bb020 100644
--- a/crates/ruff/src/rules/flynt/helpers.rs
+++ b/crates/ruff/src/rules/flynt/helpers.rs
@@ -16,7 +16,7 @@ fn to_formatted_value_expr(inner: &Expr) -> Expr {
 /// Convert a string to a constant string expression.
 pub(super) fn to_constant_string(s: &str) -> Expr {
     let node = ast::ExprConstant {
-        value: Constant::Str(s.to_owned()),
+        value: s.to_owned().into(),
         kind: None,
         range: TextRange::default(),
     };
diff --git a/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs b/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs
index f1290ee8be..05c39b937b 100644
--- a/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs
+++ b/crates/ruff/src/rules/flynt/rules/static_join_to_fstring.rs
@@ -61,22 +61,21 @@ fn build_fstring(joiner: &str, joinees: &[Expr]) -> Option {
         )
     }) {
         let node = ast::ExprConstant {
-            value: Constant::Str(
-                joinees
-                    .iter()
-                    .filter_map(|expr| {
-                        if let Expr::Constant(ast::ExprConstant {
-                            value: Constant::Str(string),
-                            ..
-                        }) = expr
-                        {
-                            Some(string.as_str())
-                        } else {
-                            None
-                        }
-                    })
-                    .join(joiner),
-            ),
+            value: joinees
+                .iter()
+                .filter_map(|expr| {
+                    if let Expr::Constant(ast::ExprConstant {
+                        value: Constant::Str(ast::StringConstant { value, .. }),
+                        ..
+                    }) = expr
+                    {
+                        Some(value.as_str())
+                    } else {
+                        None
+                    }
+                })
+                .join(joiner)
+                .into(),
             range: TextRange::default(),
             kind: None,
         };
@@ -100,6 +99,7 @@ fn build_fstring(joiner: &str, joinees: &[Expr]) -> Option {
 
     let node = ast::ExprFString {
         values: fstring_elems,
+        implicit_concatenated: false,
         range: TextRange::default(),
     };
     Some(node.into())
diff --git a/crates/ruff/src/rules/pandas_vet/rules/read_table.rs b/crates/ruff/src/rules/pandas_vet/rules/read_table.rs
index 9f856ba82d..fb03d56ef2 100644
--- a/crates/ruff/src/rules/pandas_vet/rules/read_table.rs
+++ b/crates/ruff/src/rules/pandas_vet/rules/read_table.rs
@@ -51,14 +51,14 @@ pub(crate) fn use_of_read_table(checker: &mut Checker, call: &ast::ExprCall) {
         .is_some_and(|call_path| matches!(call_path.as_slice(), ["pandas", "read_table"]))
     {
         if let Some(Expr::Constant(ast::ExprConstant {
-            value: Constant::Str(value),
+            value: Constant::Str(ast::StringConstant { value, .. }),
             ..
         })) = call
             .arguments
             .find_keyword("sep")
             .map(|keyword| &keyword.value)
         {
-            if value.as_str() == "," {
+            if value == "," {
                 checker
                     .diagnostics
                     .push(Diagnostic::new(PandasUseOfDotReadTable, call.func.range()));
diff --git a/crates/ruff/src/rules/pyflakes/rules/strings.rs b/crates/ruff/src/rules/pyflakes/rules/strings.rs
index a57ceead4d..17d9be995b 100644
--- a/crates/ruff/src/rules/pyflakes/rules/strings.rs
+++ b/crates/ruff/src/rules/pyflakes/rules/strings.rs
@@ -583,10 +583,10 @@ pub(crate) fn percent_format_extra_named_arguments(
         .enumerate()
         .filter_map(|(index, key)| match key {
             Some(Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(value),
+                value: Constant::Str(ast::StringConstant { value, .. }),
                 ..
             })) => {
-                if summary.keywords.contains(value) {
+                if summary.keywords.contains(value.as_str()) {
                     None
                 } else {
                     Some((index, value.as_str()))
@@ -646,7 +646,7 @@ pub(crate) fn percent_format_missing_arguments(
     for key in keys.iter().flatten() {
         match key {
             Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(value),
+                value: Constant::Str(ast::StringConstant { value, .. }),
                 ..
             }) => {
                 keywords.insert(value);
diff --git a/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs b/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs
index 0dcde075d1..b88987fbae 100644
--- a/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs
+++ b/crates/ruff/src/rules/pylint/rules/assert_on_string_literal.rs
@@ -71,7 +71,7 @@ pub(crate) fn assert_on_string_literal(checker: &mut Checker, test: &Expr) {
             }
             _ => {}
         },
-        Expr::FString(ast::ExprFString { values, range: _ }) => {
+        Expr::FString(ast::ExprFString { values, .. }) => {
             checker.diagnostics.push(Diagnostic::new(
                 AssertOnStringLiteral {
                     kind: if values.iter().all(|value| match value {
diff --git a/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs b/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs
index dfb7283f60..7ae0e648fe 100644
--- a/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs
+++ b/crates/ruff/src/rules/pylint/rules/bad_string_format_type.rs
@@ -187,7 +187,10 @@ fn is_valid_dict(
             return true;
         };
         if let Expr::Constant(ast::ExprConstant {
-            value: Constant::Str(mapping_key),
+            value:
+                Constant::Str(ast::StringConstant {
+                    value: mapping_key, ..
+                }),
             ..
         }) = key
         {
diff --git a/crates/ruff/src/rules/pylint/rules/logging.rs b/crates/ruff/src/rules/pylint/rules/logging.rs
index 5bbc56b4c2..1c05df692f 100644
--- a/crates/ruff/src/rules/pylint/rules/logging.rs
+++ b/crates/ruff/src/rules/pylint/rules/logging.rs
@@ -109,7 +109,7 @@ pub(crate) fn logging_call(checker: &mut Checker, call: &ast::ExprCall) {
     }
 
     let Some(Expr::Constant(ast::ExprConstant {
-        value: Constant::Str(value),
+        value: Constant::Str(ast::StringConstant { value, .. }),
         ..
     })) = call.arguments.find_positional(0)
     else {
diff --git a/crates/ruff/src/rules/pylint/rules/magic_value_comparison.rs b/crates/ruff/src/rules/pylint/rules/magic_value_comparison.rs
index 0c7385c410..3f96d789c2 100644
--- a/crates/ruff/src/rules/pylint/rules/magic_value_comparison.rs
+++ b/crates/ruff/src/rules/pylint/rules/magic_value_comparison.rs
@@ -79,7 +79,9 @@ fn is_magic_value(constant: &Constant, allowed_types: &[ConstantType]) -> bool {
         Constant::Bool(_) => false,
         Constant::Ellipsis => false,
         // Otherwise, special-case some common string and integer types.
-        Constant::Str(value) => !matches!(value.as_str(), "" | "__main__"),
+        Constant::Str(ast::StringConstant { value, .. }) => {
+            !matches!(value.as_str(), "" | "__main__")
+        }
         Constant::Int(value) => !matches!(value.try_into(), Ok(0 | 1)),
         Constant::Bytes(_) => true,
         Constant::Float(_) => true,
diff --git a/crates/ruff/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs b/crates/ruff/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs
index a245a15e4f..927716050f 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs
@@ -130,7 +130,10 @@ fn create_properties_from_fields_arg(fields: &Expr) -> Result> {
                 bail!("Expected `elts` to have exactly two elements")
             };
             let Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(property),
+                value:
+                    Constant::Str(ast::StringConstant {
+                        value: property, ..
+                    }),
                 ..
             }) = &field_name
             else {
diff --git a/crates/ruff/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs b/crates/ruff/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs
index e59f0b50e5..6312bcaa86 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs
@@ -147,7 +147,10 @@ fn properties_from_dict_literal(keys: &[Option], values: &[Expr]) -> Resul
         .zip(values.iter())
         .map(|(key, value)| match key {
             Some(Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(property),
+                value:
+                    Constant::Str(ast::StringConstant {
+                        value: property, ..
+                    }),
                 ..
             })) => {
                 if !is_identifier(property) {
diff --git a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs
index 31b918f100..61eea79e01 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs
@@ -38,8 +38,14 @@ impl FromStr for LiteralType {
 impl From for Constant {
     fn from(value: LiteralType) -> Self {
         match value {
-            LiteralType::Str => Constant::Str(String::new()),
-            LiteralType::Bytes => Constant::Bytes(vec![]),
+            LiteralType::Str => Constant::Str(ast::StringConstant {
+                value: String::new(),
+                implicit_concatenated: false,
+            }),
+            LiteralType::Bytes => Constant::Bytes(ast::BytesConstant {
+                value: Vec::new(),
+                implicit_concatenated: false,
+            }),
             LiteralType::Int => Constant::Int(BigInt::from(0)),
             LiteralType::Float => Constant::Float(0.0),
             LiteralType::Bool => Constant::Bool(false),
diff --git a/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs b/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs
index a170e20f05..68032f5b9f 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/printf_string_formatting.rs
@@ -202,7 +202,10 @@ fn clean_params_dictionary(
             match key {
                 Some(key) => {
                     if let Expr::Constant(ast::ExprConstant {
-                        value: Constant::Str(key_string),
+                        value:
+                            Constant::Str(ast::StringConstant {
+                                value: key_string, ..
+                            }),
                         ..
                     }) = key
                     {
diff --git a/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs b/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs
index cddf140161..0a99e7a3f7 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/redundant_open_modes.rs
@@ -73,11 +73,15 @@ pub(crate) fn redundant_open_modes(checker: &mut Checker, call: &ast::ExprCall)
             if !call.arguments.is_empty() {
                 if let Some(keyword) = call.arguments.find_keyword(MODE_KEYWORD_ARGUMENT) {
                     if let Expr::Constant(ast::ExprConstant {
-                        value: Constant::Str(mode_param_value),
+                        value:
+                            Constant::Str(ast::StringConstant {
+                                value: mode_param_value,
+                                ..
+                            }),
                         ..
                     }) = &keyword.value
                     {
-                        if let Ok(mode) = OpenMode::from_str(mode_param_value.as_str()) {
+                        if let Ok(mode) = OpenMode::from_str(mode_param_value) {
                             checker.diagnostics.push(create_check(
                                 call,
                                 &keyword.value,
@@ -97,7 +101,7 @@ pub(crate) fn redundant_open_modes(checker: &mut Checker, call: &ast::ExprCall)
                 ..
             }) = &mode_param
             {
-                if let Ok(mode) = OpenMode::from_str(value.as_str()) {
+                if let Ok(mode) = OpenMode::from_str(value) {
                     checker.diagnostics.push(create_check(
                         call,
                         mode_param,
diff --git a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
index ad2efa5ba5..53f56c5829 100644
--- a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
+++ b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
@@ -54,7 +54,7 @@ where
     F: (Fn(&str) -> bool) + Copy,
 {
     match expr {
-        Expr::FString(ast::ExprFString { values, range: _ }) => {
+        Expr::FString(ast::ExprFString { values, .. }) => {
             for value in values {
                 if any_string(value, predicate) {
                     return true;
@@ -62,10 +62,10 @@ where
             }
         }
         Expr::Constant(ast::ExprConstant {
-            value: Constant::Str(val),
+            value: Constant::Str(value),
             ..
         }) => {
-            if predicate(val.as_str()) {
+            if predicate(value) {
                 return true;
             }
         }
diff --git a/crates/ruff_python_ast/src/all.rs b/crates/ruff_python_ast/src/all.rs
index d5917661d6..3f738984b5 100644
--- a/crates/ruff_python_ast/src/all.rs
+++ b/crates/ruff_python_ast/src/all.rs
@@ -24,7 +24,7 @@ where
     fn add_to_names<'a>(elts: &'a [Expr], names: &mut Vec<&'a str>, flags: &mut DunderAllFlags) {
         for elt in elts {
             if let Expr::Constant(ast::ExprConstant {
-                value: Constant::Str(value),
+                value: Constant::Str(ast::StringConstant { value, .. }),
                 ..
             }) = elt
             {
diff --git a/crates/ruff_python_ast/src/comparable.rs b/crates/ruff_python_ast/src/comparable.rs
index 00a6ef87d2..f8dbdf2732 100644
--- a/crates/ruff_python_ast/src/comparable.rs
+++ b/crates/ruff_python_ast/src/comparable.rs
@@ -326,8 +326,18 @@ impl<'a> From<&'a ast::Constant> for ComparableConstant<'a> {
         match constant {
             ast::Constant::None => Self::None,
             ast::Constant::Bool(value) => Self::Bool(value),
-            ast::Constant::Str(value) => Self::Str(value),
-            ast::Constant::Bytes(value) => Self::Bytes(value),
+            ast::Constant::Str(ast::StringConstant {
+                value,
+                // Compare strings based on resolved value, not representation (i.e., ignore whether
+                // the string was implicitly concatenated).
+                implicit_concatenated: _,
+            }) => Self::Str(value),
+            ast::Constant::Bytes(ast::BytesConstant {
+                value,
+                // Compare bytes based on resolved value, not representation (i.e., ignore whether
+                // the bytes were implicitly concatenated).
+                implicit_concatenated: _,
+            }) => Self::Bytes(value),
             ast::Constant::Int(value) => Self::Int(value),
             ast::Constant::Float(value) => Self::Float(value.to_bits()),
             ast::Constant::Complex { real, imag } => Self::Complex {
@@ -865,11 +875,13 @@ impl<'a> From<&'a ast::Expr> for ComparableExpr<'a> {
                 debug_text: debug_text.as_ref(),
                 format_spec: format_spec.as_ref().map(Into::into),
             }),
-            ast::Expr::FString(ast::ExprFString { values, range: _ }) => {
-                Self::FString(ExprFString {
-                    values: values.iter().map(Into::into).collect(),
-                })
-            }
+            ast::Expr::FString(ast::ExprFString {
+                values,
+                implicit_concatenated: _,
+                range: _,
+            }) => Self::FString(ExprFString {
+                values: values.iter().map(Into::into).collect(),
+            }),
             ast::Expr::Constant(ast::ExprConstant {
                 value,
                 kind,
diff --git a/crates/ruff_python_ast/src/helpers.rs b/crates/ruff_python_ast/src/helpers.rs
index 5af9a38dcb..2f43d3da1c 100644
--- a/crates/ruff_python_ast/src/helpers.rs
+++ b/crates/ruff_python_ast/src/helpers.rs
@@ -123,10 +123,8 @@ where
         return true;
     }
     match expr {
-        Expr::BoolOp(ast::ExprBoolOp {
-            values, range: _, ..
-        })
-        | Expr::FString(ast::ExprFString { values, range: _ }) => {
+        Expr::BoolOp(ast::ExprBoolOp { values, .. })
+        | Expr::FString(ast::ExprFString { values, .. }) => {
             values.iter().any(|expr| any_over_expr(expr, func))
         }
         Expr::NamedExpr(ast::ExprNamedExpr {
@@ -1087,25 +1085,26 @@ impl Truthiness {
             Expr::Constant(ast::ExprConstant { value, .. }) => match value {
                 Constant::Bool(value) => Some(*value),
                 Constant::None => Some(false),
-                Constant::Str(string) => Some(!string.is_empty()),
+                Constant::Str(ast::StringConstant { value, .. }) => Some(!value.is_empty()),
                 Constant::Bytes(bytes) => Some(!bytes.is_empty()),
                 Constant::Int(int) => Some(!int.is_zero()),
                 Constant::Float(float) => Some(*float != 0.0),
                 Constant::Complex { real, imag } => Some(*real != 0.0 || *imag != 0.0),
                 Constant::Ellipsis => Some(true),
             },
-            Expr::FString(ast::ExprFString { values, range: _ }) => {
+            Expr::FString(ast::ExprFString { values, .. }) => {
                 if values.is_empty() {
                     Some(false)
                 } else if values.iter().any(|value| {
-                    let Expr::Constant(ast::ExprConstant {
-                        value: Constant::Str(string),
+                    if let Expr::Constant(ast::ExprConstant {
+                        value: Constant::Str(ast::StringConstant { value, .. }),
                         ..
                     }) = &value
-                    else {
-                        return false;
-                    };
-                    !string.is_empty()
+                    {
+                        !value.is_empty()
+                    } else {
+                        false
+                    }
                 }) {
                     Some(true)
                 } else {
diff --git a/crates/ruff_python_ast/src/node.rs b/crates/ruff_python_ast/src/node.rs
index 4f6798d07e..d24d431833 100644
--- a/crates/ruff_python_ast/src/node.rs
+++ b/crates/ruff_python_ast/src/node.rs
@@ -2676,7 +2676,11 @@ impl AstNode for ast::ExprFString {
     where
         V: PreorderVisitor<'a> + ?Sized,
     {
-        let ast::ExprFString { values, range: _ } = self;
+        let ast::ExprFString {
+            values,
+            implicit_concatenated: _,
+            range: _,
+        } = self;
 
         for expr in values {
             visitor.visit_expr(expr);
diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs
index 5011ba76d9..331968c47e 100644
--- a/crates/ruff_python_ast/src/nodes.rs
+++ b/crates/ruff_python_ast/src/nodes.rs
@@ -881,6 +881,8 @@ pub struct DebugText {
 pub struct ExprFString {
     pub range: TextRange,
     pub values: Vec,
+    /// Whether the f-string contains multiple string tokens that were implicitly concatenated.
+    pub implicit_concatenated: bool,
 }
 
 impl From for Expr {
@@ -2463,8 +2465,8 @@ impl std::cmp::PartialEq for Int {
 pub enum Constant {
     None,
     Bool(bool),
-    Str(String),
-    Bytes(Vec),
+    Str(StringConstant),
+    Bytes(BytesConstant),
     Int(BigInt),
     Float(f64),
     Complex { real: f64, imag: f64 },
@@ -2472,38 +2474,68 @@ pub enum Constant {
 }
 
 impl Constant {
-    pub fn is_true(self) -> bool {
-        self.bool().is_some_and(|b| b)
-    }
-    pub fn is_false(self) -> bool {
-        self.bool().is_some_and(|b| !b)
-    }
-    pub fn complex(self) -> Option<(f64, f64)> {
+    /// Returns `true` if the constant is a string or bytes constant that contains multiple,
+    /// implicitly concatenated string tokens.
+    pub fn is_implicit_concatenated(&self) -> bool {
         match self {
-            Constant::Complex { real, imag } => Some((real, imag)),
-            _ => None,
+            Constant::Str(value) => value.implicit_concatenated,
+            Constant::Bytes(value) => value.implicit_concatenated,
+            _ => false,
         }
     }
 }
 
-impl From for Constant {
-    fn from(s: String) -> Constant {
-        Self::Str(s)
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct StringConstant {
+    /// The string value as resolved by the parser (i.e., without quotes, or escape sequences, or
+    /// implicit concatenations).
+    pub value: String,
+    /// Whether the string contains multiple string tokens that were implicitly concatenated.
+    pub implicit_concatenated: bool,
+}
+
+impl Deref for StringConstant {
+    type Target = str;
+    fn deref(&self) -> &Self::Target {
+        self.value.as_str()
     }
 }
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct BytesConstant {
+    /// The bytes value as resolved by the parser (i.e., without quotes, or escape sequences, or
+    /// implicit concatenations).
+    pub value: Vec,
+    /// Whether the string contains multiple string tokens that were implicitly concatenated.
+    pub implicit_concatenated: bool,
+}
+
+impl Deref for BytesConstant {
+    type Target = [u8];
+    fn deref(&self) -> &Self::Target {
+        self.value.as_slice()
+    }
+}
+
 impl From> for Constant {
-    fn from(b: Vec) -> Constant {
-        Self::Bytes(b)
+    fn from(value: Vec) -> Constant {
+        Self::Bytes(BytesConstant {
+            value,
+            implicit_concatenated: false,
+        })
+    }
+}
+impl From for Constant {
+    fn from(value: String) -> Constant {
+        Self::Str(StringConstant {
+            value,
+            implicit_concatenated: false,
+        })
     }
 }
 impl From for Constant {
-    fn from(b: bool) -> Constant {
-        Self::Bool(b)
-    }
-}
-impl From for Constant {
-    fn from(i: BigInt) -> Constant {
-        Self::Int(i)
+    fn from(value: bool) -> Constant {
+        Self::Bool(value)
     }
 }
 
@@ -3056,7 +3088,7 @@ mod size_assertions {
     assert_eq_size!(StmtClassDef, [u8; 104]);
     assert_eq_size!(StmtTry, [u8; 104]);
     assert_eq_size!(Expr, [u8; 80]);
-    assert_eq_size!(Constant, [u8; 32]);
+    assert_eq_size!(Constant, [u8; 40]);
     assert_eq_size!(Pattern, [u8; 96]);
     assert_eq_size!(Mod, [u8; 32]);
 }
diff --git a/crates/ruff_python_ast/src/relocate.rs b/crates/ruff_python_ast/src/relocate.rs
index 292101e664..122cdbc259 100644
--- a/crates/ruff_python_ast/src/relocate.rs
+++ b/crates/ruff_python_ast/src/relocate.rs
@@ -140,7 +140,7 @@ pub fn relocate_expr(expr: &mut Expr, location: TextRange) {
                 relocate_expr(expr, location);
             }
         }
-        Expr::FString(nodes::ExprFString { values, range }) => {
+        Expr::FString(nodes::ExprFString { values, range, .. }) => {
             *range = location;
             for expr in values {
                 relocate_expr(expr, location);
diff --git a/crates/ruff_python_ast/src/visitor.rs b/crates/ruff_python_ast/src/visitor.rs
index ffe005e50c..d9c9eff67c 100644
--- a/crates/ruff_python_ast/src/visitor.rs
+++ b/crates/ruff_python_ast/src/visitor.rs
@@ -476,7 +476,7 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) {
                 visitor.visit_format_spec(expr);
             }
         }
-        Expr::FString(ast::ExprFString { values, range: _ }) => {
+        Expr::FString(ast::ExprFString { values, .. }) => {
             for expr in values {
                 visitor.visit_expr(expr);
             }
diff --git a/crates/ruff_python_codegen/src/generator.rs b/crates/ruff_python_codegen/src/generator.rs
index 65a1280272..9af88721bd 100644
--- a/crates/ruff_python_codegen/src/generator.rs
+++ b/crates/ruff_python_codegen/src/generator.rs
@@ -1104,7 +1104,7 @@ impl<'a> Generator<'a> {
                 *conversion,
                 format_spec.as_deref(),
             ),
-            Expr::FString(ast::ExprFString { values, range: _ }) => {
+            Expr::FString(ast::ExprFString { values, .. }) => {
                 self.unparse_f_string(values, false);
             }
             Expr::Constant(ast::ExprConstant {
@@ -1197,8 +1197,8 @@ impl<'a> Generator<'a> {
             Constant::Bytes(b) => {
                 self.p_bytes_repr(b);
             }
-            Constant::Str(s) => {
-                self.p_str_repr(s);
+            Constant::Str(ast::StringConstant { value, .. }) => {
+                self.p_str_repr(value);
             }
             Constant::None => self.p("None"),
             Constant::Bool(b) => self.p(if *b { "True" } else { "False" }),
@@ -1339,13 +1339,13 @@ impl<'a> Generator<'a> {
     fn unparse_f_string_elem(&mut self, expr: &Expr, is_spec: bool) {
         match expr {
             Expr::Constant(ast::ExprConstant { value, .. }) => {
-                if let Constant::Str(s) = value {
-                    self.unparse_f_string_literal(s);
+                if let Constant::Str(ast::StringConstant { value, .. }) = value {
+                    self.unparse_f_string_literal(value);
                 } else {
                     unreachable!()
                 }
             }
-            Expr::FString(ast::ExprFString { values, range: _ }) => {
+            Expr::FString(ast::ExprFString { values, .. }) => {
                 self.unparse_f_string(values, is_spec);
             }
             Expr::FormattedValue(ast::ExprFormattedValue {
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__dict_unpacking.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__dict_unpacking.snap
index 6d54f4db9e..ff72ab9daf 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__dict_unpacking.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__dict_unpacking.snap
@@ -11,7 +11,10 @@ Dict(
                     ExprConstant {
                         range: 1..4,
                         value: Str(
-                            "a",
+                            StringConstant {
+                                value: "a",
+                                implicit_concatenated: false,
+                            },
                         ),
                         kind: None,
                     },
@@ -23,7 +26,10 @@ Dict(
                     ExprConstant {
                         range: 16..19,
                         value: Str(
-                            "d",
+                            StringConstant {
+                                value: "d",
+                                implicit_concatenated: false,
+                            },
                         ),
                         kind: None,
                     },
@@ -35,7 +41,10 @@ Dict(
                 ExprConstant {
                     range: 6..9,
                     value: Str(
-                        "b",
+                        StringConstant {
+                            value: "b",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
@@ -51,7 +60,10 @@ Dict(
                 ExprConstant {
                     range: 21..24,
                     value: Str(
-                        "e",
+                        StringConstant {
+                            value: "e",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__generator_expression_argument.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__generator_expression_argument.snap
index 9f5db3c598..4617a2a863 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__generator_expression_argument.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__generator_expression_argument.snap
@@ -12,7 +12,10 @@ Call(
                     ExprConstant {
                         range: 0..3,
                         value: Str(
-                            " ",
+                            StringConstant {
+                                value: " ",
+                                implicit_concatenated: false,
+                            },
                         ),
                         kind: None,
                     },
@@ -68,7 +71,10 @@ Call(
                                                                 ExprConstant {
                                                                     range: 43..53,
                                                                     value: Str(
-                                                                        "LIMIT %d",
+                                                                        StringConstant {
+                                                                            value: "LIMIT %d",
+                                                                            implicit_concatenated: false,
+                                                                        },
                                                                     ),
                                                                     kind: None,
                                                                 },
@@ -109,7 +115,10 @@ Call(
                                                                 ExprConstant {
                                                                     range: 91..102,
                                                                     value: Str(
-                                                                        "OFFSET %d",
+                                                                        StringConstant {
+                                                                            value: "OFFSET %d",
+                                                                            implicit_concatenated: false,
+                                                                        },
                                                                     ),
                                                                     kind: None,
                                                                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__match.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__match.snap
index 69099b2bc2..c862d1c1da 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__match.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__match.snap
@@ -15,7 +15,10 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 8..14,
                                     value: Str(
-                                        "test",
+                                        StringConstant {
+                                            value: "test",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
@@ -100,7 +103,10 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 81..88,
                                     value: Str(
-                                        "label",
+                                        StringConstant {
+                                            value: "label",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
@@ -112,7 +118,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 90..96,
                                 value: Str(
-                                    "test",
+                                    StringConstant {
+                                        value: "test",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -131,7 +140,10 @@ expression: parse_ast
                                     ExprConstant {
                                         range: 118..125,
                                         value: Str(
-                                            "label",
+                                            StringConstant {
+                                                value: "label",
+                                                implicit_concatenated: false,
+                                            },
                                         ),
                                         kind: None,
                                     },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap
index 601df87ff8..e567e1d4e4 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_class.snap
@@ -117,7 +117,10 @@ expression: "parse_suite(source, \"\").unwrap()"
                                             ExprConstant {
                                                 range: 80..89,
                                                 value: Str(
-                                                    "default",
+                                                    StringConstant {
+                                                        value: "default",
+                                                        implicit_concatenated: false,
+                                                    },
                                                 ),
                                                 kind: None,
                                             },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap
index 939230b0bd..f65e153bea 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_f_string.snap
@@ -14,12 +14,16 @@ expression: parse_ast
                             ExprConstant {
                                 range: 2..13,
                                 value: Str(
-                                    "Hello world",
+                                    StringConstant {
+                                        value: "Hello world",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_kwargs.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_kwargs.snap
index b9ff2b631a..dbf2ae2258 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_kwargs.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_kwargs.snap
@@ -23,7 +23,10 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 8..20,
                                     value: Str(
-                                        "positional",
+                                        StringConstant {
+                                            value: "positional",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_2.snap
index 57fec3fd7b..583746f9dd 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_2.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_2.snap
@@ -23,7 +23,10 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 6..19,
                                     value: Str(
-                                        "Hello world",
+                                        StringConstant {
+                                            value: "Hello world",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_hello.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_hello.snap
index f78c89031c..fab7de1e6a 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_hello.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_print_hello.snap
@@ -23,7 +23,10 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 6..19,
                                     value: Str(
-                                        "Hello world",
+                                        StringConstant {
+                                            value: "Hello world",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_string.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_string.snap
index 21c12fb897..301501a7d9 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_string.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_string.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..13,
                     value: Str(
-                        "Hello world",
+                        StringConstant {
+                            value: "Hello world",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_type_declaration.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_type_declaration.snap
index d2763aee2e..2186cc9152 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_type_declaration.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__parse_type_declaration.snap
@@ -82,7 +82,10 @@ expression: "parse_suite(source, \"\").unwrap()"
                         ExprConstant {
                             range: 48..61,
                             value: Str(
-                                "ForwardRefY",
+                                StringConstant {
+                                    value: "ForwardRefY",
+                                    implicit_concatenated: false,
+                                },
                             ),
                             kind: None,
                         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__patma.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__patma.snap
index 0951751f81..a29d01b17a 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__patma.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__patma.snap
@@ -522,7 +522,10 @@ expression: parse_ast
                                         ExprConstant {
                                             range: 484..489,
                                             value: Str(
-                                                "seq",
+                                                StringConstant {
+                                                    value: "seq",
+                                                    implicit_concatenated: false,
+                                                },
                                             ),
                                             kind: None,
                                         },
@@ -552,7 +555,10 @@ expression: parse_ast
                                         ExprConstant {
                                             range: 518..523,
                                             value: Str(
-                                                "map",
+                                                StringConstant {
+                                                    value: "map",
+                                                    implicit_concatenated: false,
+                                                },
                                             ),
                                             kind: None,
                                         },
@@ -857,7 +863,10 @@ expression: parse_ast
                                             ExprConstant {
                                                 range: 664..667,
                                                 value: Str(
-                                                    "X",
+                                                    StringConstant {
+                                                        value: "X",
+                                                        implicit_concatenated: false,
+                                                    },
                                                 ),
                                                 kind: None,
                                             },
@@ -1617,7 +1626,10 @@ expression: parse_ast
                                     ExprConstant {
                                         range: 1287..1292,
                                         value: Str(
-                                            "foo",
+                                            StringConstant {
+                                                value: "foo",
+                                                implicit_concatenated: false,
+                                            },
                                         ),
                                         kind: None,
                                     },
@@ -2565,7 +2577,10 @@ expression: parse_ast
                                             ExprConstant {
                                                 range: 2036..2038,
                                                 value: Str(
-                                                    "",
+                                                    StringConstant {
+                                                        value: "",
+                                                        implicit_concatenated: false,
+                                                    },
                                                 ),
                                                 kind: None,
                                             },
@@ -2611,7 +2626,10 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 2064..2066,
                                     value: Str(
-                                        "",
+                                        StringConstant {
+                                            value: "",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
@@ -3251,7 +3269,10 @@ expression: parse_ast
                                             ExprConstant {
                                                 range: 2449..2452,
                                                 value: Str(
-                                                    "X",
+                                                    StringConstant {
+                                                        value: "X",
+                                                        implicit_concatenated: false,
+                                                    },
                                                 ),
                                                 kind: None,
                                             },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap
index 7d4e1e0186..78942ef266 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap
@@ -87,7 +87,10 @@ expression: parse_ast
                                                                     ExprConstant {
                                                                         range: 64..71,
                                                                         value: Str(
-                                                                            "caught ",
+                                                                            StringConstant {
+                                                                                value: "caught ",
+                                                                                implicit_concatenated: false,
+                                                                            },
                                                                         ),
                                                                         kind: None,
                                                                     },
@@ -126,6 +129,7 @@ expression: parse_ast
                                                                     },
                                                                 ),
                                                             ],
+                                                            implicit_concatenated: false,
                                                         },
                                                     ),
                                                 ],
@@ -181,7 +185,10 @@ expression: parse_ast
                                                                     ExprConstant {
                                                                         range: 116..123,
                                                                         value: Str(
-                                                                            "caught ",
+                                                                            StringConstant {
+                                                                                value: "caught ",
+                                                                                implicit_concatenated: false,
+                                                                            },
                                                                         ),
                                                                         kind: None,
                                                                     },
@@ -220,6 +227,7 @@ expression: parse_ast
                                                                     },
                                                                 ),
                                                             ],
+                                                            implicit_concatenated: false,
                                                         },
                                                     ),
                                                 ],
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap
index 089d473452..1f8294f3b2 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap
@@ -28,7 +28,10 @@ expression: parse_ast
                                                 ExprConstant {
                                                     range: 30..34,
                                                     value: Str(
-                                                        "eg",
+                                                        StringConstant {
+                                                            value: "eg",
+                                                            implicit_concatenated: false,
+                                                        },
                                                     ),
                                                     kind: None,
                                                 },
@@ -203,7 +206,10 @@ expression: parse_ast
                                                                     ExprConstant {
                                                                         range: 135..142,
                                                                         value: Str(
-                                                                            "caught ",
+                                                                            StringConstant {
+                                                                                value: "caught ",
+                                                                                implicit_concatenated: false,
+                                                                            },
                                                                         ),
                                                                         kind: None,
                                                                     },
@@ -245,7 +251,10 @@ expression: parse_ast
                                                                     ExprConstant {
                                                                         range: 151..164,
                                                                         value: Str(
-                                                                            " with nested ",
+                                                                            StringConstant {
+                                                                                value: " with nested ",
+                                                                                implicit_concatenated: false,
+                                                                            },
                                                                         ),
                                                                         kind: None,
                                                                     },
@@ -276,6 +285,7 @@ expression: parse_ast
                                                                     },
                                                                 ),
                                                             ],
+                                                            implicit_concatenated: false,
                                                         },
                                                     ),
                                                 ],
@@ -331,7 +341,10 @@ expression: parse_ast
                                                                     ExprConstant {
                                                                         range: 215..222,
                                                                         value: Str(
-                                                                            "caught ",
+                                                                            StringConstant {
+                                                                                value: "caught ",
+                                                                                implicit_concatenated: false,
+                                                                            },
                                                                         ),
                                                                         kind: None,
                                                                     },
@@ -373,7 +386,10 @@ expression: parse_ast
                                                                     ExprConstant {
                                                                         range: 231..244,
                                                                         value: Str(
-                                                                            " with nested ",
+                                                                            StringConstant {
+                                                                                value: " with nested ",
+                                                                                implicit_concatenated: false,
+                                                                            },
                                                                         ),
                                                                         kind: None,
                                                                     },
@@ -404,6 +420,7 @@ expression: parse_ast
                                                                     },
                                                                 ),
                                                             ],
+                                                            implicit_concatenated: false,
                                                         },
                                                     ),
                                                 ],
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__backspace_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__backspace_alias.snap
index 11ee52f9fc..1d1aef73a6 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__backspace_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__backspace_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..15,
                     value: Str(
-                        "\u{8}",
+                        StringConstant {
+                            value: "\u{8}",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__bell_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__bell_alias.snap
index 3d40adcad1..5c4b9fda0f 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__bell_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__bell_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..9,
                     value: Str(
-                        "\u{7}",
+                        StringConstant {
+                            value: "\u{7}",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__carriage_return_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__carriage_return_alias.snap
index 6b57141008..f16ca7fce6 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__carriage_return_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__carriage_return_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..21,
                     value: Str(
-                        "\r",
+                        StringConstant {
+                            value: "\r",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__character_tabulation_with_justification_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__character_tabulation_with_justification_alias.snap
index b172239e13..ba1969efc4 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__character_tabulation_with_justification_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__character_tabulation_with_justification_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..45,
                     value: Str(
-                        "\u{89}",
+                        StringConstant {
+                            value: "\u{89}",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__delete_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__delete_alias.snap
index 9bd9b1231d..4c9ef1738a 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__delete_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__delete_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..12,
                     value: Str(
-                        "\u{7f}",
+                        StringConstant {
+                            value: "\u{7f}",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__double_quoted_byte.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__double_quoted_byte.snap
index 1b6f47e27a..7ec79b41ff 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__double_quoted_byte.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__double_quoted_byte.snap
@@ -10,264 +10,267 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..738,
                     value: Bytes(
-                        [
-                            0,
-                            1,
-                            2,
-                            3,
-                            4,
-                            5,
-                            6,
-                            7,
-                            8,
-                            9,
-                            10,
-                            11,
-                            12,
-                            13,
-                            14,
-                            15,
-                            16,
-                            17,
-                            18,
-                            19,
-                            20,
-                            21,
-                            22,
-                            23,
-                            24,
-                            25,
-                            26,
-                            27,
-                            28,
-                            29,
-                            30,
-                            31,
-                            32,
-                            33,
-                            34,
-                            35,
-                            36,
-                            37,
-                            38,
-                            39,
-                            40,
-                            41,
-                            42,
-                            43,
-                            44,
-                            45,
-                            46,
-                            47,
-                            48,
-                            49,
-                            50,
-                            51,
-                            52,
-                            53,
-                            54,
-                            55,
-                            56,
-                            57,
-                            58,
-                            59,
-                            60,
-                            61,
-                            62,
-                            63,
-                            64,
-                            65,
-                            66,
-                            67,
-                            68,
-                            69,
-                            70,
-                            71,
-                            72,
-                            73,
-                            74,
-                            75,
-                            76,
-                            77,
-                            78,
-                            79,
-                            80,
-                            81,
-                            82,
-                            83,
-                            84,
-                            85,
-                            86,
-                            87,
-                            88,
-                            89,
-                            90,
-                            91,
-                            92,
-                            93,
-                            94,
-                            95,
-                            96,
-                            97,
-                            98,
-                            99,
-                            100,
-                            101,
-                            102,
-                            103,
-                            104,
-                            105,
-                            106,
-                            107,
-                            108,
-                            109,
-                            110,
-                            111,
-                            112,
-                            113,
-                            114,
-                            115,
-                            116,
-                            117,
-                            118,
-                            119,
-                            120,
-                            121,
-                            122,
-                            123,
-                            124,
-                            125,
-                            126,
-                            127,
-                            128,
-                            129,
-                            130,
-                            131,
-                            132,
-                            133,
-                            134,
-                            135,
-                            136,
-                            137,
-                            138,
-                            139,
-                            140,
-                            141,
-                            142,
-                            143,
-                            144,
-                            145,
-                            146,
-                            147,
-                            148,
-                            149,
-                            150,
-                            151,
-                            152,
-                            153,
-                            154,
-                            155,
-                            156,
-                            157,
-                            158,
-                            159,
-                            160,
-                            161,
-                            162,
-                            163,
-                            164,
-                            165,
-                            166,
-                            167,
-                            168,
-                            169,
-                            170,
-                            171,
-                            172,
-                            173,
-                            174,
-                            175,
-                            176,
-                            177,
-                            178,
-                            179,
-                            180,
-                            181,
-                            182,
-                            183,
-                            184,
-                            185,
-                            186,
-                            187,
-                            188,
-                            189,
-                            190,
-                            191,
-                            192,
-                            193,
-                            194,
-                            195,
-                            196,
-                            197,
-                            198,
-                            199,
-                            200,
-                            201,
-                            202,
-                            203,
-                            204,
-                            205,
-                            206,
-                            207,
-                            208,
-                            209,
-                            210,
-                            211,
-                            212,
-                            213,
-                            214,
-                            215,
-                            216,
-                            217,
-                            218,
-                            219,
-                            220,
-                            221,
-                            222,
-                            223,
-                            224,
-                            225,
-                            226,
-                            227,
-                            228,
-                            229,
-                            230,
-                            231,
-                            232,
-                            233,
-                            234,
-                            235,
-                            236,
-                            237,
-                            238,
-                            239,
-                            240,
-                            241,
-                            242,
-                            243,
-                            244,
-                            245,
-                            246,
-                            247,
-                            248,
-                            249,
-                            250,
-                            251,
-                            252,
-                            253,
-                            254,
-                            255,
-                        ],
+                        BytesConstant {
+                            value: [
+                                0,
+                                1,
+                                2,
+                                3,
+                                4,
+                                5,
+                                6,
+                                7,
+                                8,
+                                9,
+                                10,
+                                11,
+                                12,
+                                13,
+                                14,
+                                15,
+                                16,
+                                17,
+                                18,
+                                19,
+                                20,
+                                21,
+                                22,
+                                23,
+                                24,
+                                25,
+                                26,
+                                27,
+                                28,
+                                29,
+                                30,
+                                31,
+                                32,
+                                33,
+                                34,
+                                35,
+                                36,
+                                37,
+                                38,
+                                39,
+                                40,
+                                41,
+                                42,
+                                43,
+                                44,
+                                45,
+                                46,
+                                47,
+                                48,
+                                49,
+                                50,
+                                51,
+                                52,
+                                53,
+                                54,
+                                55,
+                                56,
+                                57,
+                                58,
+                                59,
+                                60,
+                                61,
+                                62,
+                                63,
+                                64,
+                                65,
+                                66,
+                                67,
+                                68,
+                                69,
+                                70,
+                                71,
+                                72,
+                                73,
+                                74,
+                                75,
+                                76,
+                                77,
+                                78,
+                                79,
+                                80,
+                                81,
+                                82,
+                                83,
+                                84,
+                                85,
+                                86,
+                                87,
+                                88,
+                                89,
+                                90,
+                                91,
+                                92,
+                                93,
+                                94,
+                                95,
+                                96,
+                                97,
+                                98,
+                                99,
+                                100,
+                                101,
+                                102,
+                                103,
+                                104,
+                                105,
+                                106,
+                                107,
+                                108,
+                                109,
+                                110,
+                                111,
+                                112,
+                                113,
+                                114,
+                                115,
+                                116,
+                                117,
+                                118,
+                                119,
+                                120,
+                                121,
+                                122,
+                                123,
+                                124,
+                                125,
+                                126,
+                                127,
+                                128,
+                                129,
+                                130,
+                                131,
+                                132,
+                                133,
+                                134,
+                                135,
+                                136,
+                                137,
+                                138,
+                                139,
+                                140,
+                                141,
+                                142,
+                                143,
+                                144,
+                                145,
+                                146,
+                                147,
+                                148,
+                                149,
+                                150,
+                                151,
+                                152,
+                                153,
+                                154,
+                                155,
+                                156,
+                                157,
+                                158,
+                                159,
+                                160,
+                                161,
+                                162,
+                                163,
+                                164,
+                                165,
+                                166,
+                                167,
+                                168,
+                                169,
+                                170,
+                                171,
+                                172,
+                                173,
+                                174,
+                                175,
+                                176,
+                                177,
+                                178,
+                                179,
+                                180,
+                                181,
+                                182,
+                                183,
+                                184,
+                                185,
+                                186,
+                                187,
+                                188,
+                                189,
+                                190,
+                                191,
+                                192,
+                                193,
+                                194,
+                                195,
+                                196,
+                                197,
+                                198,
+                                199,
+                                200,
+                                201,
+                                202,
+                                203,
+                                204,
+                                205,
+                                206,
+                                207,
+                                208,
+                                209,
+                                210,
+                                211,
+                                212,
+                                213,
+                                214,
+                                215,
+                                216,
+                                217,
+                                218,
+                                219,
+                                220,
+                                221,
+                                222,
+                                223,
+                                224,
+                                225,
+                                226,
+                                227,
+                                228,
+                                229,
+                                230,
+                                231,
+                                232,
+                                233,
+                                234,
+                                235,
+                                236,
+                                237,
+                                238,
+                                239,
+                                240,
+                                241,
+                                242,
+                                243,
+                                244,
+                                245,
+                                246,
+                                247,
+                                248,
+                                249,
+                                250,
+                                251,
+                                252,
+                                253,
+                                254,
+                                255,
+                            ],
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_alias.snap
index 83ac74c136..7777636fcc 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..12,
                     value: Str(
-                        "\u{1b}",
+                        StringConstant {
+                            value: "\u{1b}",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_char_in_byte_literal.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_char_in_byte_literal.snap
index c0da7019e9..85a4d7705d 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_char_in_byte_literal.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_char_in_byte_literal.snap
@@ -10,18 +10,21 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..13,
                     value: Bytes(
-                        [
-                            111,
-                            109,
-                            107,
-                            109,
-                            111,
-                            107,
-                            92,
-                            88,
-                            97,
-                            97,
-                        ],
+                        BytesConstant {
+                            value: [
+                                111,
+                                109,
+                                107,
+                                109,
+                                111,
+                                107,
+                                92,
+                                88,
+                                97,
+                                97,
+                            ],
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_octet.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_octet.snap
index 856ca44647..fc484d7a07 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_octet.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__escape_octet.snap
@@ -10,13 +10,16 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..14,
                     value: Bytes(
-                        [
-                            35,
-                            97,
-                            4,
-                            83,
-                            52,
-                        ],
+                        BytesConstant {
+                            value: [
+                                35,
+                                97,
+                                4,
+                                83,
+                                52,
+                            ],
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__form_feed_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__form_feed_alias.snap
index 4773e4f2d3..2ec6f9f544 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__form_feed_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__form_feed_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..15,
                     value: Str(
-                        "\u{c}",
+                        StringConstant {
+                            value: "\u{c}",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap
index 942f50d6e8..6b4a1a92c8 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_constant_range.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 2..5,
                                 value: Str(
-                                    "aaa",
+                                    StringConstant {
+                                        value: "aaa",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -38,7 +41,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 10..13,
                                 value: Str(
-                                    "ccc",
+                                    StringConstant {
+                                        value: "ccc",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -62,12 +68,16 @@ expression: parse_ast
                             ExprConstant {
                                 range: 18..21,
                                 value: Str(
-                                    "eee",
+                                    StringConstant {
+                                        value: "eee",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap
index fbaabcce46..d96a1cef58 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_character.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 2..4,
                                 value: Str(
-                                    "\\",
+                                    StringConstant {
+                                        value: "\\",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -35,6 +38,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap
index 4264a83d77..fe3c6d028e 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_escaped_newline.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 2..4,
                                 value: Str(
-                                    "\n",
+                                    StringConstant {
+                                        value: "\n",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -35,6 +38,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap
index b88ac0d2e9..35cff59a24 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_line_continuation.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 3..5,
                                 value: Str(
-                                    "\\\n",
+                                    StringConstant {
+                                        value: "\\\n",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -35,6 +38,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_base_more.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_base_more.snap
index dda8ce1dce..655b3cc3d8 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_base_more.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_base_more.snap
@@ -7,7 +7,10 @@ expression: parse_ast
         ExprConstant {
             range: 2..6,
             value: Str(
-                "mix ",
+                StringConstant {
+                    value: "mix ",
+                    implicit_concatenated: false,
+                },
             ),
             kind: None,
         },
@@ -36,7 +39,10 @@ expression: parse_ast
         ExprConstant {
             range: 13..28,
             value: Str(
-                " with text and ",
+                StringConstant {
+                    value: " with text and ",
+                    implicit_concatenated: false,
+                },
             ),
             kind: None,
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap
index 2327df5fcb..22b250a8ce 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_parse_self_documenting_format.snap
@@ -29,12 +29,16 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 9..12,
                                     value: Str(
-                                        ">10",
+                                        StringConstant {
+                                            value: ">10",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
                             ),
                         ],
+                        implicit_concatenated: false,
                     },
                 ),
             ),
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap
index dccc5db5fc..0b711c8cc9 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__fstring_unescaped_newline.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 4..5,
                                 value: Str(
-                                    "\n",
+                                    StringConstant {
+                                        value: "\n",
+                                        implicit_concatenated: false,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -35,6 +38,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__hts_alias.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__hts_alias.snap
index 3d25aecfae..8017bb4b35 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__hts_alias.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__hts_alias.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..9,
                     value: Str(
-                        "\u{88}",
+                        StringConstant {
+                            value: "\u{88}",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap
index dada3b5a60..8680272f60 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_1.snap
@@ -14,12 +14,16 @@ expression: parse_ast
                             ExprConstant {
                                 range: 1..16,
                                 value: Str(
-                                    "Hello world",
+                                    StringConstant {
+                                        value: "Hello world",
+                                        implicit_concatenated: true,
+                                    },
                                 ),
                                 kind: None,
                             },
                         ),
                     ],
+                    implicit_concatenated: true,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap
index dada3b5a60..8680272f60 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_2.snap
@@ -14,12 +14,16 @@ expression: parse_ast
                             ExprConstant {
                                 range: 1..16,
                                 value: Str(
-                                    "Hello world",
+                                    StringConstant {
+                                        value: "Hello world",
+                                        implicit_concatenated: true,
+                                    },
                                 ),
                                 kind: None,
                             },
                         ),
                     ],
+                    implicit_concatenated: true,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap
index a955540697..2c5e80aad5 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_3.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 1..16,
                                 value: Str(
-                                    "Hello world",
+                                    StringConstant {
+                                        value: "Hello world",
+                                        implicit_concatenated: true,
+                                    },
                                 ),
                                 kind: None,
                             },
@@ -26,7 +29,10 @@ expression: parse_ast
                                     ExprConstant {
                                         range: 17..20,
                                         value: Str(
-                                            "!",
+                                            StringConstant {
+                                                value: "!",
+                                                implicit_concatenated: false,
+                                            },
                                         ),
                                         kind: None,
                                     },
@@ -37,6 +43,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: true,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_4.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_4.snap
new file mode 100644
index 0000000000..19e8b7ae04
--- /dev/null
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_string_concat_4.snap
@@ -0,0 +1,63 @@
+---
+source: crates/ruff_python_parser/src/string.rs
+expression: parse_ast
+---
+[
+    Expr(
+        StmtExpr {
+            range: 0..31,
+            value: FString(
+                ExprFString {
+                    range: 0..31,
+                    values: [
+                        Constant(
+                            ExprConstant {
+                                range: 1..16,
+                                value: Str(
+                                    StringConstant {
+                                        value: "Hello world",
+                                        implicit_concatenated: true,
+                                    },
+                                ),
+                                kind: None,
+                            },
+                        ),
+                        FormattedValue(
+                            ExprFormattedValue {
+                                range: 16..21,
+                                value: Constant(
+                                    ExprConstant {
+                                        range: 17..20,
+                                        value: Str(
+                                            StringConstant {
+                                                value: "!",
+                                                implicit_concatenated: false,
+                                            },
+                                        ),
+                                        kind: None,
+                                    },
+                                ),
+                                debug_text: None,
+                                conversion: None,
+                                format_spec: None,
+                            },
+                        ),
+                        Constant(
+                            ExprConstant {
+                                range: 24..30,
+                                value: Str(
+                                    StringConstant {
+                                        value: "again!",
+                                        implicit_concatenated: true,
+                                    },
+                                ),
+                                kind: None,
+                            },
+                        ),
+                    ],
+                    implicit_concatenated: true,
+                },
+            ),
+        },
+    ),
+]
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring.snap
index 12a39ccb92..282eb79f97 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring.snap
@@ -37,7 +37,10 @@ expression: parse_ast
         ExprConstant {
             range: 10..17,
             value: Str(
-                "{foo}",
+                StringConstant {
+                    value: "{foo}",
+                    implicit_concatenated: false,
+                },
             ),
             kind: None,
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_concatenation_string_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_concatenation_string_spec.snap
new file mode 100644
index 0000000000..97525a5e10
--- /dev/null
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_concatenation_string_spec.snap
@@ -0,0 +1,50 @@
+---
+source: crates/ruff_python_parser/src/string.rs
+expression: parse_ast
+---
+[
+    FormattedValue(
+        ExprFormattedValue {
+            range: 2..15,
+            value: Name(
+                ExprName {
+                    range: 3..6,
+                    id: "foo",
+                    ctx: Load,
+                },
+            ),
+            debug_text: None,
+            conversion: None,
+            format_spec: Some(
+                FString(
+                    ExprFString {
+                        range: 7..14,
+                        values: [
+                            FormattedValue(
+                                ExprFormattedValue {
+                                    range: 7..14,
+                                    value: Constant(
+                                        ExprConstant {
+                                            range: 8..13,
+                                            value: Str(
+                                                StringConstant {
+                                                    value: "",
+                                                    implicit_concatenated: true,
+                                                },
+                                            ),
+                                            kind: None,
+                                        },
+                                    ),
+                                    debug_text: None,
+                                    conversion: None,
+                                    format_spec: None,
+                                },
+                            ),
+                        ],
+                        implicit_concatenated: false,
+                    },
+                ),
+            ),
+        },
+    ),
+]
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap
index 7d8b5d0f97..d93be4602f 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_spec.snap
@@ -36,6 +36,7 @@ expression: parse_ast
                                 },
                             ),
                         ],
+                        implicit_concatenated: false,
                     },
                 ),
             ),
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_string_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_string_spec.snap
new file mode 100644
index 0000000000..31db5e6cf8
--- /dev/null
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_nested_string_spec.snap
@@ -0,0 +1,50 @@
+---
+source: crates/ruff_python_parser/src/string.rs
+expression: parse_ast
+---
+[
+    FormattedValue(
+        ExprFormattedValue {
+            range: 2..12,
+            value: Name(
+                ExprName {
+                    range: 3..6,
+                    id: "foo",
+                    ctx: Load,
+                },
+            ),
+            debug_text: None,
+            conversion: None,
+            format_spec: Some(
+                FString(
+                    ExprFString {
+                        range: 7..11,
+                        values: [
+                            FormattedValue(
+                                ExprFormattedValue {
+                                    range: 7..11,
+                                    value: Constant(
+                                        ExprConstant {
+                                            range: 8..10,
+                                            value: Str(
+                                                StringConstant {
+                                                    value: "",
+                                                    implicit_concatenated: false,
+                                                },
+                                            ),
+                                            kind: None,
+                                        },
+                                    ),
+                                    debug_text: None,
+                                    conversion: None,
+                                    format_spec: None,
+                                },
+                            ),
+                        ],
+                        implicit_concatenated: false,
+                    },
+                ),
+            ),
+        },
+    ),
+]
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap
index 138ba6b187..5a621fc857 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_fstring_not_nested_spec.snap
@@ -24,12 +24,16 @@ expression: parse_ast
                                 ExprConstant {
                                     range: 7..11,
                                     value: Str(
-                                        "spec",
+                                        StringConstant {
+                                            value: "spec",
+                                            implicit_concatenated: false,
+                                        },
                                     ),
                                     kind: None,
                                 },
                             ),
                         ],
+                        implicit_concatenated: false,
                     },
                 ),
             ),
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_concat.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_concat.snap
index 68f419ced0..2c5d32050d 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_concat.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_concat.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..16,
                     value: Str(
-                        "Hello world",
+                        StringConstant {
+                            value: "Hello world",
+                            implicit_concatenated: true,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_triple_quotes_with_kind.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_triple_quotes_with_kind.snap
index b6561e362d..8e2e003f91 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_triple_quotes_with_kind.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_string_triple_quotes_with_kind.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..20,
                     value: Str(
-                        "Hello, world!",
+                        StringConstant {
+                            value: "Hello, world!",
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: Some(
                         "u",
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap
index db31dbe42c..23593fee07 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_1.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 2..17,
                                 value: Str(
-                                    "Hello world",
+                                    StringConstant {
+                                        value: "Hello world",
+                                        implicit_concatenated: true,
+                                    },
                                 ),
                                 kind: Some(
                                     "u",
@@ -22,6 +25,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: true,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap
index f2cf90b6b6..e6a8a74995 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_f_string_concat_2.snap
@@ -14,7 +14,10 @@ expression: parse_ast
                             ExprConstant {
                                 range: 2..21,
                                 value: Str(
-                                    "Hello world!",
+                                    StringConstant {
+                                        value: "Hello world!",
+                                        implicit_concatenated: true,
+                                    },
                                 ),
                                 kind: Some(
                                     "u",
@@ -22,6 +25,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: true,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_1.snap
index 629c241e8e..cb8d2848a9 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_1.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_1.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..17,
                     value: Str(
-                        "Hello world",
+                        StringConstant {
+                            value: "Hello world",
+                            implicit_concatenated: true,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_2.snap
index f89a6bd7f7..6fdde47ad2 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_2.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_string_concat_2.snap
@@ -10,7 +10,10 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..17,
                     value: Str(
-                        "Hello world",
+                        StringConstant {
+                            value: "Hello world",
+                            implicit_concatenated: true,
+                        },
                     ),
                     kind: Some(
                         "u",
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_1.snap
index 55f2380f02..37273bc676 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_1.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_1.snap
@@ -10,12 +10,15 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..8,
                     value: Bytes(
-                        [
-                            92,
-                            120,
-                            49,
-                            122,
-                        ],
+                        BytesConstant {
+                            value: [
+                                92,
+                                120,
+                                49,
+                                122,
+                            ],
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_2.snap
index 8a44d4ee8f..558aae8c95 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_2.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_byte_literal_2.snap
@@ -10,10 +10,13 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..6,
                     value: Bytes(
-                        [
-                            92,
-                            92,
-                        ],
+                        BytesConstant {
+                            value: [
+                                92,
+                                92,
+                            ],
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap
index 9c98593743..65f4daf83d 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_fstring.snap
@@ -26,6 +26,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__single_quoted_byte.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__single_quoted_byte.snap
index 1b6f47e27a..7ec79b41ff 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__single_quoted_byte.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__single_quoted_byte.snap
@@ -10,264 +10,267 @@ expression: parse_ast
                 ExprConstant {
                     range: 0..738,
                     value: Bytes(
-                        [
-                            0,
-                            1,
-                            2,
-                            3,
-                            4,
-                            5,
-                            6,
-                            7,
-                            8,
-                            9,
-                            10,
-                            11,
-                            12,
-                            13,
-                            14,
-                            15,
-                            16,
-                            17,
-                            18,
-                            19,
-                            20,
-                            21,
-                            22,
-                            23,
-                            24,
-                            25,
-                            26,
-                            27,
-                            28,
-                            29,
-                            30,
-                            31,
-                            32,
-                            33,
-                            34,
-                            35,
-                            36,
-                            37,
-                            38,
-                            39,
-                            40,
-                            41,
-                            42,
-                            43,
-                            44,
-                            45,
-                            46,
-                            47,
-                            48,
-                            49,
-                            50,
-                            51,
-                            52,
-                            53,
-                            54,
-                            55,
-                            56,
-                            57,
-                            58,
-                            59,
-                            60,
-                            61,
-                            62,
-                            63,
-                            64,
-                            65,
-                            66,
-                            67,
-                            68,
-                            69,
-                            70,
-                            71,
-                            72,
-                            73,
-                            74,
-                            75,
-                            76,
-                            77,
-                            78,
-                            79,
-                            80,
-                            81,
-                            82,
-                            83,
-                            84,
-                            85,
-                            86,
-                            87,
-                            88,
-                            89,
-                            90,
-                            91,
-                            92,
-                            93,
-                            94,
-                            95,
-                            96,
-                            97,
-                            98,
-                            99,
-                            100,
-                            101,
-                            102,
-                            103,
-                            104,
-                            105,
-                            106,
-                            107,
-                            108,
-                            109,
-                            110,
-                            111,
-                            112,
-                            113,
-                            114,
-                            115,
-                            116,
-                            117,
-                            118,
-                            119,
-                            120,
-                            121,
-                            122,
-                            123,
-                            124,
-                            125,
-                            126,
-                            127,
-                            128,
-                            129,
-                            130,
-                            131,
-                            132,
-                            133,
-                            134,
-                            135,
-                            136,
-                            137,
-                            138,
-                            139,
-                            140,
-                            141,
-                            142,
-                            143,
-                            144,
-                            145,
-                            146,
-                            147,
-                            148,
-                            149,
-                            150,
-                            151,
-                            152,
-                            153,
-                            154,
-                            155,
-                            156,
-                            157,
-                            158,
-                            159,
-                            160,
-                            161,
-                            162,
-                            163,
-                            164,
-                            165,
-                            166,
-                            167,
-                            168,
-                            169,
-                            170,
-                            171,
-                            172,
-                            173,
-                            174,
-                            175,
-                            176,
-                            177,
-                            178,
-                            179,
-                            180,
-                            181,
-                            182,
-                            183,
-                            184,
-                            185,
-                            186,
-                            187,
-                            188,
-                            189,
-                            190,
-                            191,
-                            192,
-                            193,
-                            194,
-                            195,
-                            196,
-                            197,
-                            198,
-                            199,
-                            200,
-                            201,
-                            202,
-                            203,
-                            204,
-                            205,
-                            206,
-                            207,
-                            208,
-                            209,
-                            210,
-                            211,
-                            212,
-                            213,
-                            214,
-                            215,
-                            216,
-                            217,
-                            218,
-                            219,
-                            220,
-                            221,
-                            222,
-                            223,
-                            224,
-                            225,
-                            226,
-                            227,
-                            228,
-                            229,
-                            230,
-                            231,
-                            232,
-                            233,
-                            234,
-                            235,
-                            236,
-                            237,
-                            238,
-                            239,
-                            240,
-                            241,
-                            242,
-                            243,
-                            244,
-                            245,
-                            246,
-                            247,
-                            248,
-                            249,
-                            250,
-                            251,
-                            252,
-                            253,
-                            254,
-                            255,
-                        ],
+                        BytesConstant {
+                            value: [
+                                0,
+                                1,
+                                2,
+                                3,
+                                4,
+                                5,
+                                6,
+                                7,
+                                8,
+                                9,
+                                10,
+                                11,
+                                12,
+                                13,
+                                14,
+                                15,
+                                16,
+                                17,
+                                18,
+                                19,
+                                20,
+                                21,
+                                22,
+                                23,
+                                24,
+                                25,
+                                26,
+                                27,
+                                28,
+                                29,
+                                30,
+                                31,
+                                32,
+                                33,
+                                34,
+                                35,
+                                36,
+                                37,
+                                38,
+                                39,
+                                40,
+                                41,
+                                42,
+                                43,
+                                44,
+                                45,
+                                46,
+                                47,
+                                48,
+                                49,
+                                50,
+                                51,
+                                52,
+                                53,
+                                54,
+                                55,
+                                56,
+                                57,
+                                58,
+                                59,
+                                60,
+                                61,
+                                62,
+                                63,
+                                64,
+                                65,
+                                66,
+                                67,
+                                68,
+                                69,
+                                70,
+                                71,
+                                72,
+                                73,
+                                74,
+                                75,
+                                76,
+                                77,
+                                78,
+                                79,
+                                80,
+                                81,
+                                82,
+                                83,
+                                84,
+                                85,
+                                86,
+                                87,
+                                88,
+                                89,
+                                90,
+                                91,
+                                92,
+                                93,
+                                94,
+                                95,
+                                96,
+                                97,
+                                98,
+                                99,
+                                100,
+                                101,
+                                102,
+                                103,
+                                104,
+                                105,
+                                106,
+                                107,
+                                108,
+                                109,
+                                110,
+                                111,
+                                112,
+                                113,
+                                114,
+                                115,
+                                116,
+                                117,
+                                118,
+                                119,
+                                120,
+                                121,
+                                122,
+                                123,
+                                124,
+                                125,
+                                126,
+                                127,
+                                128,
+                                129,
+                                130,
+                                131,
+                                132,
+                                133,
+                                134,
+                                135,
+                                136,
+                                137,
+                                138,
+                                139,
+                                140,
+                                141,
+                                142,
+                                143,
+                                144,
+                                145,
+                                146,
+                                147,
+                                148,
+                                149,
+                                150,
+                                151,
+                                152,
+                                153,
+                                154,
+                                155,
+                                156,
+                                157,
+                                158,
+                                159,
+                                160,
+                                161,
+                                162,
+                                163,
+                                164,
+                                165,
+                                166,
+                                167,
+                                168,
+                                169,
+                                170,
+                                171,
+                                172,
+                                173,
+                                174,
+                                175,
+                                176,
+                                177,
+                                178,
+                                179,
+                                180,
+                                181,
+                                182,
+                                183,
+                                184,
+                                185,
+                                186,
+                                187,
+                                188,
+                                189,
+                                190,
+                                191,
+                                192,
+                                193,
+                                194,
+                                195,
+                                196,
+                                197,
+                                198,
+                                199,
+                                200,
+                                201,
+                                202,
+                                203,
+                                204,
+                                205,
+                                206,
+                                207,
+                                208,
+                                209,
+                                210,
+                                211,
+                                212,
+                                213,
+                                214,
+                                215,
+                                216,
+                                217,
+                                218,
+                                219,
+                                220,
+                                221,
+                                222,
+                                223,
+                                224,
+                                225,
+                                226,
+                                227,
+                                228,
+                                229,
+                                230,
+                                231,
+                                232,
+                                233,
+                                234,
+                                235,
+                                236,
+                                237,
+                                238,
+                                239,
+                                240,
+                                241,
+                                242,
+                                243,
+                                244,
+                                245,
+                                246,
+                                247,
+                                248,
+                                249,
+                                250,
+                                251,
+                                252,
+                                253,
+                                254,
+                                255,
+                            ],
+                            implicit_concatenated: false,
+                        },
                     ),
                     kind: None,
                 },
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap
index 8f95a922aa..6793e65f73 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_fstring.snap
@@ -26,6 +26,7 @@ expression: parse_ast
                             },
                         ),
                     ],
+                    implicit_concatenated: false,
                 },
             ),
         },
diff --git a/crates/ruff_python_parser/src/string.rs b/crates/ruff_python_parser/src/string.rs
index 63b884e99c..9f154d071c 100644
--- a/crates/ruff_python_parser/src/string.rs
+++ b/crates/ruff_python_parser/src/string.rs
@@ -1,6 +1,4 @@
-use itertools::Itertools;
-
-use ruff_python_ast::{self as ast, Constant, Expr};
+use ruff_python_ast::{self as ast, BytesConstant, Constant, Expr, StringConstant};
 use ruff_python_ast::{ConversionFlag, Ranged};
 use ruff_text_size::{TextLen, TextRange, TextSize};
 
@@ -245,6 +243,7 @@ impl<'a> StringParser<'a> {
 
                     spec = Some(Box::new(Expr::from(ast::ExprFString {
                         values: parsed_spec,
+                        implicit_concatenated: false,
                         range: self.range(start_location),
                     })));
                 }
@@ -513,25 +512,25 @@ impl<'a> StringParser<'a> {
         }
 
         Ok(Expr::from(ast::ExprConstant {
-            value: Constant::Bytes(content.chars().map(|c| c as u8).collect()),
+            value: content.chars().map(|c| c as u8).collect::>().into(),
             kind: None,
             range: self.range(start_location),
         }))
     }
 
     fn parse_string(&mut self) -> Result {
-        let mut content = String::new();
+        let mut value = String::new();
         let start_location = self.get_pos();
         while let Some(ch) = self.next_char() {
             match ch {
                 '\\' if !self.kind.is_raw() => {
-                    content.push_str(&self.parse_escaped_char()?);
+                    value.push_str(&self.parse_escaped_char()?);
                 }
-                ch => content.push(ch),
+                ch => value.push(ch),
             }
         }
         Ok(Expr::from(ast::ExprConstant {
-            value: Constant::Str(content),
+            value: value.into(),
             kind: self.kind.is_unicode().then(|| "u".to_string()),
             range: self.range(start_location),
         }))
@@ -577,6 +576,7 @@ pub(crate) fn parse_strings(
         .filter(|(_, (_, kind, ..), _)| kind.is_any_bytes())
         .count();
     let has_bytes = num_bytes > 0;
+    let implicit_concatenated = values.len() > 1;
 
     if has_bytes && num_bytes < values.len() {
         return Err(LexicalError {
@@ -593,7 +593,7 @@ pub(crate) fn parse_strings(
             for value in parse_string(&source, kind, triple_quoted, start)? {
                 match value {
                     Expr::Constant(ast::ExprConstant {
-                        value: Constant::Bytes(value),
+                        value: Constant::Bytes(BytesConstant { value, .. }),
                         ..
                     }) => content.extend(value),
                     _ => unreachable!("Unexpected non-bytes expression."),
@@ -601,7 +601,10 @@ pub(crate) fn parse_strings(
             }
         }
         return Ok(ast::ExprConstant {
-            value: Constant::Bytes(content),
+            value: Constant::Bytes(BytesConstant {
+                value: content,
+                implicit_concatenated,
+            }),
             kind: None,
             range: TextRange::new(initial_start, last_end),
         }
@@ -614,7 +617,7 @@ pub(crate) fn parse_strings(
             for value in parse_string(&source, kind, triple_quoted, start)? {
                 match value {
                     Expr::Constant(ast::ExprConstant {
-                        value: Constant::Str(value),
+                        value: Constant::Str(StringConstant { value, .. }),
                         ..
                     }) => content.push(value),
                     _ => unreachable!("Unexpected non-string expression."),
@@ -622,7 +625,10 @@ pub(crate) fn parse_strings(
             }
         }
         return Ok(ast::ExprConstant {
-            value: Constant::Str(content.join("")),
+            value: Constant::Str(StringConstant {
+                value: content.join(""),
+                implicit_concatenated,
+            }),
             kind: initial_kind,
             range: TextRange::new(initial_start, last_end),
         }
@@ -637,7 +643,10 @@ pub(crate) fn parse_strings(
 
     let take_current = |current: &mut Vec, start, end| -> Expr {
         Expr::Constant(ast::ExprConstant {
-            value: Constant::Str(current.drain(..).join("")),
+            value: Constant::Str(StringConstant {
+                value: current.drain(..).collect::(),
+                implicit_concatenated,
+            }),
             kind: initial_kind.clone(),
             range: TextRange::new(start, end),
         })
@@ -654,14 +663,14 @@ pub(crate) fn parse_strings(
                     deduped.push(value);
                 }
                 Expr::Constant(ast::ExprConstant {
-                    value: Constant::Str(inner),
+                    value: Constant::Str(StringConstant { value, .. }),
                     ..
                 }) => {
                     if current.is_empty() {
                         current_start = value_range.start();
                     }
                     current_end = value_range.end();
-                    current.push(inner);
+                    current.push(value);
                 }
                 _ => unreachable!("Unexpected non-string expression."),
             }
@@ -673,6 +682,7 @@ pub(crate) fn parse_strings(
 
     Ok(Expr::FString(ast::ExprFString {
         values: deduped,
+        implicit_concatenated,
         range: TextRange::new(initial_start, last_end),
     }))
 }
@@ -963,6 +973,13 @@ mod tests {
         insta::assert_debug_snapshot!(parse_ast);
     }
 
+    #[test]
+    fn test_parse_f_string_concat_4() {
+        let source = "'Hello ' f'world{\"!\"}' 'again!'";
+        let parse_ast = parse_suite(source, "").unwrap();
+        insta::assert_debug_snapshot!(parse_ast);
+    }
+
     #[test]
     fn test_parse_u_f_string_concat_1() {
         let source = "u'Hello ' f'world'";
@@ -1080,6 +1097,22 @@ mod tests {
         insta::assert_debug_snapshot!(parse_ast);
     }
 
+    #[test]
+    fn test_parse_fstring_nested_string_spec() {
+        let source = "{foo:{''}}";
+        let parse_ast = parse_fstring(source).unwrap();
+
+        insta::assert_debug_snapshot!(parse_ast);
+    }
+
+    #[test]
+    fn test_parse_fstring_nested_concatenation_string_spec() {
+        let source = "{foo:{'' ''}}";
+        let parse_ast = parse_fstring(source).unwrap();
+
+        insta::assert_debug_snapshot!(parse_ast);
+    }
+
     macro_rules! test_aliases_parse {
         ($($name:ident: $alias:expr,)*) => {
         $(

From 40407dcce52eaf760cfe38590b8d5273d4b8b98e Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 09:52:19 -0400
Subject: [PATCH 109/155] Avoid marking inner-parenthesized comments as
 dangling bracket comments (#6517)

## Summary

The bracketed-end-of-line comment rule is meant to assign comments like
this as "immediately following the bracket":

```python
f(  # comment
    1
)
```

However, the logic was such that we treated this equivalently:

```python
f(
    (  # comment
        1
    )
)
```

This PR modifies the placement logic to ensure that we only skip the
opening bracket, and not any nested brackets. The above is now formatted
as:

```python
f(
    (
        # comment
        1
    )
)
```

(But will be corrected once we handle parenthesized comments properly.)

## Test Plan

`cargo test`

Confirmed no change in similarity score.
---
 .../test/fixtures/ruff/expression/call.py     |  6 ++++++
 .../src/comments/placement.rs                 | 20 ++++++++++++-------
 .../snapshots/format@expression__call.py.snap | 13 ++++++++++++
 3 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py
index 82166ba564..03502701ec 100644
--- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py
@@ -115,3 +115,9 @@ f (
 threshold_date = datetime.datetime.now() - datetime.timedelta(  # comment
     days=threshold_days_threshold_days
 )
+
+f(
+    (  # comment
+        1
+    )
+)
diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs
index d55ec6c91b..d8d8c03578 100644
--- a/crates/ruff_python_formatter/src/comments/placement.rs
+++ b/crates/ruff_python_formatter/src/comments/placement.rs
@@ -1150,14 +1150,20 @@ fn handle_bracketed_end_of_line_comment<'a>(
             locator.contents(),
             TextRange::new(comment.enclosing_node().start(), comment.start()),
         )
-        .skip_trivia()
-        .skip_while(|t| {
-            matches!(
-                t.kind(),
-                SimpleTokenKind::LParen | SimpleTokenKind::LBrace | SimpleTokenKind::LBracket
-            )
-        });
+        .skip_trivia();
 
+        // Skip the opening parenthesis.
+        let Some(paren) = lexer.next() else {
+            return CommentPlacement::Default(comment);
+        };
+        debug_assert!(matches!(
+            paren.kind(),
+            SimpleTokenKind::LParen | SimpleTokenKind::LBrace | SimpleTokenKind::LBracket
+        ));
+
+        // If there are no additional tokens between the open parenthesis and the comment, then
+        // it should be attached as a dangling comment on the brackets, rather than a leading
+        // comment on the first argument.
         if lexer.next().is_none() {
             return CommentPlacement::dangling(comment.enclosing_node(), comment);
         }
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap
index 283a06b31a..b6dab5b5df 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap
@@ -121,6 +121,12 @@ f (
 threshold_date = datetime.datetime.now() - datetime.timedelta(  # comment
     days=threshold_days_threshold_days
 )
+
+f(
+    (  # comment
+        1
+    )
+)
 ```
 
 ## Output
@@ -241,6 +247,13 @@ f(
 threshold_date = datetime.datetime.now() - datetime.timedelta(  # comment
     days=threshold_days_threshold_days
 )
+
+f(
+    (
+        # comment
+        1
+    )
+)
 ```
 
 

From a7cf8f0b77ebba4337e8fe0ed694fa0d95419949 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 10:27:17 -0400
Subject: [PATCH 110/155] Replace dynamic implicit concatenation detection with
 parser flag (#6513)

## Summary

In https://github.com/astral-sh/ruff/pull/6512, we added a flag to the
AST to mark implicitly-concatenated string expressions. This PR makes
use of that flag to remove the `is_implicit_concatenation` method.

## Test Plan

`cargo test`
---
 .../src/checkers/ast/analyze/definitions.rs   |  2 +-
 crates/ruff/src/rules/pydocstyle/helpers.rs   |  8 +-
 .../rules/pyupgrade/rules/native_literals.rs  | 15 ++-
 crates/ruff_python_ast/src/str.rs             | 95 -------------------
 .../src/expression/expr_bin_op.rs             | 12 ++-
 .../src/expression/expr_constant.rs           | 11 +--
 .../src/expression/string.rs                  | 19 ++--
 .../src/statement/suite.rs                    | 40 ++++----
 8 files changed, 52 insertions(+), 150 deletions(-)

diff --git a/crates/ruff/src/checkers/ast/analyze/definitions.rs b/crates/ruff/src/checkers/ast/analyze/definitions.rs
index c1ff6947a8..a6d86cad5d 100644
--- a/crates/ruff/src/checkers/ast/analyze/definitions.rs
+++ b/crates/ruff/src/checkers/ast/analyze/definitions.rs
@@ -171,7 +171,7 @@ pub(crate) fn definitions(checker: &mut Checker) {
                 expr.start(),
             ));
 
-            if pydocstyle::helpers::should_ignore_docstring(contents) {
+            if pydocstyle::helpers::should_ignore_docstring(expr) {
                 #[allow(deprecated)]
                 let location = checker.locator.compute_source_location(expr.start());
                 warn_user!(
diff --git a/crates/ruff/src/rules/pydocstyle/helpers.rs b/crates/ruff/src/rules/pydocstyle/helpers.rs
index 9c21fa40ab..c582bb1742 100644
--- a/crates/ruff/src/rules/pydocstyle/helpers.rs
+++ b/crates/ruff/src/rules/pydocstyle/helpers.rs
@@ -2,7 +2,7 @@ use std::collections::BTreeSet;
 
 use ruff_python_ast::call_path::from_qualified_name;
 use ruff_python_ast::helpers::map_callable;
-use ruff_python_ast::str::is_implicit_concatenation;
+use ruff_python_ast::Expr;
 use ruff_python_semantic::{Definition, SemanticModel};
 use ruff_source_file::UniversalNewlines;
 
@@ -63,9 +63,11 @@ pub(crate) fn should_ignore_definition(
 }
 
 /// Check if a docstring should be ignored.
-pub(crate) fn should_ignore_docstring(contents: &str) -> bool {
+pub(crate) fn should_ignore_docstring(docstring: &Expr) -> bool {
     // Avoid analyzing docstrings that contain implicit string concatenations.
     // Python does consider these docstrings, but they're almost certainly a
     // user error, and supporting them "properly" is extremely difficult.
-    is_implicit_concatenation(contents)
+    docstring
+        .as_constant_expr()
+        .is_some_and(|constant| constant.value.is_implicit_concatenated())
 }
diff --git a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs
index 61eea79e01..92ecd58434 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/native_literals.rs
@@ -2,11 +2,10 @@ use std::fmt;
 use std::str::FromStr;
 
 use num_bigint::BigInt;
-use ruff_python_ast::{self as ast, Constant, Expr, Keyword, Ranged};
 
 use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix};
 use ruff_macros::{derive_message_formats, violation};
-use ruff_python_ast::str::is_implicit_concatenation;
+use ruff_python_ast::{self as ast, Constant, Expr, Keyword, Ranged};
 
 use crate::checkers::ast::Checker;
 use crate::registry::AsRule;
@@ -182,6 +181,11 @@ pub(crate) fn native_literals(
                 return;
             };
 
+            // Skip implicit string concatenations.
+            if value.is_implicit_concatenated() {
+                return;
+            }
+
             let Ok(arg_literal_type) = LiteralType::try_from(value) else {
                 return;
             };
@@ -192,13 +196,6 @@ pub(crate) fn native_literals(
 
             let arg_code = checker.locator().slice(arg.range());
 
-            // Skip implicit string concatenations.
-            if matches!(arg_literal_type, LiteralType::Str | LiteralType::Bytes)
-                && is_implicit_concatenation(arg_code)
-            {
-                return;
-            }
-
             let mut diagnostic = Diagnostic::new(NativeLiterals { literal_type }, expr.range());
             if checker.patch(diagnostic.kind.rule()) {
                 diagnostic.set_fix(Fix::automatic(Edit::range_replacement(
diff --git a/crates/ruff_python_ast/src/str.rs b/crates/ruff_python_ast/src/str.rs
index 5421641c21..8ddff85958 100644
--- a/crates/ruff_python_ast/src/str.rs
+++ b/crates/ruff_python_ast/src/str.rs
@@ -184,68 +184,8 @@ pub fn is_triple_quote(content: &str) -> bool {
     TRIPLE_QUOTE_STR_PREFIXES.contains(&content) || TRIPLE_QUOTE_BYTE_PREFIXES.contains(&content)
 }
 
-/// Return `true` if the string expression is an implicit concatenation.
-///
-/// ## Examples
-///
-/// ```rust
-/// use ruff_python_ast::str::is_implicit_concatenation;
-///
-/// assert!(is_implicit_concatenation(r#"'abc' 'def'"#));
-/// assert!(!is_implicit_concatenation(r#"'abcdef'"#));
-/// ```
-pub fn is_implicit_concatenation(content: &str) -> bool {
-    let Some(leading_quote_str) = leading_quote(content) else {
-        return false;
-    };
-    let Some(trailing_quote_str) = trailing_quote(content) else {
-        return false;
-    };
-
-    // If the trailing quote doesn't match the _expected_ trailing quote, then the string is
-    // implicitly concatenated.
-    //
-    // For example, given:
-    // ```python
-    // u"""abc""" 'def'
-    // ```
-    //
-    // The leading quote would be `u"""`, and the trailing quote would be `'`, but the _expected_
-    // trailing quote would be `"""`. Since `'` does not equal `"""`, we'd return `true`.
-    if trailing_quote_str != trailing_quote(leading_quote_str).unwrap() {
-        return true;
-    }
-
-    // Search for any trailing quotes _before_ the end of the string.
-    let mut rest = &content[leading_quote_str.len()..content.len() - trailing_quote_str.len()];
-    while let Some(index) = rest.find(trailing_quote_str) {
-        let mut chars = rest[..index].chars().rev();
-
-        if let Some('\\') = chars.next() {
-            if chars.next() == Some('\\') {
-                // Either `\\'` or `\\\'` need to test one more character
-
-                // If the quote is preceded by `//` then it is not escaped, instead the backslash is escaped.
-                if chars.next() != Some('\\') {
-                    return true;
-                }
-            }
-        } else {
-            // If the quote is _not_ escaped, then it's implicitly concatenated.
-            return true;
-        }
-        rest = &rest[index + trailing_quote_str.len()..];
-    }
-
-    // Otherwise, we know the string ends with the expected trailing quote, so it's not implicitly
-    // concatenated.
-    false
-}
-
 #[cfg(test)]
 mod tests {
-    use crate::str::is_implicit_concatenation;
-
     use super::{
         SINGLE_QUOTE_BYTE_PREFIXES, SINGLE_QUOTE_STR_PREFIXES, TRIPLE_QUOTE_BYTE_PREFIXES,
         TRIPLE_QUOTE_STR_PREFIXES,
@@ -270,39 +210,4 @@ mod tests {
             }
         }
     }
-
-    #[test]
-    fn implicit_concatenation() {
-        // Positive cases.
-        assert!(is_implicit_concatenation(r#""abc" "def""#));
-        assert!(is_implicit_concatenation(r#""abc" 'def'"#));
-        assert!(is_implicit_concatenation(r#""""abc""" "def""#));
-        assert!(is_implicit_concatenation(r#"'''abc''' 'def'"#));
-        assert!(is_implicit_concatenation(r#""""abc""" 'def'"#));
-        assert!(is_implicit_concatenation(r#"'''abc''' "def""#));
-        assert!(is_implicit_concatenation(r#""""abc""""def""#));
-        assert!(is_implicit_concatenation(r#"'''abc''''def'"#));
-        assert!(is_implicit_concatenation(r#""""abc"""'def'"#));
-        assert!(is_implicit_concatenation(r#"'''abc'''"def""#));
-
-        // Negative cases.
-        assert!(!is_implicit_concatenation(r#""abc""#));
-        assert!(!is_implicit_concatenation(r#"'abc'"#));
-        assert!(!is_implicit_concatenation(r#""""abc""""#));
-        assert!(!is_implicit_concatenation(r#"'''abc'''"#));
-        assert!(!is_implicit_concatenation(r#""""ab"c""""#));
-        assert!(!is_implicit_concatenation(r#"'''ab'c'''"#));
-        assert!(!is_implicit_concatenation(r#""""ab'c""""#));
-        assert!(!is_implicit_concatenation(r#"'''ab"c'''"#));
-        assert!(!is_implicit_concatenation(r#""""ab'''c""""#));
-        assert!(!is_implicit_concatenation(r#"'''ab"""c'''"#));
-
-        // Positive cases with escaped quotes.
-        assert!(is_implicit_concatenation(r#""abc\\""def""#));
-        assert!(is_implicit_concatenation(r#""abc\\""def""#));
-
-        // Negative cases with escaped quotes.
-        assert!(!is_implicit_concatenation(r#""abc\"def""#));
-        assert!(!is_implicit_concatenation(r#"'\\\' ""'"#));
-    }
 }
diff --git a/crates/ruff_python_formatter/src/expression/expr_bin_op.rs b/crates/ruff_python_formatter/src/expression/expr_bin_op.rs
index adddc88663..175db909ca 100644
--- a/crates/ruff_python_formatter/src/expression/expr_bin_op.rs
+++ b/crates/ruff_python_formatter/src/expression/expr_bin_op.rs
@@ -1,13 +1,13 @@
 use std::iter;
 
 use ruff_python_ast::{
-    Constant, Expr, ExprAttribute, ExprBinOp, ExprConstant, ExprUnaryOp, Operator, UnaryOp,
+    Constant, Expr, ExprAttribute, ExprBinOp, ExprConstant, ExprUnaryOp, Operator, StringConstant,
+    UnaryOp,
 };
 use smallvec::SmallVec;
 
 use ruff_formatter::{format_args, write, FormatOwnedWithRule, FormatRefWithRule};
 use ruff_python_ast::node::{AnyNodeRef, AstNode};
-use ruff_python_ast::str::is_implicit_concatenation;
 
 use crate::comments::{trailing_comments, trailing_node_comments};
 use crate::expression::expr_constant::ExprConstantLayout;
@@ -157,8 +157,11 @@ impl FormatExprBinOp {
     fn layout<'a>(bin_op: &'a ExprBinOp, context: &PyFormatContext) -> BinOpLayout<'a> {
         if let Some(
             constant @ ExprConstant {
-                value: Constant::Str(_),
-                range,
+                value:
+                    Constant::Str(StringConstant {
+                        implicit_concatenated: true,
+                        ..
+                    }),
                 ..
             },
         ) = bin_op.left.as_constant_expr()
@@ -169,7 +172,6 @@ impl FormatExprBinOp {
                 && context.node_level().is_parenthesized()
                 && !comments.has_dangling_comments(constant)
                 && !comments.has_dangling_comments(bin_op)
-                && is_implicit_concatenation(&context.source()[*range])
             {
                 BinOpLayout::LeftString(constant)
             } else {
diff --git a/crates/ruff_python_formatter/src/expression/expr_constant.rs b/crates/ruff_python_formatter/src/expression/expr_constant.rs
index 59f06ebb68..58e8b48e58 100644
--- a/crates/ruff_python_formatter/src/expression/expr_constant.rs
+++ b/crates/ruff_python_formatter/src/expression/expr_constant.rs
@@ -1,9 +1,7 @@
-use ruff_python_ast::{Constant, ExprConstant, Ranged};
-use ruff_text_size::{TextLen, TextRange};
-
 use ruff_formatter::FormatRuleWithOptions;
 use ruff_python_ast::node::AnyNodeRef;
-use ruff_python_ast::str::is_implicit_concatenation;
+use ruff_python_ast::{Constant, ExprConstant, Ranged};
+use ruff_text_size::{TextLen, TextRange};
 
 use crate::expression::number::{FormatComplex, FormatFloat, FormatInt};
 use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses};
@@ -80,10 +78,9 @@ impl NeedsParentheses for ExprConstant {
         _parent: AnyNodeRef,
         context: &PyFormatContext,
     ) -> OptionalParentheses {
-        if self.value.is_str() || self.value.is_bytes() {
-            let contents = context.locator().slice(self.range());
+        if self.value.is_implicit_concatenated() {
             // Don't wrap triple quoted strings
-            if is_multiline_string(self, context.source()) || !is_implicit_concatenation(contents) {
+            if is_multiline_string(self, context.source()) {
                 OptionalParentheses::Never
             } else {
                 OptionalParentheses::Multiline
diff --git a/crates/ruff_python_formatter/src/expression/string.rs b/crates/ruff_python_formatter/src/expression/string.rs
index 3df7f7650b..4d56ad66cb 100644
--- a/crates/ruff_python_formatter/src/expression/string.rs
+++ b/crates/ruff_python_formatter/src/expression/string.rs
@@ -4,7 +4,6 @@ use bitflags::bitflags;
 
 use ruff_formatter::{format_args, write, FormatError};
 use ruff_python_ast::node::AnyNodeRef;
-use ruff_python_ast::str::is_implicit_concatenation;
 use ruff_python_ast::{self as ast, ExprConstant, ExprFString, Ranged};
 use ruff_python_parser::lexer::{lex_starts_at, LexicalError, LexicalErrorType};
 use ruff_python_parser::{Mode, Tok};
@@ -49,6 +48,17 @@ impl<'a> AnyString<'a> {
             }
         }
     }
+
+    /// Returns `true` if the string is implicitly concatenated.
+    fn implicit_concatenated(&self) -> bool {
+        match self {
+            Self::Constant(ExprConstant { value, .. }) => value.is_implicit_concatenated(),
+            Self::FString(ExprFString {
+                implicit_concatenated,
+                ..
+            }) => *implicit_concatenated,
+        }
+    }
 }
 
 impl Ranged for AnyString<'_> {
@@ -103,14 +113,11 @@ impl<'a> Format> for FormatString<'a> {
     fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
         match self.layout {
             StringLayout::Default => {
-                let string_range = self.string.range();
-                let string_content = f.context().locator().slice(string_range);
-
-                if is_implicit_concatenation(string_content) {
+                if self.string.implicit_concatenated() {
                     in_parentheses_only_group(&FormatStringContinuation::new(self.string)).fmt(f)
                 } else {
                     FormatStringPart::new(
-                        string_range,
+                        self.string.range(),
                         self.string.quoting(&f.context().locator()),
                         &f.context().locator(),
                         f.options().quote_style(),
diff --git a/crates/ruff_python_formatter/src/statement/suite.rs b/crates/ruff_python_formatter/src/statement/suite.rs
index 02a9a8180b..75143cf84d 100644
--- a/crates/ruff_python_formatter/src/statement/suite.rs
+++ b/crates/ruff_python_formatter/src/statement/suite.rs
@@ -1,10 +1,8 @@
 use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions};
 use ruff_python_ast::helpers::is_compound_statement;
-use ruff_python_ast::str::is_implicit_concatenation;
-use ruff_python_ast::{self as ast, Expr, Ranged, Stmt, Suite};
+use ruff_python_ast::{self as ast, Ranged, Stmt, Suite};
 use ruff_python_ast::{Constant, ExprConstant};
 use ruff_python_trivia::{lines_after_ignoring_trivia, lines_before};
-use ruff_source_file::Locator;
 
 use crate::comments::{leading_comments, trailing_comments};
 use crate::context::{NodeLevel, WithNodeLevel};
@@ -78,7 +76,7 @@ impl FormatRule> for FormatSuite {
                 write!(f, [first.format()])?;
             }
             SuiteKind::Function => {
-                if let Some(constant) = get_docstring(first, &f.context().locator()) {
+                if let Some(constant) = get_docstring(first) {
                     write!(
                         f,
                         [
@@ -95,7 +93,7 @@ impl FormatRule> for FormatSuite {
                 }
             }
             SuiteKind::Class => {
-                if let Some(constant) = get_docstring(first, &f.context().locator()) {
+                if let Some(constant) = get_docstring(first) {
                     if !comments.has_leading_comments(first)
                         && lines_before(first.start(), source) > 1
                     {
@@ -257,26 +255,20 @@ const fn is_import_definition(stmt: &Stmt) -> bool {
 }
 
 /// Checks if the statement is a simple string that can be formatted as a docstring
-fn get_docstring<'a>(stmt: &'a Stmt, locator: &Locator) -> Option<&'a ExprConstant> {
-    let Stmt::Expr(ast::StmtExpr { value, .. }) = stmt else {
-        return None;
-    };
-
-    let Expr::Constant(constant) = value.as_ref() else {
-        return None;
-    };
-    if let ExprConstant {
-        value: Constant::Str(..),
-        range,
-        ..
-    } = constant
-    {
-        if is_implicit_concatenation(locator.slice(*range)) {
-            return None;
-        }
-        return Some(constant);
+fn get_docstring(stmt: &Stmt) -> Option<&ExprConstant> {
+    let stmt_expr = stmt.as_expr_stmt()?;
+    let expr_constant = stmt_expr.value.as_constant_expr()?;
+    if matches!(
+        expr_constant.value,
+        Constant::Str(ast::StringConstant {
+            implicit_concatenated: false,
+            ..
+        })
+    ) {
+        Some(expr_constant)
+    } else {
+        None
     }
-    None
 }
 
 impl FormatRuleWithOptions> for FormatSuite {

From 3711f8ad59e39c8ccdab375bb2615bc1171a5859 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 10:35:31 -0400
Subject: [PATCH 111/155] Expand `SimpleTokenizer` to all keywords and
 single-character tokens (#6518)

## Summary

For #6485, I need to be able to use the `SimpleTokenizer` to lex the
space between any two adjacent expressions (i.e., the space between a
preceding and following node). This requires that we support a wider
range of keywords (like `and`, to connect the pieces of `x and y`), and
some additional single-character tokens (like `-` and `>`, to support
`->`). Note that the `SimpleTokenizer` does not support multi-character
tokens, so the `->` in a function signature is lexed as a `-` followed
by a `>` -- but this is fine for our purposes.
---
 ...tokenizer__tests__tokenize_characters.snap |  46 +++++
 crates/ruff_python_trivia/src/tokenizer.rs    | 183 ++++++++++++++++--
 2 files changed, 217 insertions(+), 12 deletions(-)
 create mode 100644 crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap

diff --git a/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap
new file mode 100644
index 0000000000..0dcdad5d26
--- /dev/null
+++ b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap
@@ -0,0 +1,46 @@
+---
+source: crates/ruff_python_trivia/src/tokenizer.rs
+expression: test_case.tokens()
+---
+[
+    SimpleToken {
+        kind: Minus,
+        range: 0..1,
+    },
+    SimpleToken {
+        kind: Greater,
+        range: 1..2,
+    },
+    SimpleToken {
+        kind: Whitespace,
+        range: 2..3,
+    },
+    SimpleToken {
+        kind: Star,
+        range: 3..4,
+    },
+    SimpleToken {
+        kind: Equals,
+        range: 4..5,
+    },
+    SimpleToken {
+        kind: Whitespace,
+        range: 5..6,
+    },
+    SimpleToken {
+        kind: LParen,
+        range: 6..7,
+    },
+    SimpleToken {
+        kind: Tilde,
+        range: 7..8,
+    },
+    SimpleToken {
+        kind: Equals,
+        range: 8..9,
+    },
+    SimpleToken {
+        kind: RParen,
+        range: 9..10,
+    },
+]
diff --git a/crates/ruff_python_trivia/src/tokenizer.rs b/crates/ruff_python_trivia/src/tokenizer.rs
index e553ab97b2..fe812f98f7 100644
--- a/crates/ruff_python_trivia/src/tokenizer.rs
+++ b/crates/ruff_python_trivia/src/tokenizer.rs
@@ -177,29 +177,141 @@ pub enum SimpleTokenKind {
     /// `.`.
     Dot,
 
-    /// `else`
-    Else,
+    /// `+`
+    Plus,
 
-    /// `if`
-    If,
+    /// `-`
+    Minus,
 
-    /// `elif`
-    Elif,
+    /// `=`
+    Equals,
 
-    /// `in`
-    In,
+    /// `>`
+    Greater,
+
+    /// `<`
+    Less,
+
+    /// `%`
+    Percent,
+
+    /// `&`
+    Ampersand,
+
+    /// `^`
+    Circumflex,
+    /// `|`
+    Vbar,
+
+    /// `@`
+    At,
+
+    /// `~`
+    Tilde,
+
+    /// `and`
+    And,
 
     /// `as`
     As,
 
+    /// `assert`
+    Assert,
+
+    /// `async`
+    Async,
+
+    /// `await`
+    Await,
+
+    /// `break`
+    Break,
+    /// `class`
+    Class,
+
+    /// `continue`
+    Continue,
+
+    /// `def`
+    Def,
+
+    /// `del`
+    Del,
+
+    /// `elif`
+    Elif,
+
+    /// `else`
+    Else,
+
+    /// `except`
+    Except,
+
+    /// `finally`
+    Finally,
+
+    /// `for`
+    For,
+
+    /// `from`
+    From,
+
+    /// `global`
+    Global,
+
+    /// `if`
+    If,
+
+    /// `import`
+    Import,
+
+    /// `in`
+    In,
+
+    /// `is`
+    Is,
+
+    /// `lambda`
+    Lambda,
+
+    /// `nonlocal`
+    Nonlocal,
+
+    /// `not`
+    Not,
+
+    /// `or`
+    Or,
+
+    /// `pass`
+    Pass,
+
+    /// `raise`
+    Raise,
+
+    /// `return`
+    Return,
+
+    /// `try`
+    Try,
+
+    /// `while`
+    While,
+
     /// `match`
     Match,
 
+    /// `type`
+    Type,
+
+    /// `case`
+    Case,
+
     /// `with`
     With,
 
-    /// `async`
-    Async,
+    /// `yield`
+    Yield,
 
     /// Any other non trivia token.
     Other,
@@ -222,6 +334,17 @@ impl SimpleTokenKind {
             '/' => SimpleTokenKind::Slash,
             '*' => SimpleTokenKind::Star,
             '.' => SimpleTokenKind::Dot,
+            '+' => SimpleTokenKind::Plus,
+            '-' => SimpleTokenKind::Minus,
+            '=' => SimpleTokenKind::Equals,
+            '>' => SimpleTokenKind::Greater,
+            '<' => SimpleTokenKind::Less,
+            '%' => SimpleTokenKind::Percent,
+            '&' => SimpleTokenKind::Ampersand,
+            '^' => SimpleTokenKind::Circumflex,
+            '|' => SimpleTokenKind::Vbar,
+            '@' => SimpleTokenKind::At,
+            '~' => SimpleTokenKind::Tilde,
             _ => SimpleTokenKind::Other,
         }
     }
@@ -289,15 +412,41 @@ impl<'a> SimpleTokenizer<'a> {
     fn to_keyword_or_other(&self, range: TextRange) -> SimpleTokenKind {
         let source = &self.source[range];
         match source {
+            "and" => SimpleTokenKind::And,
             "as" => SimpleTokenKind::As,
+            "assert" => SimpleTokenKind::Assert,
             "async" => SimpleTokenKind::Async,
-            "else" => SimpleTokenKind::Else,
+            "await" => SimpleTokenKind::Await,
+            "break" => SimpleTokenKind::Break,
+            "class" => SimpleTokenKind::Class,
+            "continue" => SimpleTokenKind::Continue,
+            "def" => SimpleTokenKind::Def,
+            "del" => SimpleTokenKind::Del,
             "elif" => SimpleTokenKind::Elif,
+            "else" => SimpleTokenKind::Else,
+            "except" => SimpleTokenKind::Except,
+            "finally" => SimpleTokenKind::Finally,
+            "for" => SimpleTokenKind::For,
+            "from" => SimpleTokenKind::From,
+            "global" => SimpleTokenKind::Global,
             "if" => SimpleTokenKind::If,
+            "import" => SimpleTokenKind::Import,
             "in" => SimpleTokenKind::In,
+            "is" => SimpleTokenKind::Is,
+            "lambda" => SimpleTokenKind::Lambda,
+            "nonlocal" => SimpleTokenKind::Nonlocal,
+            "not" => SimpleTokenKind::Not,
+            "or" => SimpleTokenKind::Or,
+            "pass" => SimpleTokenKind::Pass,
+            "raise" => SimpleTokenKind::Raise,
+            "return" => SimpleTokenKind::Return,
+            "try" => SimpleTokenKind::Try,
+            "while" => SimpleTokenKind::While,
             "match" => SimpleTokenKind::Match, // Match is a soft keyword that depends on the context but we can always lex it as a keyword and leave it to the caller (parser) to decide if it should be handled as an identifier or keyword.
+            "type" => SimpleTokenKind::Type, // Type is a soft keyword that depends on the context but we can always lex it as a keyword and leave it to the caller (parser) to decide if it should be handled as an identifier or keyword.
+            "case" => SimpleTokenKind::Case,
             "with" => SimpleTokenKind::With,
-            // ...,
+            "yield" => SimpleTokenKind::Yield,
             _ => SimpleTokenKind::Other, // Potentially an identifier, but only if it isn't a string prefix. We can ignore this for now https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
         }
     }
@@ -801,6 +950,16 @@ mod tests {
         test_case.assert_reverse_tokenization();
     }
 
+    #[test]
+    fn tokenize_characters() {
+        let source = "-> *= (~=)";
+
+        let test_case = tokenize(source);
+
+        assert_debug_snapshot!(test_case.tokens());
+        test_case.assert_reverse_tokenization();
+    }
+
     #[test]
     fn tricky_unicode() {
         let source = "មុ";

From c3a9151eb5758ae1647d1a727ef87492bfc71c74 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 11:11:03 -0400
Subject: [PATCH 112/155] Handle comments on open parentheses in with
 statements (#6515)

## Summary

This PR adds handling for comments on open parentheses in parenthesized
context managers. For example, given:

```python
with (  # comment
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...
```

We want to preserve that formatting. (Black does the same.) On `main`,
we format as:

```python
with (
    # comment
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...
```

It's very similar to how `StmtImportFrom` is handled.

Note that this case _isn't_ covered by the "parenthesized comment"
proposal, since this is a common on the statement that would typically
be attached to the first `WithItem`, and the `WithItem` _itself_ can
have parenthesized comments, like:

```python
with (  # comment
    (
        CtxManager1()  # comment
    ) as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...
```

## Test Plan

`cargo test`

Confirmed no change in similarity score.
---
 .../test/fixtures/ruff/statement/with.py      | 18 ++++++++
 .../src/comments/placement.rs                 | 36 ++++++++++++++--
 .../src/statement/stmt_import_from.rs         | 27 ++++++++----
 .../src/statement/stmt_with.rs                | 42 ++++++++++++++++---
 ..._opening_parentheses_comment_value.py.snap |  3 +-
 .../format@statement__import_from.py.snap     |  4 +-
 .../snapshots/format@statement__with.py.snap  | 37 ++++++++++++++++
 7 files changed, 148 insertions(+), 19 deletions(-)

diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py
index 76a8a49950..8a231ed788 100644
--- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py
@@ -116,3 +116,21 @@ with [
     dddddddddddddddddddddddddddddddd,
 ] as example1, aaaaaaaaaaaaaaaaaaaaaaaaaa * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * cccccccccccccccccccccccccccc + ddddddddddddddddd as example2, CtxManager222222222222222() as example2:
     ...
+
+# Comments on open parentheses
+with (  # comment
+    CtxManager1() as example1,
+    CtxManager2() as example2,
+    CtxManager3() as example3,
+):
+    ...
+
+
+with (  # outer comment
+    (  # inner comment
+        CtxManager1()
+    ) as example1,
+    CtxManager2() as example2,
+    CtxManager3() as example3,
+):
+    ...
diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs
index d8d8c03578..685aa2d3b8 100644
--- a/crates/ruff_python_formatter/src/comments/placement.rs
+++ b/crates/ruff_python_formatter/src/comments/placement.rs
@@ -73,6 +73,7 @@ pub(super) fn place_comment<'a>(
             handle_leading_class_with_decorators_comment(comment, class_def)
         }
         AnyNodeRef::StmtImportFrom(import_from) => handle_import_from_comment(comment, import_from),
+        AnyNodeRef::StmtWith(with_) => handle_with_comment(comment, with_),
         AnyNodeRef::ExprConstant(_) => {
             if let Some(AnyNodeRef::ExprFString(fstring)) = comment.enclosing_parent() {
                 CommentPlacement::dangling(fstring, comment)
@@ -1172,7 +1173,7 @@ fn handle_bracketed_end_of_line_comment<'a>(
     CommentPlacement::Default(comment)
 }
 
-/// Attach an enclosed end-of-line comment to a [`StmtImportFrom`].
+/// Attach an enclosed end-of-line comment to a [`ast::StmtImportFrom`].
 ///
 /// For example, given:
 /// ```python
@@ -1181,8 +1182,8 @@ fn handle_bracketed_end_of_line_comment<'a>(
 /// )
 /// ```
 ///
-/// The comment will be attached to the `StmtImportFrom` node as a dangling comment, to ensure
-/// that it remains on the same line as the `StmtImportFrom` itself.
+/// The comment will be attached to the [`ast::StmtImportFrom`] node as a dangling comment, to
+/// ensure that it remains on the same line as the [`ast::StmtImportFrom`] itself.
 fn handle_import_from_comment<'a>(
     comment: DecoratedComment<'a>,
     import_from: &'a ast::StmtImportFrom,
@@ -1217,6 +1218,35 @@ fn handle_import_from_comment<'a>(
     }
 }
 
+/// Attach an enclosed end-of-line comment to a [`ast::StmtWith`].
+///
+/// For example, given:
+/// ```python
+/// with ( # foo
+///     CtxManager1() as example1,
+///     CtxManager2() as example2,
+///     CtxManager3() as example3,
+/// ):
+///     ...
+/// ```
+///
+/// The comment will be attached to the [`ast::StmtWith`] node as a dangling comment, to ensure
+/// that it remains on the same line as the [`ast::StmtWith`] itself.
+fn handle_with_comment<'a>(
+    comment: DecoratedComment<'a>,
+    with_statement: &'a ast::StmtWith,
+) -> CommentPlacement<'a> {
+    if comment.line_position().is_end_of_line()
+        && with_statement.items.first().is_some_and(|with_item| {
+            with_statement.start() < comment.start() && comment.start() < with_item.start()
+        })
+    {
+        CommentPlacement::dangling(comment.enclosing_node(), comment)
+    } else {
+        CommentPlacement::Default(comment)
+    }
+}
+
 // Handle comments inside comprehensions, e.g.
 //
 // ```python
diff --git a/crates/ruff_python_formatter/src/statement/stmt_import_from.rs b/crates/ruff_python_formatter/src/statement/stmt_import_from.rs
index 30b76d57b6..3249dd7a79 100644
--- a/crates/ruff_python_formatter/src/statement/stmt_import_from.rs
+++ b/crates/ruff_python_formatter/src/statement/stmt_import_from.rs
@@ -4,7 +4,7 @@ use ruff_python_ast::node::AstNode;
 use ruff_python_ast::{Ranged, StmtImportFrom};
 
 use crate::builders::{parenthesize_if_expands, PyFormatterExtensions};
-use crate::comments::trailing_comments;
+use crate::expression::parentheses::parenthesized;
 use crate::{AsFormat, FormatNodeRule, PyFormatter};
 
 #[derive(Default)]
@@ -15,8 +15,8 @@ impl FormatNodeRule for FormatStmtImportFrom {
         let StmtImportFrom {
             module,
             names,
-            range: _,
             level,
+            range: _,
         } = item;
 
         let level_str = level
@@ -43,16 +43,29 @@ impl FormatNodeRule for FormatStmtImportFrom {
             }
         }
 
-        let comments = f.context().comments().clone();
-        let dangling_comments = comments.dangling_comments(item.as_any_node_ref());
-        write!(f, [trailing_comments(dangling_comments)])?;
-
         let names = format_with(|f| {
             f.join_comma_separated(item.end())
                 .entries(names.iter().map(|name| (name, name.format())))
                 .finish()
         });
-        parenthesize_if_expands(&names).fmt(f)
+
+        // A dangling comment on an import is a parenthesized comment, like:
+        // ```python
+        // from example import (  # comment
+        //     A,
+        //     B,
+        // )
+        // ```
+        let comments = f.context().comments().clone();
+        let parenthesized_comments = comments.dangling_comments(item.as_any_node_ref());
+
+        if parenthesized_comments.is_empty() {
+            parenthesize_if_expands(&names).fmt(f)
+        } else {
+            parenthesized("(", &names, ")")
+                .with_dangling_comments(parenthesized_comments)
+                .fmt(f)
+        }
     }
 
     fn fmt_dangling_comments(
diff --git a/crates/ruff_python_formatter/src/statement/stmt_with.rs b/crates/ruff_python_formatter/src/statement/stmt_with.rs
index b8afb2042d..cb7493dbdd 100644
--- a/crates/ruff_python_formatter/src/statement/stmt_with.rs
+++ b/crates/ruff_python_formatter/src/statement/stmt_with.rs
@@ -1,11 +1,12 @@
 use ruff_formatter::{format_args, write, FormatError};
+use ruff_python_ast::node::AstNode;
 use ruff_python_ast::{Ranged, StmtWith};
 use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer};
 use ruff_text_size::TextRange;
 
 use crate::comments::trailing_comments;
 use crate::expression::parentheses::{
-    in_parentheses_only_soft_line_break_or_space, optional_parentheses,
+    in_parentheses_only_soft_line_break_or_space, optional_parentheses, parenthesized,
 };
 use crate::prelude::*;
 use crate::FormatNodeRule;
@@ -15,9 +16,6 @@ pub struct FormatStmtWith;
 
 impl FormatNodeRule for FormatStmtWith {
     fn fmt_fields(&self, item: &StmtWith, f: &mut PyFormatter) -> FormatResult<()> {
-        let comments = f.context().comments().clone();
-        let dangling_comments = comments.dangling_comments(item);
-
         write!(
             f,
             [
@@ -28,7 +26,39 @@ impl FormatNodeRule for FormatStmtWith {
             ]
         )?;
 
-        if are_with_items_parenthesized(item, f.context())? {
+        // The `with` statement can have one dangling comment on the open parenthesis, like:
+        // ```python
+        // with (  # comment
+        //     CtxManager() as example
+        // ):
+        //     ...
+        // ```
+        //
+        // Any other dangling comments are trailing comments on the colon, like:
+        // ```python
+        // with CtxManager() as example:  # comment
+        //     ...
+        // ```
+        let comments = f.context().comments().clone();
+        let dangling_comments = comments.dangling_comments(item.as_any_node_ref());
+        let partition_point = dangling_comments.partition_point(|comment| {
+            item.items
+                .first()
+                .is_some_and(|with_item| with_item.start() > comment.start())
+        });
+        let (parenthesized_comments, colon_comments) = dangling_comments.split_at(partition_point);
+
+        if !parenthesized_comments.is_empty() {
+            let joined = format_with(|f: &mut PyFormatter| {
+                f.join_comma_separated(item.body.first().unwrap().start())
+                    .nodes(&item.items)
+                    .finish()
+            });
+
+            parenthesized("(", &joined, ")")
+                .with_dangling_comments(parenthesized_comments)
+                .fmt(f)?;
+        } else if are_with_items_parenthesized(item, f.context())? {
             optional_parentheses(&format_with(|f| {
                 let mut joiner = f.join_comma_separated(item.body.first().unwrap().start());
 
@@ -52,7 +82,7 @@ impl FormatNodeRule for FormatStmtWith {
             f,
             [
                 text(":"),
-                trailing_comments(dangling_comments),
+                trailing_comments(colon_comments),
                 block_indent(&item.body.format())
             ]
         )
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap
index 9ba9c4892c..e4a42c950f 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap
@@ -170,8 +170,7 @@ async def h():
     )
 
 
-with (
-    # d 1
+with (  # d 1
     x
 ):
     pass
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap
index dd2ca4c80f..433e893297 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap
@@ -88,7 +88,9 @@ from a import (  # comment
     bar,
 )
 
-from a import bar  # comment
+from a import (  # comment
+    bar
+)
 
 from a import (
     bar,
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap
index 3140929dc1..09eb21c805 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap
@@ -122,6 +122,24 @@ with [
     dddddddddddddddddddddddddddddddd,
 ] as example1, aaaaaaaaaaaaaaaaaaaaaaaaaa * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * cccccccccccccccccccccccccccc + ddddddddddddddddd as example2, CtxManager222222222222222() as example2:
     ...
+
+# Comments on open parentheses
+with (  # comment
+    CtxManager1() as example1,
+    CtxManager2() as example2,
+    CtxManager3() as example3,
+):
+    ...
+
+
+with (  # outer comment
+    (  # inner comment
+        CtxManager1()
+    ) as example1,
+    CtxManager2() as example2,
+    CtxManager3() as example3,
+):
+    ...
 ```
 
 ## Output
@@ -250,6 +268,25 @@ with [
     dddddddddddddddddddddddddddddddd,
 ] as example1, aaaaaaaaaaaaaaaaaaaaaaaaaa * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * cccccccccccccccccccccccccccc + ddddddddddddddddd as example2, CtxManager222222222222222() as example2:
     ...
+
+# Comments on open parentheses
+with (  # comment
+    CtxManager1() as example1,
+    CtxManager2() as example2,
+    CtxManager3() as example3,
+):
+    ...
+
+
+with (  # outer comment
+    (
+        # inner comment
+        CtxManager1()
+    ) as example1,
+    CtxManager2() as example2,
+    CtxManager3() as example3,
+):
+    ...
 ```
 
 

From 278a4f6e149a80679e248a455ffe758cbf13d827 Mon Sep 17 00:00:00 2001
From: qdegraaf <34540841+qdegraaf@users.noreply.github.com>
Date: Mon, 14 Aug 2023 17:38:56 +0200
Subject: [PATCH 113/155] Formatter: Fix posonlyargs for `expr_lambda` (#6562)

---
 .../test/fixtures/ruff/expression/lambda.py   |   2 +
 .../src/expression/expr_lambda.rs             |   5 +-
 ...black_compatibility@py_38__pep_570.py.snap | 168 ------------------
 .../format@expression__lambda.py.snap         |   4 +
 4 files changed, 10 insertions(+), 169 deletions(-)
 delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_570.py.snap

diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/lambda.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/lambda.py
index 42634acb47..5234ce79a0 100644
--- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/lambda.py
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/lambda.py
@@ -91,3 +91,5 @@ lambda *args, b, **kwds,: 0
 lambda *, b, **kwds,: 0
 lambda a, *args, b, **kwds,: 0
 lambda a, *, b, **kwds,: 0
+lambda a, /: a
+lambda a, /, c: a
diff --git a/crates/ruff_python_formatter/src/expression/expr_lambda.rs b/crates/ruff_python_formatter/src/expression/expr_lambda.rs
index 1b3aa4bdef..c8a23a18f0 100644
--- a/crates/ruff_python_formatter/src/expression/expr_lambda.rs
+++ b/crates/ruff_python_formatter/src/expression/expr_lambda.rs
@@ -22,7 +22,10 @@ impl FormatNodeRule for FormatExprLambda {
 
         write!(f, [text("lambda")])?;
 
-        if !parameters.args.is_empty() || parameters.vararg.is_some() || parameters.kwarg.is_some()
+        if !parameters.args.is_empty()
+            || !parameters.posonlyargs.is_empty()
+            || parameters.vararg.is_some()
+            || parameters.kwarg.is_some()
         {
             write!(
                 f,
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_570.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_570.py.snap
deleted file mode 100644
index b1326fc877..0000000000
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_570.py.snap
+++ /dev/null
@@ -1,168 +0,0 @@
----
-source: crates/ruff_python_formatter/tests/fixtures.rs
-input_file: crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_570.py
----
-## Input
-
-```py
-def positional_only_arg(a, /):
-    pass
-
-
-def all_markers(a, b, /, c, d, *, e, f):
-    pass
-
-
-def all_markers_with_args_and_kwargs(
-    a_long_one,
-    b_long_one,
-    /,
-    c_long_one,
-    d_long_one,
-    *args,
-    e_long_one,
-    f_long_one,
-    **kwargs,
-):
-    pass
-
-
-def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5):
-    pass
-
-
-def long_one_with_long_parameter_names(
-    but_all_of_them,
-    are_positional_only,
-    arguments_mmmmkay,
-    so_this_is_only_valid_after,
-    three_point_eight,
-    /,
-):
-    pass
-
-
-lambda a, /: a
-
-lambda a, b, /, c, d, *, e, f: a
-
-lambda a, b, /, c, d, *args, e, f, **kwargs: args
-
-lambda a, b=1, /, c=2, d=3, *, e=4, f=5: 1
-```
-
-## Black Differences
-
-```diff
---- Black
-+++ Ruff
-@@ -35,7 +35,7 @@
-     pass
- 
- 
--lambda a, /: a
-+lambda: a
- 
- lambda a, b, /, c, d, *, e, f: a
- 
-```
-
-## Ruff Output
-
-```py
-def positional_only_arg(a, /):
-    pass
-
-
-def all_markers(a, b, /, c, d, *, e, f):
-    pass
-
-
-def all_markers_with_args_and_kwargs(
-    a_long_one,
-    b_long_one,
-    /,
-    c_long_one,
-    d_long_one,
-    *args,
-    e_long_one,
-    f_long_one,
-    **kwargs,
-):
-    pass
-
-
-def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5):
-    pass
-
-
-def long_one_with_long_parameter_names(
-    but_all_of_them,
-    are_positional_only,
-    arguments_mmmmkay,
-    so_this_is_only_valid_after,
-    three_point_eight,
-    /,
-):
-    pass
-
-
-lambda: a
-
-lambda a, b, /, c, d, *, e, f: a
-
-lambda a, b, /, c, d, *args, e, f, **kwargs: args
-
-lambda a, b=1, /, c=2, d=3, *, e=4, f=5: 1
-```
-
-## Black Output
-
-```py
-def positional_only_arg(a, /):
-    pass
-
-
-def all_markers(a, b, /, c, d, *, e, f):
-    pass
-
-
-def all_markers_with_args_and_kwargs(
-    a_long_one,
-    b_long_one,
-    /,
-    c_long_one,
-    d_long_one,
-    *args,
-    e_long_one,
-    f_long_one,
-    **kwargs,
-):
-    pass
-
-
-def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5):
-    pass
-
-
-def long_one_with_long_parameter_names(
-    but_all_of_them,
-    are_positional_only,
-    arguments_mmmmkay,
-    so_this_is_only_valid_after,
-    three_point_eight,
-    /,
-):
-    pass
-
-
-lambda a, /: a
-
-lambda a, b, /, c, d, *, e, f: a
-
-lambda a, b, /, c, d, *args, e, f, **kwargs: args
-
-lambda a, b=1, /, c=2, d=3, *, e=4, f=5: 1
-```
-
-
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap
index 2d126b3408..0c1ec4565e 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__lambda.py.snap
@@ -97,6 +97,8 @@ lambda *args, b, **kwds,: 0
 lambda *, b, **kwds,: 0
 lambda a, *args, b, **kwds,: 0
 lambda a, *, b, **kwds,: 0
+lambda a, /: a
+lambda a, /, c: a
 ```
 
 ## Output
@@ -195,6 +197,8 @@ lambda *args, b, **kwds,: 0
 lambda *, b, **kwds,: 0
 lambda a, *args, b, **kwds,: 0
 lambda a, *, b, **kwds,: 0
+lambda a, /: a
+lambda a, /, c: a
 ```
 
 

From 09c8b176610bde2c2b2f05125f8a01ca017adcb5 Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Mon, 14 Aug 2023 17:57:36 +0200
Subject: [PATCH 114/155] `fmt: off..on` suppression comments (#6477)

---
 .../test/fixtures/ruff/fmt_on_off/comments.py |  23 +
 .../fixtures/ruff/fmt_on_off/empty_file.py    |   5 +
 .../ruff/fmt_on_off/fmt_off_docstring.py      |  19 +
 .../fixtures/ruff/fmt_on_off/form_feed.py     |   7 +
 .../ruff/fmt_on_off/last_statement.py         |  10 +
 .../fixtures/ruff/fmt_on_off/no_fmt_on.py     |   9 +
 .../fixtures/ruff/fmt_on_off/off_on_off_on.py |  71 ++
 .../test/fixtures/ruff/fmt_on_off/simple.py   |   9 +
 .../ruff/fmt_on_off/trailing_comments.py      |  40 ++
 .../test/fixtures/ruff/fmt_on_off/yapf.py     |  17 +
 .../src/comments/format.rs                    |   8 +-
 .../ruff_python_formatter/src/comments/map.rs |   1 +
 .../ruff_python_formatter/src/comments/mod.rs |  64 +-
 .../src/expression/expr_ipy_escape_command.rs |   7 +-
 crates/ruff_python_formatter/src/lib.rs       | 100 +--
 .../src/statement/stmt_ipy_escape_command.rs  |   7 +-
 .../src/statement/suite.rs                    | 498 ++++++++------
 crates/ruff_python_formatter/src/verbatim.rs  | 610 ++++++++++++++++++
 ...mpatibility@simple_cases__fmtonoff.py.snap | 281 ++------
 ...patibility@simple_cases__fmtonoff2.py.snap | 201 ------
 ...patibility@simple_cases__fmtonoff3.py.snap | 101 ---
 ...patibility@simple_cases__fmtonoff4.py.snap |  70 +-
 ...patibility@simple_cases__fmtonoff5.py.snap |  75 +--
 ...mpatibility@simple_cases__fmtskip3.py.snap |  64 --
 .../format@fmt_on_off__comments.py.snap       |  60 ++
 .../format@fmt_on_off__empty_file.py.snap     |  24 +
 ...rmat@fmt_on_off__fmt_off_docstring.py.snap |  52 ++
 .../format@fmt_on_off__form_feed.py.snap      |  28 +
 .../format@fmt_on_off__last_statement.py.snap |  35 +
 .../format@fmt_on_off__no_fmt_on.py.snap      |  33 +
 .../format@fmt_on_off__off_on_off_on.py.snap  | 156 +++++
 .../format@fmt_on_off__simple.py.snap         |  32 +
 ...rmat@fmt_on_off__trailing_comments.py.snap |  96 +++
 .../snapshots/format@fmt_on_off__yapf.py.snap |  48 ++
 34 files changed, 1883 insertions(+), 978 deletions(-)
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/empty_file.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/form_feed.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/last_statement.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/no_fmt_on.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/off_on_off_on.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/simple.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/trailing_comments.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/yapf.py
 create mode 100644 crates/ruff_python_formatter/src/verbatim.rs
 delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff2.py.snap
 delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff3.py.snap
 delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtskip3.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__empty_file.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__form_feed.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__last_statement.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__no_fmt_on.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__off_on_off_on.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__simple.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__trailing_comments.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__yapf.py.snap

diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py
new file mode 100644
index 0000000000..0a8118079f
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py
@@ -0,0 +1,23 @@
+pass
+
+# fmt: off
+  # A comment that falls into the verbatim range
+a +   b # a trailing comment
+
+# in between comments
+
+# function comment
+def test():
+    pass
+
+    # trailing comment that falls into the verbatim range
+
+  # fmt: on
+
+a +   b
+
+def test():
+    pass
+    # fmt: off
+    # a trailing comment
+
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/empty_file.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/empty_file.py
new file mode 100644
index 0000000000..c61bb37fe0
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/empty_file.py
@@ -0,0 +1,5 @@
+# fmt: off
+
+    # this does not work because there are no statements
+
+# fmt: on
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.py
new file mode 100644
index 0000000000..c387829010
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.py
@@ -0,0 +1,19 @@
+def test():
+    # fmt: off
+    """ This docstring does not
+        get formatted
+    """
+
+    # fmt: on
+
+    but + this  + does
+
+def test():
+    # fmt: off
+        # just for fun
+    # fmt: on
+        # leading comment
+    """   This docstring gets formatted
+    """ # trailing comment
+
+    and_this +  gets + formatted + too
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/form_feed.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/form_feed.py
new file mode 100644
index 0000000000..e5efe750eb
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/form_feed.py
@@ -0,0 +1,7 @@
+# fmt: off
+# DB layer  (form feed at the start of the next line)
+
+# fmt: on
+
+def test():
+    pass
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/last_statement.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/last_statement.py
new file mode 100644
index 0000000000..1fa2cee40a
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/last_statement.py
@@ -0,0 +1,10 @@
+def test():
+    # fmt: off
+
+    a  + b
+
+
+
+        # suppressed comments
+
+a   + b # formatted
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/no_fmt_on.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/no_fmt_on.py
new file mode 100644
index 0000000000..d2955856e3
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/no_fmt_on.py
@@ -0,0 +1,9 @@
+def test():
+    # fmt: off
+    not   formatted
+
+    if unformatted +  a:
+        pass
+
+# Get's formatted again
+a   + b
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/off_on_off_on.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/off_on_off_on.py
new file mode 100644
index 0000000000..7bc6ca8b46
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/off_on_off_on.py
@@ -0,0 +1,71 @@
+# Tricky sequences of fmt off and on
+
+# Formatted
+a +   b
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+a   + b
+    # formatted
+
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+    # not formatted 2
+# fmt: off
+a   + b
+# fmt: on
+
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+    # formatted 1
+# fmt: off
+    # not formatted 2
+a   + b
+# fmt: on
+    # formatted
+b   + c
+
+
+# fmt: off
+a   + b
+
+    # not formatted
+# fmt: on
+    # formatted
+a   + b
+
+
+# fmt: off
+a   + b
+
+    # not formatted 1
+# fmt: on
+    # formatted
+# fmt: off
+    # not formatted 2
+a   + b
+
+
+# fmt: off
+a   + b
+
+    # not formatted 1
+# fmt: on
+    # formatted
+
+# leading
+a    + b
+# fmt: off
+
+    # leading unformatted
+def test  ():
+    pass
+
+ # fmt: on
+
+a   + b
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/simple.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/simple.py
new file mode 100644
index 0000000000..dfe64b1c2e
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/simple.py
@@ -0,0 +1,9 @@
+# Get's formatted
+a +   b
+
+# fmt: off
+a + [1, 2, 3, 4, 5  ]
+# fmt: on
+
+# Get's formatted again
+a +  b
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/trailing_comments.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/trailing_comments.py
new file mode 100644
index 0000000000..4ddb4ad8a6
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/trailing_comments.py
@@ -0,0 +1,40 @@
+a = 10
+# fmt: off
+
+# more format
+
+def test(): ...
+
+
+# fmt: on
+
+b =   20
+# Sequence of trailing comments that toggle between format on and off. The sequence ends with a `fmt: on`, so that the function gets formatted.
+#   formatted 1
+# fmt: off
+    # not formatted
+# fmt: on
+    # formatted comment
+# fmt: off
+    # not formatted 2
+# fmt: on
+
+    # formatted
+def test2  ():
+    ...
+
+a =   10
+
+# Sequence of trailing comments that toggles between format on and off. The sequence ends with a `fmt: off`, so that the function is not formatted.
+    # formatted 1
+# fmt: off
+    # not formatted
+# fmt: on
+    # formattd
+# fmt: off
+
+    # not formatted
+def test3  ():
+    ...
+
+# fmt: on
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/yapf.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/yapf.py
new file mode 100644
index 0000000000..741ca7213a
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/yapf.py
@@ -0,0 +1,17 @@
+# Get's formatted
+a +   b
+
+# yapf: disable
+a + [1, 2, 3, 4, 5  ]
+# yapf: enable
+
+# Get's formatted again
+a +  b
+
+
+# yapf: disable
+a + [1, 2, 3, 4, 5   ]
+# fmt: on
+
+# Get's formatted again
+a +  b
diff --git a/crates/ruff_python_formatter/src/comments/format.rs b/crates/ruff_python_formatter/src/comments/format.rs
index 316f4b5ae2..fdcf4c5d81 100644
--- a/crates/ruff_python_formatter/src/comments/format.rs
+++ b/crates/ruff_python_formatter/src/comments/format.rs
@@ -281,11 +281,11 @@ impl Format> for FormatDanglingOpenParenthesisComments<'_> {
 ///
 /// * Adds a whitespace between `#` and the comment text except if the first character is a `#`, `:`, `'`, or `!`
 /// * Replaces non breaking whitespaces with regular whitespaces except if in front of a `types:` comment
-const fn format_comment(comment: &SourceComment) -> FormatComment {
+pub(crate) const fn format_comment(comment: &SourceComment) -> FormatComment {
     FormatComment { comment }
 }
 
-struct FormatComment<'a> {
+pub(crate) struct FormatComment<'a> {
     comment: &'a SourceComment,
 }
 
@@ -343,12 +343,12 @@ impl Format> for FormatComment<'_> {
 // Top level: Up to two empty lines
 // parenthesized: A single empty line
 // other: Up to a single empty line
-const fn empty_lines(lines: u32) -> FormatEmptyLines {
+pub(crate) const fn empty_lines(lines: u32) -> FormatEmptyLines {
     FormatEmptyLines { lines }
 }
 
 #[derive(Copy, Clone, Debug)]
-struct FormatEmptyLines {
+pub(crate) struct FormatEmptyLines {
     lines: u32,
 }
 
diff --git a/crates/ruff_python_formatter/src/comments/map.rs b/crates/ruff_python_formatter/src/comments/map.rs
index 9bef831903..4b303caa05 100644
--- a/crates/ruff_python_formatter/src/comments/map.rs
+++ b/crates/ruff_python_formatter/src/comments/map.rs
@@ -244,6 +244,7 @@ impl MultiMap {
     }
 
     /// Returns `true` if `key` has any *leading*, *dangling*, or *trailing* parts.
+    #[allow(unused)]
     pub(super) fn has(&self, key: &K) -> bool {
         self.index.get(key).is_some()
     }
diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs
index 238665f9b7..ee9ba687d0 100644
--- a/crates/ruff_python_formatter/src/comments/mod.rs
+++ b/crates/ruff_python_formatter/src/comments/mod.rs
@@ -103,6 +103,7 @@ use ruff_formatter::{SourceCode, SourceCodeSlice};
 use ruff_python_ast::node::AnyNodeRef;
 use ruff_python_ast::visitor::preorder::{PreorderVisitor, TraversalSignal};
 use ruff_python_index::CommentRanges;
+use ruff_python_trivia::PythonWhitespace;
 
 use crate::comments::debug::{DebugComment, DebugComments};
 use crate::comments::map::MultiMap;
@@ -110,7 +111,7 @@ use crate::comments::node_key::NodeRefEqualityKey;
 use crate::comments::visitor::CommentsVisitor;
 
 mod debug;
-mod format;
+pub(crate) mod format;
 mod map;
 mod node_key;
 mod placement;
@@ -150,6 +151,11 @@ impl SourceComment {
         self.formatted.set(true);
     }
 
+    /// Marks the comment as not-formatted
+    pub(crate) fn mark_unformatted(&self) {
+        self.formatted.set(false);
+    }
+
     /// If the comment has already been formatted
     pub(crate) fn is_formatted(&self) -> bool {
         self.formatted.get()
@@ -163,6 +169,50 @@ impl SourceComment {
     pub(crate) fn debug<'a>(&'a self, source_code: SourceCode<'a>) -> DebugComment<'a> {
         DebugComment::new(self, source_code)
     }
+
+    pub(crate) fn suppression_kind(&self, source: &str) -> Option {
+        let text = self.slice.text(SourceCode::new(source));
+        let trimmed = text.strip_prefix('#').unwrap_or(text).trim_whitespace();
+
+        if let Some(command) = trimmed.strip_prefix("fmt:") {
+            match command.trim_whitespace_start() {
+                "off" => Some(SuppressionKind::Off),
+                "on" => Some(SuppressionKind::On),
+                "skip" => Some(SuppressionKind::Skip),
+                _ => None,
+            }
+        } else if let Some(command) = trimmed.strip_prefix("yapf:") {
+            match command.trim_whitespace_start() {
+                "disable" => Some(SuppressionKind::Off),
+                "enable" => Some(SuppressionKind::On),
+                _ => None,
+            }
+        } else {
+            None
+        }
+    }
+
+    /// Returns true if this comment is a `fmt: off` or `yapf: disable` own line suppression comment.
+    pub(crate) fn is_suppression_off_comment(&self, source: &str) -> bool {
+        self.line_position.is_own_line()
+            && matches!(self.suppression_kind(source), Some(SuppressionKind::Off))
+    }
+
+    /// Returns true if this comment is a `fmt: on` or `yapf: enable` own line suppression comment.
+    pub(crate) fn is_suppression_on_comment(&self, source: &str) -> bool {
+        self.line_position.is_own_line()
+            && matches!(self.suppression_kind(source), Some(SuppressionKind::On))
+    }
+}
+
+#[derive(Copy, Clone, Eq, PartialEq, Debug)]
+pub(crate) enum SuppressionKind {
+    /// A `fmt: off` or `yapf: disable` comment
+    Off,
+    /// A `fmt: on` or `yapf: enable` comment
+    On,
+    /// A `fmt: skip` comment
+    Skip,
 }
 
 impl Ranged for SourceComment {
@@ -246,8 +296,6 @@ pub(crate) struct Comments<'a> {
     data: Rc>,
 }
 
-#[allow(unused)]
-// TODO(micha): Remove after using the new comments infrastructure in the formatter.
 impl<'a> Comments<'a> {
     fn new(comments: CommentsMap<'a>) -> Self {
         Self {
@@ -270,16 +318,6 @@ impl<'a> Comments<'a> {
         Self::new(map)
     }
 
-    #[inline]
-    pub(crate) fn has_comments(&self, node: T) -> bool
-    where
-        T: Into>,
-    {
-        self.data
-            .comments
-            .has(&NodeRefEqualityKey::from_ref(node.into()))
-    }
-
     /// Returns `true` if the given `node` has any [leading comments](self#leading-comments).
     #[inline]
     pub(crate) fn has_leading_comments(&self, node: T) -> bool
diff --git a/crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs b/crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs
index ab087df685..00afaee756 100644
--- a/crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs
+++ b/crates/ruff_python_formatter/src/expression/expr_ipy_escape_command.rs
@@ -1,12 +1,11 @@
-use crate::{verbatim_text, FormatNodeRule, PyFormatter};
-use ruff_formatter::{write, Buffer, FormatResult};
-use ruff_python_ast::ExprIpyEscapeCommand;
+use crate::prelude::*;
+use ruff_python_ast::{ExprIpyEscapeCommand, Ranged};
 
 #[derive(Default)]
 pub struct FormatExprIpyEscapeCommand;
 
 impl FormatNodeRule for FormatExprIpyEscapeCommand {
     fn fmt_fields(&self, item: &ExprIpyEscapeCommand, f: &mut PyFormatter) -> FormatResult<()> {
-        write!(f, [verbatim_text(item)])
+        source_text_slice(item.range(), ContainsNewlines::No).fmt(f)
     }
 }
diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs
index 5e3213ae95..2a704ae242 100644
--- a/crates/ruff_python_formatter/src/lib.rs
+++ b/crates/ruff_python_formatter/src/lib.rs
@@ -1,26 +1,24 @@
+use thiserror::Error;
+
+use ruff_formatter::format_element::tag;
+use ruff_formatter::prelude::{source_position, text, Formatter, Tag};
+use ruff_formatter::{
+    format, write, Buffer, Format, FormatElement, FormatError, FormatResult, PrintError,
+};
+use ruff_formatter::{Formatted, Printed, SourceCode};
+use ruff_python_ast::node::{AnyNodeRef, AstNode};
+use ruff_python_ast::Mod;
+use ruff_python_index::{CommentRanges, CommentRangesBuilder};
+use ruff_python_parser::lexer::{lex, LexicalError};
+use ruff_python_parser::{parse_tokens, Mode, ParseError};
+use ruff_source_file::Locator;
+use ruff_text_size::TextLen;
+
 use crate::comments::{
     dangling_node_comments, leading_node_comments, trailing_node_comments, Comments,
 };
 use crate::context::PyFormatContext;
 pub use crate::options::{MagicTrailingComma, PyFormatOptions, QuoteStyle};
-use ruff_formatter::format_element::tag;
-use ruff_formatter::prelude::{
-    dynamic_text, source_position, source_text_slice, text, ContainsNewlines, Formatter, Tag,
-};
-use ruff_formatter::{
-    format, normalize_newlines, write, Buffer, Format, FormatElement, FormatError, FormatResult,
-    PrintError,
-};
-use ruff_formatter::{Formatted, Printed, SourceCode};
-use ruff_python_ast::node::{AnyNodeRef, AstNode};
-use ruff_python_ast::{Mod, Ranged};
-use ruff_python_index::{CommentRanges, CommentRangesBuilder};
-use ruff_python_parser::lexer::{lex, LexicalError};
-use ruff_python_parser::{parse_tokens, Mode, ParseError};
-use ruff_source_file::Locator;
-use ruff_text_size::{TextLen, TextRange};
-use std::borrow::Cow;
-use thiserror::Error;
 
 pub(crate) mod builders;
 pub mod cli;
@@ -35,6 +33,7 @@ pub(crate) mod pattern;
 mod prelude;
 pub(crate) mod statement;
 pub(crate) mod type_param;
+mod verbatim;
 
 include!("../../ruff_formatter/shared_traits.rs");
 
@@ -47,10 +46,10 @@ where
     N: AstNode,
 {
     fn fmt(&self, node: &N, f: &mut PyFormatter) -> FormatResult<()> {
-        self.fmt_leading_comments(node, f)?;
+        leading_node_comments(node).fmt(f)?;
         self.fmt_node(node, f)?;
         self.fmt_dangling_comments(node, f)?;
-        self.fmt_trailing_comments(node, f)
+        trailing_node_comments(node).fmt(f)
     }
 
     /// Formats the node without comments. Ignores any suppression comments.
@@ -63,14 +62,6 @@ where
     /// Formats the node's fields.
     fn fmt_fields(&self, item: &N, f: &mut PyFormatter) -> FormatResult<()>;
 
-    /// Formats the [leading comments](comments#leading-comments) of the node.
-    ///
-    /// You may want to override this method if you want to manually handle the formatting of comments
-    /// inside of the `fmt_fields` method or customize the formatting of the leading comments.
-    fn fmt_leading_comments(&self, node: &N, f: &mut PyFormatter) -> FormatResult<()> {
-        leading_node_comments(node).fmt(f)
-    }
-
     /// Formats the [dangling comments](comments#dangling-comments) of the node.
     ///
     /// You should override this method if the node handled by this rule can have dangling comments because the
@@ -81,14 +72,6 @@ where
     fn fmt_dangling_comments(&self, node: &N, f: &mut PyFormatter) -> FormatResult<()> {
         dangling_node_comments(node).fmt(f)
     }
-
-    /// Formats the [trailing comments](comments#trailing-comments) of the node.
-    ///
-    /// You may want to override this method if you want to manually handle the formatting of comments
-    /// inside of the `fmt_fields` method or customize the formatting of the trailing comments.
-    fn fmt_trailing_comments(&self, node: &N, f: &mut PyFormatter) -> FormatResult<()> {
-        trailing_node_comments(node).fmt(f)
-    }
 }
 
 #[derive(Error, Debug)]
@@ -234,53 +217,18 @@ impl Format> for NotYetImplementedCustomText<'_> {
     }
 }
 
-pub(crate) struct VerbatimText(TextRange);
-
-#[allow(unused)]
-pub(crate) fn verbatim_text(item: &T) -> VerbatimText
-where
-    T: Ranged,
-{
-    VerbatimText(item.range())
-}
-
-impl Format> for VerbatimText {
-    fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
-        f.write_element(FormatElement::Tag(Tag::StartVerbatim(
-            tag::VerbatimKind::Verbatim {
-                length: self.0.len(),
-            },
-        )))?;
-
-        match normalize_newlines(f.context().locator().slice(self.0), ['\r']) {
-            Cow::Borrowed(_) => {
-                write!(f, [source_text_slice(self.0, ContainsNewlines::Detect)])?;
-            }
-            Cow::Owned(cleaned) => {
-                write!(
-                    f,
-                    [
-                        dynamic_text(&cleaned, Some(self.0.start())),
-                        source_position(self.0.end())
-                    ]
-                )?;
-            }
-        }
-
-        f.write_element(FormatElement::Tag(Tag::EndVerbatim))?;
-        Ok(())
-    }
-}
-
 #[cfg(test)]
 mod tests {
-    use crate::{format_module, format_node, PyFormatOptions};
+    use std::path::Path;
+
     use anyhow::Result;
     use insta::assert_snapshot;
+
     use ruff_python_index::CommentRangesBuilder;
     use ruff_python_parser::lexer::lex;
     use ruff_python_parser::{parse_tokens, Mode};
-    use std::path::Path;
+
+    use crate::{format_module, format_node, PyFormatOptions};
 
     /// Very basic test intentionally kept very similar to the CLI
     #[test]
diff --git a/crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs b/crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs
index 008c22b793..539ab3a8d8 100644
--- a/crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs
+++ b/crates/ruff_python_formatter/src/statement/stmt_ipy_escape_command.rs
@@ -1,12 +1,11 @@
-use crate::{verbatim_text, FormatNodeRule, PyFormatter};
-use ruff_formatter::{write, Buffer, FormatResult};
-use ruff_python_ast::StmtIpyEscapeCommand;
+use crate::prelude::*;
+use ruff_python_ast::{Ranged, StmtIpyEscapeCommand};
 
 #[derive(Default)]
 pub struct FormatStmtIpyEscapeCommand;
 
 impl FormatNodeRule for FormatStmtIpyEscapeCommand {
     fn fmt_fields(&self, item: &StmtIpyEscapeCommand, f: &mut PyFormatter) -> FormatResult<()> {
-        write!(f, [verbatim_text(item)])
+        source_text_slice(item.range(), ContainsNewlines::No).fmt(f)
     }
 }
diff --git a/crates/ruff_python_formatter/src/statement/suite.rs b/crates/ruff_python_formatter/src/statement/suite.rs
index 75143cf84d..a18760117c 100644
--- a/crates/ruff_python_formatter/src/statement/suite.rs
+++ b/crates/ruff_python_formatter/src/statement/suite.rs
@@ -1,14 +1,19 @@
+use crate::comments::{leading_comments, trailing_comments};
 use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions};
 use ruff_python_ast::helpers::is_compound_statement;
-use ruff_python_ast::{self as ast, Ranged, Stmt, Suite};
-use ruff_python_ast::{Constant, ExprConstant};
+use ruff_python_ast::node::AnyNodeRef;
+use ruff_python_ast::{self as ast, Expr, ExprConstant, Ranged, Stmt, Suite};
 use ruff_python_trivia::{lines_after_ignoring_trivia, lines_before};
+use ruff_text_size::TextRange;
 
-use crate::comments::{leading_comments, trailing_comments};
 use crate::context::{NodeLevel, WithNodeLevel};
 use crate::expression::expr_constant::ExprConstantLayout;
 use crate::expression::string::StringLayout;
 use crate::prelude::*;
+use crate::verbatim::{
+    write_suppressed_statements_starting_with_leading_comment,
+    write_suppressed_statements_starting_with_trailing_comment,
+};
 
 /// Level at which the [`Suite`] appears in the source code.
 #[derive(Copy, Clone, Debug)]
@@ -51,196 +56,231 @@ impl FormatRule> for FormatSuite {
         let comments = f.context().comments().clone();
         let source = f.context().source();
 
-        let mut iter = statements.iter();
-        let Some(first) = iter.next() else {
-            return Ok(());
-        };
-
         let mut f = WithNodeLevel::new(node_level, f);
+        write!(
+            f,
+            [format_with(|f| {
+                let mut iter = statements.iter();
+                let Some(first) = iter.next() else {
+                    return Ok(());
+                };
 
-        // Format the first statement in the body, which often has special formatting rules.
-        let mut last = first;
-        match self.kind {
-            SuiteKind::Other => {
-                if is_class_or_function_definition(first) && !comments.has_leading_comments(first) {
-                    // Add an empty line for any nested functions or classes defined within
-                    // non-function or class compound statements, e.g., this is stable formatting:
-                    // ```python
-                    // if True:
-                    //
-                    //     def test():
-                    //         ...
-                    // ```
-                    write!(f, [empty_line()])?;
-                }
-                write!(f, [first.format()])?;
-            }
-            SuiteKind::Function => {
-                if let Some(constant) = get_docstring(first) {
-                    write!(
-                        f,
-                        [
-                            // We format the expression, but the statement carries the comments
-                            leading_comments(comments.leading_comments(first)),
-                            constant
-                                .format()
-                                .with_options(ExprConstantLayout::String(StringLayout::DocString)),
-                            trailing_comments(comments.trailing_comments(first)),
-                        ]
-                    )?;
+                // Format the first statement in the body, which often has special formatting rules.
+                let first = match self.kind {
+                    SuiteKind::Other => {
+                        if is_class_or_function_definition(first)
+                            && !comments.has_leading_comments(first)
+                        {
+                            // Add an empty line for any nested functions or classes defined within
+                            // non-function or class compound statements, e.g., this is stable formatting:
+                            // ```python
+                            // if True:
+                            //
+                            //     def test():
+                            //         ...
+                            // ```
+                            empty_line().fmt(f)?;
+                        }
+
+                        SuiteChildStatement::Other(first)
+                    }
+
+                    SuiteKind::Function => {
+                        if let Some(docstring) = DocstringStmt::try_from_statement(first) {
+                            SuiteChildStatement::Docstring(docstring)
+                        } else {
+                            SuiteChildStatement::Other(first)
+                        }
+                    }
+
+                    SuiteKind::Class => {
+                        if let Some(docstring) = DocstringStmt::try_from_statement(first) {
+                            if !comments.has_leading_comments(first)
+                                && lines_before(first.start(), source) > 1
+                            {
+                                // Allow up to one empty line before a class docstring, e.g., this is
+                                // stable formatting:
+                                // ```python
+                                // class Test:
+                                //
+                                //     """Docstring"""
+                                // ```
+                                empty_line().fmt(f)?;
+                            }
+
+                            SuiteChildStatement::Docstring(docstring)
+                        } else {
+                            SuiteChildStatement::Other(first)
+                        }
+                    }
+                    SuiteKind::TopLevel => SuiteChildStatement::Other(first),
+                };
+
+                let (mut preceding, mut after_class_docstring) = if comments
+                    .leading_comments(first)
+                    .iter()
+                    .any(|comment| comment.is_suppression_off_comment(source))
+                {
+                    (
+                        write_suppressed_statements_starting_with_leading_comment(
+                            first, &mut iter, f,
+                        )?,
+                        false,
+                    )
+                } else if comments
+                    .trailing_comments(first)
+                    .iter()
+                    .any(|comment| comment.is_suppression_off_comment(source))
+                {
+                    (
+                        write_suppressed_statements_starting_with_trailing_comment(
+                            first, &mut iter, f,
+                        )?,
+                        false,
+                    )
                 } else {
-                    write!(f, [first.format()])?;
-                }
-            }
-            SuiteKind::Class => {
-                if let Some(constant) = get_docstring(first) {
-                    if !comments.has_leading_comments(first)
-                        && lines_before(first.start(), source) > 1
+                    first.fmt(f)?;
+                    (
+                        first.statement(),
+                        matches!(first, SuiteChildStatement::Docstring(_))
+                            && matches!(self.kind, SuiteKind::Class),
+                    )
+                };
+
+                while let Some(following) = iter.next() {
+                    if is_class_or_function_definition(preceding)
+                        || is_class_or_function_definition(following)
                     {
-                        // Allow up to one empty line before a class docstring
+                        match self.kind {
+                            SuiteKind::TopLevel => {
+                                write!(f, [empty_line(), empty_line()])?;
+                            }
+                            SuiteKind::Function | SuiteKind::Class | SuiteKind::Other => {
+                                empty_line().fmt(f)?;
+                            }
+                        }
+                    } else if is_import_definition(preceding) && !is_import_definition(following) {
+                        empty_line().fmt(f)?;
+                    } else if is_compound_statement(preceding) {
+                        // Handles the case where a body has trailing comments. The issue is that RustPython does not include
+                        // the comments in the range of the suite. This means, the body ends right after the last statement in the body.
                         // ```python
+                        // def test():
+                        //      ...
+                        //      # The body of `test` ends right after `...` and before this comment
+                        //
+                        // # leading comment
+                        //
+                        //
+                        // a = 10
+                        // ```
+                        // Using `lines_after` for the node doesn't work because it would count the lines after the `...`
+                        // which is 0 instead of 1, the number of lines between the trailing comment and
+                        // the leading comment. This is why the suite handling counts the lines before the
+                        // start of the next statement or before the first leading comments for compound statements.
+                        let start = if let Some(first_leading) =
+                            comments.leading_comments(following).first()
+                        {
+                            first_leading.slice().start()
+                        } else {
+                            following.start()
+                        };
+
+                        match lines_before(start, source) {
+                            0 | 1 => hard_line_break().fmt(f)?,
+                            2 => empty_line().fmt(f)?,
+                            3.. => match self.kind {
+                                SuiteKind::TopLevel => write!(f, [empty_line(), empty_line()])?,
+                                SuiteKind::Function | SuiteKind::Class | SuiteKind::Other => {
+                                    empty_line().fmt(f)?;
+                                }
+                            },
+                        }
+                    } else if after_class_docstring {
+                        // Enforce an empty line after a class docstring, e.g., these are both stable
+                        // formatting:
+                        // ```python
+                        // class Test:
+                        //     """Docstring"""
+                        //
+                        //     ...
+                        //
+                        //
                         // class Test:
                         //
                         //     """Docstring"""
+                        //
+                        //     ...
                         // ```
-                        write!(f, [empty_line()])?;
-                    }
-                    write!(
-                        f,
-                        [
-                            // We format the expression, but the statement carries the comments
-                            leading_comments(comments.leading_comments(first)),
-                            constant
-                                .format()
-                                .with_options(ExprConstantLayout::String(StringLayout::DocString)),
-                            trailing_comments(comments.trailing_comments(first)),
-                        ]
-                    )?;
-
-                    // Enforce an empty line after a class docstring
-                    // ```python
-                    // class Test:
-                    //     """Docstring"""
-                    //
-                    //     ...
-                    //
-                    //
-                    // class Test:
-                    //
-                    //     """Docstring"""
-                    //
-                    //     ...
-                    // ```
-                    // Unlike black, we add the newline also after single quoted docstrings
-                    if let Some(second) = iter.next() {
-                        // Format the subsequent statement immediately. This rule takes precedence
-                        // over the rules in the loop below (and most of them won't apply anyway,
-                        // e.g., we know the first statement isn't an import).
-                        write!(f, [empty_line(), second.format()])?;
-                        last = second;
-                    }
-                } else {
-                    // No docstring, use normal formatting
-                    write!(f, [first.format()])?;
-                }
-            }
-            SuiteKind::TopLevel => {
-                write!(f, [first.format()])?;
-            }
-        }
-
-        for statement in iter {
-            if is_class_or_function_definition(last) || is_class_or_function_definition(statement) {
-                match self.kind {
-                    SuiteKind::TopLevel => {
-                        write!(f, [empty_line(), empty_line(), statement.format()])?;
-                    }
-                    SuiteKind::Function | SuiteKind::Class | SuiteKind::Other => {
-                        write!(f, [empty_line(), statement.format()])?;
-                    }
-                }
-            } else if is_import_definition(last) && !is_import_definition(statement) {
-                write!(f, [empty_line(), statement.format()])?;
-            } else if is_compound_statement(last) {
-                // Handles the case where a body has trailing comments. The issue is that RustPython does not include
-                // the comments in the range of the suite. This means, the body ends right after the last statement in the body.
-                // ```python
-                // def test():
-                //      ...
-                //      # The body of `test` ends right after `...` and before this comment
-                //
-                // # leading comment
-                //
-                //
-                // a = 10
-                // ```
-                // Using `lines_after` for the node doesn't work because it would count the lines after the `...`
-                // which is 0 instead of 1, the number of lines between the trailing comment and
-                // the leading comment. This is why the suite handling counts the lines before the
-                // start of the next statement or before the first leading comments for compound statements.
-                let start =
-                    if let Some(first_leading) = comments.leading_comments(statement).first() {
-                        first_leading.slice().start()
+                        empty_line().fmt(f)?;
+                        after_class_docstring = false;
                     } else {
-                        statement.start()
-                    };
+                        // Insert the appropriate number of empty lines based on the node level, e.g.:
+                        // * [`NodeLevel::Module`]: Up to two empty lines
+                        // * [`NodeLevel::CompoundStatement`]: Up to one empty line
+                        // * [`NodeLevel::Expression`]: No empty lines
 
-                match lines_before(start, source) {
-                    0 | 1 => write!(f, [hard_line_break()])?,
-                    2 => write!(f, [empty_line()])?,
-                    3.. => match self.kind {
-                        SuiteKind::TopLevel => write!(f, [empty_line(), empty_line()])?,
-                        SuiteKind::Function | SuiteKind::Class | SuiteKind::Other => {
-                            write!(f, [empty_line()])?;
+                        let count_lines = |offset| {
+                            // It's necessary to skip any trailing line comment because RustPython doesn't include trailing comments
+                            // in the node's range
+                            // ```python
+                            // a # The range of `a` ends right before this comment
+                            //
+                            // b
+                            // ```
+                            //
+                            // Simply using `lines_after` doesn't work if a statement has a trailing comment because
+                            // it then counts the lines between the statement and the trailing comment, which is
+                            // always 0. This is why it skips any trailing trivia (trivia that's on the same line)
+                            // and counts the lines after.
+                            lines_after_ignoring_trivia(offset, source)
+                        };
+
+                        match node_level {
+                            NodeLevel::TopLevel => match count_lines(preceding.end()) {
+                                0 | 1 => hard_line_break().fmt(f)?,
+                                2 => empty_line().fmt(f)?,
+                                _ => write!(f, [empty_line(), empty_line()])?,
+                            },
+                            NodeLevel::CompoundStatement => match count_lines(preceding.end()) {
+                                0 | 1 => hard_line_break().fmt(f)?,
+                                _ => empty_line().fmt(f)?,
+                            },
+                            NodeLevel::Expression(_) | NodeLevel::ParenthesizedExpression => {
+                                hard_line_break().fmt(f)?;
+                            }
                         }
-                    },
-                }
+                    }
 
-                write!(f, [statement.format()])?;
-            } else {
-                // Insert the appropriate number of empty lines based on the node level, e.g.:
-                // * [`NodeLevel::Module`]: Up to two empty lines
-                // * [`NodeLevel::CompoundStatement`]: Up to one empty line
-                // * [`NodeLevel::Expression`]: No empty lines
-
-                let count_lines = |offset| {
-                    // It's necessary to skip any trailing line comment because RustPython doesn't include trailing comments
-                    // in the node's range
-                    // ```python
-                    // a # The range of `a` ends right before this comment
-                    //
-                    // b
-                    // ```
-                    //
-                    // Simply using `lines_after` doesn't work if a statement has a trailing comment because
-                    // it then counts the lines between the statement and the trailing comment, which is
-                    // always 0. This is why it skips any trailing trivia (trivia that's on the same line)
-                    // and counts the lines after.
-                    lines_after_ignoring_trivia(offset, source)
-                };
-
-                match node_level {
-                    NodeLevel::TopLevel => match count_lines(last.end()) {
-                        0 | 1 => write!(f, [hard_line_break()])?,
-                        2 => write!(f, [empty_line()])?,
-                        _ => write!(f, [empty_line(), empty_line()])?,
-                    },
-                    NodeLevel::CompoundStatement => match count_lines(last.end()) {
-                        0 | 1 => write!(f, [hard_line_break()])?,
-                        _ => write!(f, [empty_line()])?,
-                    },
-                    NodeLevel::Expression(_) | NodeLevel::ParenthesizedExpression => {
-                        write!(f, [hard_line_break()])?;
+                    if comments
+                        .leading_comments(following)
+                        .iter()
+                        .any(|comment| comment.is_suppression_off_comment(source))
+                    {
+                        preceding = write_suppressed_statements_starting_with_leading_comment(
+                            SuiteChildStatement::Other(following),
+                            &mut iter,
+                            f,
+                        )?;
+                    } else if comments
+                        .trailing_comments(following)
+                        .iter()
+                        .any(|comment| comment.is_suppression_off_comment(source))
+                    {
+                        preceding = write_suppressed_statements_starting_with_trailing_comment(
+                            SuiteChildStatement::Other(following),
+                            &mut iter,
+                            f,
+                        )?;
+                    } else {
+                        following.format().fmt(f)?;
+                        preceding = following;
                     }
                 }
 
-                write!(f, [statement.format()])?;
-            }
-
-            last = statement;
-        }
-
-        Ok(())
+                Ok(())
+            })]
+        )
     }
 }
 
@@ -254,23 +294,6 @@ const fn is_import_definition(stmt: &Stmt) -> bool {
     matches!(stmt, Stmt::Import(_) | Stmt::ImportFrom(_))
 }
 
-/// Checks if the statement is a simple string that can be formatted as a docstring
-fn get_docstring(stmt: &Stmt) -> Option<&ExprConstant> {
-    let stmt_expr = stmt.as_expr_stmt()?;
-    let expr_constant = stmt_expr.value.as_constant_expr()?;
-    if matches!(
-        expr_constant.value,
-        Constant::Str(ast::StringConstant {
-            implicit_concatenated: false,
-            ..
-        })
-    ) {
-        Some(expr_constant)
-    } else {
-        None
-    }
-}
-
 impl FormatRuleWithOptions> for FormatSuite {
     type Options = SuiteKind;
 
@@ -296,6 +319,93 @@ impl<'ast> IntoFormat> for Suite {
     }
 }
 
+/// A statement representing a docstring.
+#[derive(Copy, Clone)]
+pub(crate) struct DocstringStmt<'a>(&'a Stmt);
+
+impl<'a> DocstringStmt<'a> {
+    /// Checks if the statement is a simple string that can be formatted as a docstring
+    fn try_from_statement(stmt: &'a Stmt) -> Option> {
+        let Stmt::Expr(ast::StmtExpr { value, .. }) = stmt else {
+            return None;
+        };
+
+        if let Expr::Constant(ExprConstant { value, .. }) = value.as_ref() {
+            if !value.is_implicit_concatenated() {
+                return Some(DocstringStmt(stmt));
+            }
+        }
+
+        None
+    }
+}
+
+impl Format> for DocstringStmt<'_> {
+    fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> {
+        // SAFETY: Safe because `DocStringStmt` guarantees that it only ever wraps a `ExprStmt` containing a `ConstantExpr`.
+        let constant = self
+            .0
+            .as_expr_stmt()
+            .unwrap()
+            .value
+            .as_constant_expr()
+            .unwrap();
+        let comments = f.context().comments().clone();
+
+        // We format the expression, but the statement carries the comments
+        write!(
+            f,
+            [
+                leading_comments(comments.leading_comments(self.0)),
+                constant
+                    .format()
+                    .with_options(ExprConstantLayout::String(StringLayout::DocString)),
+                trailing_comments(comments.trailing_comments(self.0)),
+            ]
+        )
+    }
+}
+
+/// A Child of a suite.
+#[derive(Copy, Clone)]
+pub(crate) enum SuiteChildStatement<'a> {
+    /// A docstring documenting a class or function definition.
+    Docstring(DocstringStmt<'a>),
+
+    /// Any other statement.
+    Other(&'a Stmt),
+}
+
+impl<'a> SuiteChildStatement<'a> {
+    pub(crate) const fn statement(self) -> &'a Stmt {
+        match self {
+            SuiteChildStatement::Docstring(docstring) => docstring.0,
+            SuiteChildStatement::Other(statement) => statement,
+        }
+    }
+}
+
+impl Ranged for SuiteChildStatement<'_> {
+    fn range(&self) -> TextRange {
+        self.statement().range()
+    }
+}
+
+impl<'a> From> for AnyNodeRef<'a> {
+    fn from(value: SuiteChildStatement<'a>) -> Self {
+        value.statement().into()
+    }
+}
+
+impl Format> for SuiteChildStatement<'_> {
+    fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> {
+        match self {
+            SuiteChildStatement::Docstring(docstring) => docstring.fmt(f),
+            SuiteChildStatement::Other(statement) => statement.format().fmt(f),
+        }
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use ruff_formatter::format;
diff --git a/crates/ruff_python_formatter/src/verbatim.rs b/crates/ruff_python_formatter/src/verbatim.rs
new file mode 100644
index 0000000000..c96a35c59c
--- /dev/null
+++ b/crates/ruff_python_formatter/src/verbatim.rs
@@ -0,0 +1,610 @@
+use std::borrow::Cow;
+use std::iter::FusedIterator;
+
+use ruff_formatter::write;
+use ruff_python_ast::node::AnyNodeRef;
+use ruff_python_ast::{Ranged, Stmt};
+use ruff_python_trivia::lines_before;
+use ruff_text_size::TextRange;
+
+use crate::comments::format::{empty_lines, format_comment};
+use crate::comments::{leading_comments, trailing_comments, SourceComment};
+use crate::prelude::*;
+use crate::statement::suite::SuiteChildStatement;
+
+/// Disables formatting for all statements between the `first_suppressed` that has a leading `fmt: off` comment
+/// and the first trailing or leading `fmt: on` comment. The statements are formatted as they appear in the source code.
+///
+/// Returns the last formatted statement.
+///
+/// ## Panics
+/// If `first_suppressed` has no leading suppression comment.
+#[cold]
+pub(crate) fn write_suppressed_statements_starting_with_leading_comment<'a>(
+    // The first suppressed statement
+    first_suppressed: SuiteChildStatement<'a>,
+    statements: &mut std::slice::Iter<'a, Stmt>,
+    f: &mut PyFormatter,
+) -> FormatResult<&'a Stmt> {
+    let comments = f.context().comments().clone();
+    let source = f.context().source();
+
+    let mut leading_comment_ranges =
+        CommentRangeIter::outside_suppression(comments.leading_comments(first_suppressed), source);
+
+    let before_format_off = leading_comment_ranges
+        .next()
+        .expect("Suppressed node to have leading comments");
+
+    let (formatted_comments, format_off_comment) = before_format_off.unwrap_suppression_starts();
+
+    // Format the leading comments before the fmt off
+    // ```python
+    // # leading comment that gets formatted
+    // # fmt: off
+    // statement
+    // ```
+    write!(
+        f,
+        [
+            leading_comments(formatted_comments),
+            // Format the off comment without adding any trailing new lines
+            format_comment(format_off_comment)
+        ]
+    )?;
+
+    format_off_comment.mark_formatted();
+
+    // Now inside a suppressed range
+    write_suppressed_statements(
+        format_off_comment,
+        first_suppressed,
+        leading_comment_ranges.as_slice(),
+        statements,
+        f,
+    )
+}
+
+/// Disables formatting for all statements between the `last_formatted` and the first trailing or leading `fmt: on` comment.
+/// The statements are formatted as they appear in the source code.
+///
+/// Returns the last formatted statement.
+///
+/// ## Panics
+/// If `last_formatted` has no trailing suppression comment.
+#[cold]
+pub(crate) fn write_suppressed_statements_starting_with_trailing_comment<'a>(
+    last_formatted: SuiteChildStatement<'a>,
+    statements: &mut std::slice::Iter<'a, Stmt>,
+    f: &mut PyFormatter,
+) -> FormatResult<&'a Stmt> {
+    let comments = f.context().comments().clone();
+    let source = f.context().source();
+
+    let trailing_node_comments = comments.trailing_comments(last_formatted);
+    let mut trailing_comment_ranges =
+        CommentRangeIter::outside_suppression(trailing_node_comments, source);
+
+    // Formatted comments gets formatted as part of the statement.
+    let (_, mut format_off_comment) = trailing_comment_ranges
+        .next()
+        .expect("Suppressed statement to have trailing comments")
+        .unwrap_suppression_starts();
+
+    let maybe_suppressed = trailing_comment_ranges.as_slice();
+
+    // Mark them as formatted so that calling the node's formatting doesn't format the comments.
+    for comment in maybe_suppressed {
+        comment.mark_formatted();
+    }
+    format_off_comment.mark_formatted();
+
+    // Format the leading comments, the node, and the trailing comments up to the `fmt: off` comment.
+    last_formatted.fmt(f)?;
+
+    format_off_comment.mark_unformatted();
+    TrailingFormatOffComment(format_off_comment).fmt(f)?;
+
+    for range in trailing_comment_ranges {
+        match range {
+            // A `fmt: off`..`fmt: on` sequence. Disable formatting for the in-between comments.
+            // ```python
+            // def test():
+            //      pass
+            //      # fmt: off
+            //          # haha
+            //      # fmt: on
+            //      # fmt: off (maybe)
+            // ```
+            SuppressionComments::SuppressionEnds {
+                suppressed_comments: _,
+                format_on_comment,
+                formatted_comments,
+                format_off_comment: new_format_off_comment,
+            } => {
+                format_on_comment.mark_unformatted();
+
+                for comment in formatted_comments {
+                    comment.mark_unformatted();
+                }
+
+                write!(
+                    f,
+                    [
+                        verbatim_text(TextRange::new(
+                            format_off_comment.end(),
+                            format_on_comment.start(),
+                        )),
+                        trailing_comments(std::slice::from_ref(format_on_comment)),
+                        trailing_comments(formatted_comments),
+                    ]
+                )?;
+
+                // `fmt: off`..`fmt:on`..`fmt:off` sequence
+                // ```python
+                // def test():
+                //      pass
+                //      # fmt: off
+                //          # haha
+                //      # fmt: on
+                //      # fmt: off
+                // ```
+                if let Some(new_format_off_comment) = new_format_off_comment {
+                    new_format_off_comment.mark_unformatted();
+
+                    TrailingFormatOffComment(new_format_off_comment).fmt(f)?;
+
+                    format_off_comment = new_format_off_comment;
+                } else {
+                    // `fmt: off`..`fmt:on` sequence. The suppression ends here. Start formatting the nodes again.
+                    return Ok(last_formatted.statement());
+                }
+            }
+
+            // All comments in this range are suppressed
+            SuppressionComments::Suppressed { comments: _ } => {}
+            // SAFETY: Unreachable because the function returns as soon as we reach the end of the suppressed range
+            SuppressionComments::SuppressionStarts { .. }
+            | SuppressionComments::Formatted { .. } => unreachable!(),
+        }
+    }
+
+    // The statement with the suppression comment isn't the last statement in the suite.
+    // Format the statements up to the first `fmt: on` comment (or end of the suite) as verbatim/suppressed.
+    // ```python
+    // a + b
+    // # fmt: off
+    //
+    // def a():
+    //  pass
+    // ```
+    if let Some(first_suppressed) = statements.next() {
+        write_suppressed_statements(
+            format_off_comment,
+            SuiteChildStatement::Other(first_suppressed),
+            comments.leading_comments(first_suppressed),
+            statements,
+            f,
+        )
+    }
+    // The suppression comment is the block's last node. Format any trailing comments as suppressed
+    // ```python
+    // def test():
+    //      pass
+    //      # fmt: off
+    //      # a trailing comment
+    // ```
+    else if let Some(last_comment) = trailing_node_comments.last() {
+        verbatim_text(TextRange::new(format_off_comment.end(), last_comment.end())).fmt(f)?;
+        Ok(last_formatted.statement())
+    }
+    // The suppression comment is the very last code in the block. There's nothing more to format.
+    // ```python
+    // def test():
+    //      pass
+    //      # fmt: off
+    // ```
+    else {
+        Ok(last_formatted.statement())
+    }
+}
+
+/// Formats the statements from `first_suppressed` until the suppression ends (by a `fmt: on` comment)
+/// as they appear in the source code.
+fn write_suppressed_statements<'a>(
+    // The `fmt: off` comment that starts the suppressed range. Can be a leading comment of `first_suppressed` or
+    // a trailing comment of the previous node.
+    format_off_comment: &SourceComment,
+    // The first suppressed statement
+    first_suppressed: SuiteChildStatement<'a>,
+    // The leading comments of `first_suppressed` that come after the `format_off_comment`
+    first_suppressed_leading_comments: &[SourceComment],
+    // The remaining statements
+    statements: &mut std::slice::Iter<'a, Stmt>,
+    f: &mut PyFormatter,
+) -> FormatResult<&'a Stmt> {
+    let comments = f.context().comments().clone();
+    let source = f.context().source();
+
+    // TODO(micha) Fixup indent
+    let mut statement = first_suppressed;
+    let mut leading_node_comments = first_suppressed_leading_comments;
+    let mut format_off_comment = format_off_comment;
+
+    loop {
+        for range in CommentRangeIter::in_suppression(leading_node_comments, source) {
+            match range {
+                // All leading comments are suppressed
+                // ```python
+                // # suppressed comment
+                // statement
+                // ```
+                SuppressionComments::Suppressed { comments } => {
+                    for comment in comments {
+                        comment.mark_formatted();
+                    }
+                }
+
+                // Node has a leading `fmt: on` comment and maybe another `fmt: off` comment
+                // ```python
+                // # suppressed comment (optional)
+                // # fmt: on
+                // # formatted comment (optional)
+                // # fmt: off (optional)
+                // statement
+                // ```
+                SuppressionComments::SuppressionEnds {
+                    suppressed_comments,
+                    format_on_comment,
+                    formatted_comments,
+                    format_off_comment: new_format_off_comment,
+                } => {
+                    for comment in suppressed_comments {
+                        comment.mark_formatted();
+                    }
+
+                    write!(
+                        f,
+                        [
+                            verbatim_text(TextRange::new(
+                                format_off_comment.end(),
+                                format_on_comment.start(),
+                            )),
+                            leading_comments(std::slice::from_ref(format_on_comment)),
+                            leading_comments(formatted_comments),
+                        ]
+                    )?;
+
+                    if let Some(new_format_off_comment) = new_format_off_comment {
+                        format_off_comment = new_format_off_comment;
+                        format_comment(format_off_comment).fmt(f)?;
+                        format_off_comment.mark_formatted();
+                    } else {
+                        // Suppression ends here. Test if the node has a trailing suppression comment and, if so,
+                        // recurse and format the trailing comments and the following statements as suppressed.
+                        return if comments
+                            .trailing_comments(statement)
+                            .iter()
+                            .any(|comment| comment.is_suppression_off_comment(source))
+                        {
+                            // Node has a trailing suppression comment, hell yeah, start all over again.
+                            write_suppressed_statements_starting_with_trailing_comment(
+                                statement, statements, f,
+                            )
+                        } else {
+                            // Formats the trailing comments
+                            statement.fmt(f)?;
+                            Ok(statement.statement())
+                        };
+                    }
+                }
+
+                // Unreachable because the function exits as soon as it reaches the end of the suppression
+                // and it already starts in a suppressed range.
+                SuppressionComments::SuppressionStarts { .. } => unreachable!(),
+                SuppressionComments::Formatted { .. } => unreachable!(),
+            }
+        }
+
+        comments.mark_verbatim_node_comments_formatted(AnyNodeRef::from(statement));
+
+        for range in CommentRangeIter::in_suppression(comments.trailing_comments(statement), source)
+        {
+            match range {
+                // All leading comments are suppressed
+                // ```python
+                // statement
+                // # suppressed
+                // ```
+                SuppressionComments::Suppressed { comments } => {
+                    for comment in comments {
+                        comment.mark_formatted();
+                    }
+                }
+
+                // Node has a trailing `fmt: on` comment and maybe another `fmt: off` comment
+                // ```python
+                // statement
+                // # suppressed comment (optional)
+                // # fmt: on
+                // # formatted comment (optional)
+                // # fmt: off (optional)
+                // ```
+                SuppressionComments::SuppressionEnds {
+                    suppressed_comments,
+                    format_on_comment,
+                    formatted_comments,
+                    format_off_comment: new_format_off_comment,
+                } => {
+                    for comment in suppressed_comments {
+                        comment.mark_formatted();
+                    }
+
+                    write!(
+                        f,
+                        [
+                            verbatim_text(TextRange::new(
+                                format_off_comment.end(),
+                                format_on_comment.start()
+                            )),
+                            format_comment(format_on_comment),
+                            hard_line_break(),
+                            trailing_comments(formatted_comments),
+                        ]
+                    )?;
+
+                    format_on_comment.mark_formatted();
+
+                    if let Some(new_format_off_comment) = new_format_off_comment {
+                        format_off_comment = new_format_off_comment;
+                        format_comment(format_off_comment).fmt(f)?;
+                        format_off_comment.mark_formatted();
+                    } else {
+                        return Ok(statement.statement());
+                    }
+                }
+
+                // Unreachable because the function exits as soon as it reaches the end of the suppression
+                // and it already starts in a suppressed range.
+                SuppressionComments::SuppressionStarts { .. } => unreachable!(),
+                SuppressionComments::Formatted { .. } => unreachable!(),
+            }
+        }
+
+        if let Some(next_statement) = statements.next() {
+            statement = SuiteChildStatement::Other(next_statement);
+            leading_node_comments = comments.leading_comments(next_statement);
+        } else {
+            let end = comments
+                .trailing_comments(statement)
+                .last()
+                .map_or(statement.end(), Ranged::end);
+
+            verbatim_text(TextRange::new(format_off_comment.end(), end)).fmt(f)?;
+
+            return Ok(statement.statement());
+        }
+    }
+}
+
+#[derive(Copy, Clone, Debug)]
+enum InSuppression {
+    No,
+    Yes,
+}
+
+#[derive(Debug)]
+enum SuppressionComments<'a> {
+    /// The first `fmt: off` comment.
+    SuppressionStarts {
+        /// The comments appearing before the `fmt: off` comment
+        formatted_comments: &'a [SourceComment],
+        format_off_comment: &'a SourceComment,
+    },
+
+    /// A `fmt: on` comment inside a suppressed range.
+    SuppressionEnds {
+        /// The comments before the `fmt: on` comment that should *not* be formatted.
+        suppressed_comments: &'a [SourceComment],
+        format_on_comment: &'a SourceComment,
+
+        /// The comments after the `fmt: on` comment (if any), that should be formatted.
+        formatted_comments: &'a [SourceComment],
+
+        /// Any following `fmt: off` comment if any.
+        /// * `None`: The suppression ends here (for good)
+        /// * `Some`: A `fmt: off`..`fmt: on` .. `fmt: off` sequence. The suppression continues after
+        ///     the `fmt: off` comment.
+        format_off_comment: Option<&'a SourceComment>,
+    },
+
+    /// Comments that all fall into the suppressed range.
+    Suppressed { comments: &'a [SourceComment] },
+
+    /// Comments that all fall into the formatted range.
+    Formatted {
+        #[allow(unused)]
+        comments: &'a [SourceComment],
+    },
+}
+
+impl<'a> SuppressionComments<'a> {
+    fn unwrap_suppression_starts(&self) -> (&'a [SourceComment], &'a SourceComment) {
+        if let SuppressionComments::SuppressionStarts {
+            formatted_comments,
+            format_off_comment,
+        } = self
+        {
+            (formatted_comments, *format_off_comment)
+        } else {
+            panic!("Expected SuppressionStarts")
+        }
+    }
+}
+
+struct CommentRangeIter<'a> {
+    comments: &'a [SourceComment],
+    source: &'a str,
+    in_suppression: InSuppression,
+}
+
+impl<'a> CommentRangeIter<'a> {
+    fn in_suppression(comments: &'a [SourceComment], source: &'a str) -> Self {
+        Self {
+            comments,
+            in_suppression: InSuppression::Yes,
+            source,
+        }
+    }
+
+    fn outside_suppression(comments: &'a [SourceComment], source: &'a str) -> Self {
+        Self {
+            comments,
+            in_suppression: InSuppression::No,
+            source,
+        }
+    }
+
+    /// Returns a slice containing the remaining comments.
+    fn as_slice(&self) -> &'a [SourceComment] {
+        self.comments
+    }
+}
+
+impl<'a> Iterator for CommentRangeIter<'a> {
+    type Item = SuppressionComments<'a>;
+
+    fn next(&mut self) -> Option {
+        if self.comments.is_empty() {
+            return None;
+        }
+
+        Some(match self.in_suppression {
+            // Inside of a suppressed range
+            InSuppression::Yes => {
+                if let Some(format_on_position) = self
+                    .comments
+                    .iter()
+                    .position(|comment| comment.is_suppression_on_comment(self.source))
+                {
+                    let (suppressed_comments, formatted) =
+                        self.comments.split_at(format_on_position);
+                    let (format_on_comment, rest) = formatted.split_first().unwrap();
+
+                    let (formatted_comments, format_off_comment) =
+                        if let Some(format_off_position) = rest
+                            .iter()
+                            .position(|comment| comment.is_suppression_off_comment(self.source))
+                        {
+                            let (formatted_comments, suppressed_comments) =
+                                rest.split_at(format_off_position);
+                            let (format_off_comment, rest) =
+                                suppressed_comments.split_first().unwrap();
+
+                            self.comments = rest;
+
+                            (formatted_comments, Some(format_off_comment))
+                        } else {
+                            self.in_suppression = InSuppression::No;
+
+                            self.comments = &[];
+                            (rest, None)
+                        };
+
+                    SuppressionComments::SuppressionEnds {
+                        suppressed_comments,
+                        format_on_comment,
+                        formatted_comments,
+                        format_off_comment,
+                    }
+                } else {
+                    SuppressionComments::Suppressed {
+                        comments: std::mem::take(&mut self.comments),
+                    }
+                }
+            }
+
+            // Outside of a suppression
+            InSuppression::No => {
+                if let Some(format_off_position) = self
+                    .comments
+                    .iter()
+                    .position(|comment| comment.is_suppression_off_comment(self.source))
+                {
+                    self.in_suppression = InSuppression::Yes;
+
+                    let (formatted_comments, suppressed) =
+                        self.comments.split_at(format_off_position);
+                    let format_off_comment = &suppressed[0];
+
+                    self.comments = &suppressed[1..];
+
+                    SuppressionComments::SuppressionStarts {
+                        formatted_comments,
+                        format_off_comment,
+                    }
+                } else {
+                    SuppressionComments::Formatted {
+                        comments: std::mem::take(&mut self.comments),
+                    }
+                }
+            }
+        })
+    }
+}
+
+impl FusedIterator for CommentRangeIter<'_> {}
+
+struct TrailingFormatOffComment<'a>(&'a SourceComment);
+
+impl Format> for TrailingFormatOffComment<'_> {
+    fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> {
+        debug_assert!(self.0.is_unformatted());
+        let lines_before_comment = lines_before(self.0.start(), f.context().source());
+
+        write!(
+            f,
+            [empty_lines(lines_before_comment), format_comment(self.0)]
+        )?;
+
+        self.0.mark_formatted();
+
+        Ok(())
+    }
+}
+
+struct VerbatimText(TextRange);
+
+fn verbatim_text(item: T) -> VerbatimText
+where
+    T: Ranged,
+{
+    VerbatimText(item.range())
+}
+
+impl Format> for VerbatimText {
+    fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
+        f.write_element(FormatElement::Tag(Tag::StartVerbatim(
+            tag::VerbatimKind::Verbatim {
+                length: self.0.len(),
+            },
+        )))?;
+
+        match normalize_newlines(f.context().locator().slice(self.0), ['\r']) {
+            Cow::Borrowed(_) => {
+                write!(f, [source_text_slice(self.0, ContainsNewlines::Detect)])?;
+            }
+            Cow::Owned(cleaned) => {
+                write!(
+                    f,
+                    [
+                        dynamic_text(&cleaned, Some(self.0.start())),
+                        source_position(self.0.end())
+                    ]
+                )?;
+            }
+        }
+
+        f.write_element(FormatElement::Tag(Tag::EndVerbatim))
+    }
+}
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff.py.snap
index 16f03bc425..614cee9816 100644
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff.py.snap
@@ -198,77 +198,7 @@ d={'a':1,
 ```diff
 --- Black
 +++ Ruff
-@@ -6,8 +6,8 @@
- 
- from library import some_connection, some_decorator
- # fmt: off
--from third_party import (X,
--                         Y, Z)
-+from third_party import X, Y, Z
-+
- # fmt: on
- f"trigger 3.6 mode"
- # Comment 1
-@@ -17,26 +17,40 @@
- 
- # fmt: off
- def func_no_args():
--  a; b; c
--  if True: raise RuntimeError
--  if False: ...
--  for i in range(10):
--    print(i)
--    continue
--  exec('new-style exec', {}, {})
--  return None
-+    a
-+    b
-+    c
-+    if True:
-+        raise RuntimeError
-+    if False:
-+        ...
-+    for i in range(10):
-+        print(i)
-+        continue
-+    exec("new-style exec", {}, {})
-+    return None
-+
-+
- async def coroutine(arg, exec=False):
-- 'Single-line docstring. Multiline is harder to reformat.'
-- async with some_connection() as conn:
--     await conn.do_what_i_mean('SELECT bobby, tables FROM xkcd', timeout=2)
-- await asyncio.sleep(1)
-+    "Single-line docstring. Multiline is harder to reformat."
-+    async with some_connection() as conn:
-+        await conn.do_what_i_mean("SELECT bobby, tables FROM xkcd", timeout=2)
-+    await asyncio.sleep(1)
-+
-+
- @asyncio.coroutine
--@some_decorator(
--with_args=True,
--many_args=[1,2,3]
--)
--def function_signature_stress_test(number:int,no_annotation=None,text:str='default',* ,debug:bool=False,**kwargs) -> str:
-- return text[number:-1]
-+@some_decorator(with_args=True, many_args=[1, 2, 3])
-+def function_signature_stress_test(
-+    number: int,
-+    no_annotation=None,
-+    text: str = "default",
-+    *,
-+    debug: bool = False,
-+    **kwargs,
-+) -> str:
-+    return text[number:-1]
-+
-+
- # fmt: on
- def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r""):
-     offset = attr.ib(default=attr.Factory(lambda: _r.uniform(1, 2)))
-@@ -63,15 +77,15 @@
+@@ -63,15 +63,15 @@
  
  something = {
      # fmt: off
@@ -287,88 +217,28 @@ d={'a':1,
          # fmt: on
          goes + here,
          andhere,
-@@ -80,38 +94,42 @@
- 
- def import_as_names():
+@@ -122,8 +122,10 @@
+     """
      # fmt: off
--    from hello import a,        b
--    'unformatted'
-+    from hello import a, b
+ 
+-    # hey, that won't work
+ 
++        #hey, that won't work
++
 +
-+    "unformatted"
      # fmt: on
+     pass
  
- 
- def testlist_star_expr():
-     # fmt: off
--    a , b = *hello
--    'unformatted'
-+    a, b = *hello
-+    "unformatted"
-     # fmt: on
- 
- 
- def yield_expr():
-     # fmt: off
-     yield hello
--    'unformatted'
-+    "unformatted"
-     # fmt: on
-     "formatted"
-     # fmt: off
--    ( yield hello )
--    'unformatted'
-+    (yield hello)
-+    "unformatted"
-     # fmt: on
- 
- 
- def example(session):
-     # fmt: off
--    result = session\
--        .query(models.Customer.id)\
--        .filter(models.Customer.account_id == account_id,
--                models.Customer.email == email_address)\
--        .order_by(models.Customer.id.asc())\
-+    result = (
-+        session.query(models.Customer.id)
-+        .filter(
-+            models.Customer.account_id == account_id,
-+            models.Customer.email == email_address,
-+        )
-+        .order_by(models.Customer.id.asc())
-         .all()
-+    )
-     # fmt: on
- 
- 
-@@ -132,10 +150,10 @@
-     """Another known limitation."""
+@@ -138,7 +140,7 @@
+     now . considers . multiple . fmt . directives . within . one . prefix
      # fmt: on
      # fmt: off
--    this=should.not_be.formatted()
--    and_=indeed . it  is  not  formatted
--    because . the . handling . inside . generate_ignored_nodes()
--    now . considers . multiple . fmt . directives . within . one . prefix
-+    this = should.not_be.formatted()
-+    and_ = indeed.it is not formatted
-+    because.the.handling.inside.generate_ignored_nodes()
-+    now.considers.multiple.fmt.directives.within.one.prefix
+-    # ...but comments still get reformatted even though they should not be
++        # ...but comments still get reformatted even though they should not be
      # fmt: on
-     # fmt: off
-     # ...but comments still get reformatted even though they should not be
-@@ -153,9 +171,7 @@
-             )
-         )
-         # fmt: off
--        a = (
--            unnecessary_bracket()
--        )
-+        a = unnecessary_bracket()
-         # fmt: on
-     _type_comment_re = re.compile(
-         r"""
-@@ -178,7 +194,7 @@
+ 
+ 
+@@ -178,7 +180,7 @@
          $
          """,
          # fmt: off
@@ -377,18 +247,6 @@ d={'a':1,
          # fmt: on
      )
  
-@@ -216,8 +232,7 @@
-     xxxxxxxxxx_xxxxxxxxxxx_xxxxxxx_xxxxxxxxx=5,
- )
- # fmt: off
--yield  'hello'
-+yield "hello"
- # No formatting to the end of the file
--l=[1,2,3]
--d={'a':1,
--   'b':2}
-+l = [1, 2, 3]
-+d = {"a": 1, "b": 2}
 ```
 
 ## Ruff Output
@@ -402,8 +260,8 @@ from third_party import X, Y, Z
 
 from library import some_connection, some_decorator
 # fmt: off
-from third_party import X, Y, Z
-
+from third_party import (X,
+                         Y, Z)
 # fmt: on
 f"trigger 3.6 mode"
 # Comment 1
@@ -413,40 +271,26 @@ f"trigger 3.6 mode"
 
 # fmt: off
 def func_no_args():
-    a
-    b
-    c
-    if True:
-        raise RuntimeError
-    if False:
-        ...
-    for i in range(10):
-        print(i)
-        continue
-    exec("new-style exec", {}, {})
-    return None
-
-
+  a; b; c
+  if True: raise RuntimeError
+  if False: ...
+  for i in range(10):
+    print(i)
+    continue
+  exec('new-style exec', {}, {})
+  return None
 async def coroutine(arg, exec=False):
-    "Single-line docstring. Multiline is harder to reformat."
-    async with some_connection() as conn:
-        await conn.do_what_i_mean("SELECT bobby, tables FROM xkcd", timeout=2)
-    await asyncio.sleep(1)
-
-
+ 'Single-line docstring. Multiline is harder to reformat.'
+ async with some_connection() as conn:
+     await conn.do_what_i_mean('SELECT bobby, tables FROM xkcd', timeout=2)
+ await asyncio.sleep(1)
 @asyncio.coroutine
-@some_decorator(with_args=True, many_args=[1, 2, 3])
-def function_signature_stress_test(
-    number: int,
-    no_annotation=None,
-    text: str = "default",
-    *,
-    debug: bool = False,
-    **kwargs,
-) -> str:
-    return text[number:-1]
-
-
+@some_decorator(
+with_args=True,
+many_args=[1,2,3]
+)
+def function_signature_stress_test(number:int,no_annotation=None,text:str='default',* ,debug:bool=False,**kwargs) -> str:
+ return text[number:-1]
 # fmt: on
 def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r""):
     offset = attr.ib(default=attr.Factory(lambda: _r.uniform(1, 2)))
@@ -490,42 +334,38 @@ def subscriptlist():
 
 def import_as_names():
     # fmt: off
-    from hello import a, b
-
-    "unformatted"
+    from hello import a,        b
+    'unformatted'
     # fmt: on
 
 
 def testlist_star_expr():
     # fmt: off
-    a, b = *hello
-    "unformatted"
+    a , b = *hello
+    'unformatted'
     # fmt: on
 
 
 def yield_expr():
     # fmt: off
     yield hello
-    "unformatted"
+    'unformatted'
     # fmt: on
     "formatted"
     # fmt: off
-    (yield hello)
-    "unformatted"
+    ( yield hello )
+    'unformatted'
     # fmt: on
 
 
 def example(session):
     # fmt: off
-    result = (
-        session.query(models.Customer.id)
-        .filter(
-            models.Customer.account_id == account_id,
-            models.Customer.email == email_address,
-        )
-        .order_by(models.Customer.id.asc())
+    result = session\
+        .query(models.Customer.id)\
+        .filter(models.Customer.account_id == account_id,
+                models.Customer.email == email_address)\
+        .order_by(models.Customer.id.asc())\
         .all()
-    )
     # fmt: on
 
 
@@ -536,7 +376,9 @@ def off_and_on_without_data():
     """
     # fmt: off
 
-    # hey, that won't work
+
+        #hey, that won't work
+
 
     # fmt: on
     pass
@@ -546,13 +388,13 @@ def on_and_off_broken():
     """Another known limitation."""
     # fmt: on
     # fmt: off
-    this = should.not_be.formatted()
-    and_ = indeed.it is not formatted
-    because.the.handling.inside.generate_ignored_nodes()
-    now.considers.multiple.fmt.directives.within.one.prefix
+    this=should.not_be.formatted()
+    and_=indeed . it  is  not  formatted
+    because . the . handling . inside . generate_ignored_nodes()
+    now . considers . multiple . fmt . directives . within . one . prefix
     # fmt: on
     # fmt: off
-    # ...but comments still get reformatted even though they should not be
+        # ...but comments still get reformatted even though they should not be
     # fmt: on
 
 
@@ -567,7 +409,9 @@ def long_lines():
             )
         )
         # fmt: off
-        a = unnecessary_bracket()
+        a = (
+            unnecessary_bracket()
+        )
         # fmt: on
     _type_comment_re = re.compile(
         r"""
@@ -628,10 +472,11 @@ cfg.rule(
     xxxxxxxxxx_xxxxxxxxxxx_xxxxxxx_xxxxxxxxx=5,
 )
 # fmt: off
-yield "hello"
+yield  'hello'
 # No formatting to the end of the file
-l = [1, 2, 3]
-d = {"a": 1, "b": 2}
+l=[1,2,3]
+d={'a':1,
+   'b':2}
 ```
 
 ## Black Output
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff2.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff2.py.snap
deleted file mode 100644
index 012dd71335..0000000000
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff2.py.snap
+++ /dev/null
@@ -1,201 +0,0 @@
----
-source: crates/ruff_python_formatter/tests/fixtures.rs
-input_file: crates/ruff_python_formatter/resources/test/fixtures/black/simple_cases/fmtonoff2.py
----
-## Input
-
-```py
-import pytest
-
-TmSt = 1
-TmEx = 2
-
-# fmt: off
-
-# Test data:
-#   Position, Volume, State, TmSt/TmEx/None, [call, [arg1...]]
-
-@pytest.mark.parametrize('test', [
-
-    # Test don't manage the volume
-    [
-        ('stuff', 'in')
-    ],
-])
-def test_fader(test):
-    pass
-
-def check_fader(test):
-
-    pass
-
-def verify_fader(test):
-  # misaligned comment
-    pass
-
-def verify_fader(test):
-    """Hey, ho."""
-    assert test.passed()
-
-def test_calculate_fades():
-    calcs = [
-        # one is zero/none
-        (0, 4, 0, 0, 10,        0, 0, 6, 10),
-        (None, 4, 0, 0, 10,     0, 0, 6, 10),
-    ]
-
-# fmt: on
-```
-
-## Black Differences
-
-```diff
---- Black
-+++ Ruff
-@@ -5,36 +5,40 @@
- 
- # fmt: off
- 
-+
- # Test data:
- #   Position, Volume, State, TmSt/TmEx/None, [call, [arg1...]]
- 
--@pytest.mark.parametrize('test', [
--
--    # Test don't manage the volume
-+@pytest.mark.parametrize(
-+    "test",
-     [
--        ('stuff', 'in')
-+        # Test don't manage the volume
-+        [("stuff", "in")],
-     ],
--])
-+)
- def test_fader(test):
-     pass
- 
-+
- def check_fader(test):
--
-     pass
- 
-+
- def verify_fader(test):
--  # misaligned comment
-+    # misaligned comment
-     pass
- 
-+
- def verify_fader(test):
-     """Hey, ho."""
-     assert test.passed()
- 
-+
- def test_calculate_fades():
-     calcs = [
-         # one is zero/none
--        (0, 4, 0, 0, 10,        0, 0, 6, 10),
--        (None, 4, 0, 0, 10,     0, 0, 6, 10),
-+        (0, 4, 0, 0, 10, 0, 0, 6, 10),
-+        (None, 4, 0, 0, 10, 0, 0, 6, 10),
-     ]
- 
- # fmt: on
-```
-
-## Ruff Output
-
-```py
-import pytest
-
-TmSt = 1
-TmEx = 2
-
-# fmt: off
-
-
-# Test data:
-#   Position, Volume, State, TmSt/TmEx/None, [call, [arg1...]]
-
-@pytest.mark.parametrize(
-    "test",
-    [
-        # Test don't manage the volume
-        [("stuff", "in")],
-    ],
-)
-def test_fader(test):
-    pass
-
-
-def check_fader(test):
-    pass
-
-
-def verify_fader(test):
-    # misaligned comment
-    pass
-
-
-def verify_fader(test):
-    """Hey, ho."""
-    assert test.passed()
-
-
-def test_calculate_fades():
-    calcs = [
-        # one is zero/none
-        (0, 4, 0, 0, 10, 0, 0, 6, 10),
-        (None, 4, 0, 0, 10, 0, 0, 6, 10),
-    ]
-
-# fmt: on
-```
-
-## Black Output
-
-```py
-import pytest
-
-TmSt = 1
-TmEx = 2
-
-# fmt: off
-
-# Test data:
-#   Position, Volume, State, TmSt/TmEx/None, [call, [arg1...]]
-
-@pytest.mark.parametrize('test', [
-
-    # Test don't manage the volume
-    [
-        ('stuff', 'in')
-    ],
-])
-def test_fader(test):
-    pass
-
-def check_fader(test):
-
-    pass
-
-def verify_fader(test):
-  # misaligned comment
-    pass
-
-def verify_fader(test):
-    """Hey, ho."""
-    assert test.passed()
-
-def test_calculate_fades():
-    calcs = [
-        # one is zero/none
-        (0, 4, 0, 0, 10,        0, 0, 6, 10),
-        (None, 4, 0, 0, 10,     0, 0, 6, 10),
-    ]
-
-# fmt: on
-```
-
-
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff3.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff3.py.snap
deleted file mode 100644
index 42ebc85486..0000000000
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff3.py.snap
+++ /dev/null
@@ -1,101 +0,0 @@
----
-source: crates/ruff_python_formatter/tests/fixtures.rs
-input_file: crates/ruff_python_formatter/resources/test/fixtures/black/simple_cases/fmtonoff3.py
----
-## Input
-
-```py
-# fmt: off
-x = [
-    1, 2,
-    3, 4,
-]
-# fmt: on
-
-# fmt: off
-x = [
-    1, 2,
-    3, 4,
-]
-# fmt: on
-
-x = [
-    1, 2, 3, 4
-]
-```
-
-## Black Differences
-
-```diff
---- Black
-+++ Ruff
-@@ -1,14 +1,18 @@
- # fmt: off
- x = [
--    1, 2,
--    3, 4,
-+    1,
-+    2,
-+    3,
-+    4,
- ]
- # fmt: on
- 
- # fmt: off
- x = [
--    1, 2,
--    3, 4,
-+    1,
-+    2,
-+    3,
-+    4,
- ]
- # fmt: on
- 
-```
-
-## Ruff Output
-
-```py
-# fmt: off
-x = [
-    1,
-    2,
-    3,
-    4,
-]
-# fmt: on
-
-# fmt: off
-x = [
-    1,
-    2,
-    3,
-    4,
-]
-# fmt: on
-
-x = [1, 2, 3, 4]
-```
-
-## Black Output
-
-```py
-# fmt: off
-x = [
-    1, 2,
-    3, 4,
-]
-# fmt: on
-
-# fmt: off
-x = [
-    1, 2,
-    3, 4,
-]
-# fmt: on
-
-x = [1, 2, 3, 4]
-```
-
-
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff4.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff4.py.snap
index a8dc2ef620..5962f31f5f 100644
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff4.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff4.py.snap
@@ -25,52 +25,48 @@ def f(): pass
 ```diff
 --- Black
 +++ Ruff
-@@ -1,8 +1,12 @@
- # fmt: off
--@test([
--    1, 2,
--    3, 4,
--])
-+@test(
-+    [
-+        1,
-+        2,
-+        3,
-+        4,
-+    ]
-+)
+@@ -4,17 +4,10 @@
+     3, 4,
+ ])
  # fmt: on
- def f():
-     pass
+-def f():
+-    pass
+-
++def f(): pass
+ 
+-@test(
+-    [
+-        1,
+-        2,
+-        3,
+-        4,
+-    ]
+-)
+-def f():
+-    pass
++@test([
++    1, 2,
++    3, 4,
++])
++def f(): pass
 ```
 
 ## Ruff Output
 
 ```py
 # fmt: off
-@test(
-    [
-        1,
-        2,
-        3,
-        4,
-    ]
-)
+@test([
+    1, 2,
+    3, 4,
+])
 # fmt: on
-def f():
-    pass
+def f(): pass
 
-
-@test(
-    [
-        1,
-        2,
-        3,
-        4,
-    ]
-)
-def f():
-    pass
+@test([
+    1, 2,
+    3, 4,
+])
+def f(): pass
 ```
 
 ## Black Output
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff5.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff5.py.snap
index 99e98844ff..b28415f3ac 100644
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff5.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtonoff5.py.snap
@@ -110,57 +110,7 @@ elif   unformatted:
      },
  )
  
-@@ -27,7 +26,7 @@
- # Regression test for https://github.com/psf/black/issues/3026.
- def test_func():
-     # yapf: disable
--    if  unformatted(  args  ):
-+    if unformatted(args):
-         return True
-     # yapf: enable
-     elif b:
-@@ -39,10 +38,10 @@
- # Regression test for https://github.com/psf/black/issues/2567.
- if True:
-     # fmt: off
--    for _ in range( 1 ):
--    # fmt: on
--        print ( "This won't be formatted" )
--    print ( "This won't be formatted either" )
-+    for _ in range(1):
-+        # fmt: on
-+        print("This won't be formatted")
-+    print("This won't be formatted either")
- else:
-     print("This will be formatted")
- 
-@@ -52,14 +51,12 @@
-     async def call(param):
-         if param:
-             # fmt: off
--            if param[0:4] in (
--                "ABCD", "EFGH"
--            )  :
-+            if param[0:4] in ("ABCD", "EFGH"):
-                 # fmt: on
--                print ( "This won't be formatted" )
-+                print("This won't be formatted")
- 
-             elif param[0:4] in ("ZZZZ",):
--                print ( "This won't be formatted either" )
-+                print("This won't be formatted either")
- 
-         print("This will be formatted")
- 
-@@ -68,13 +65,13 @@
- class Named(t.Protocol):
-     # fmt: off
-     @property
--    def  this_wont_be_formatted ( self ) -> str: ...
-+    def this_wont_be_formatted(self) -> str:
-+        ...
- 
- 
+@@ -74,7 +73,6 @@
  class Factory(t.Protocol):
      def this_will_be_formatted(self, **kwargs) -> Named:
          ...
@@ -168,7 +118,7 @@ elif   unformatted:
      # fmt: on
  
  
-@@ -82,6 +79,6 @@
+@@ -82,6 +80,6 @@
  if x:
      return x
  # fmt: off
@@ -209,7 +159,7 @@ run(
 # Regression test for https://github.com/psf/black/issues/3026.
 def test_func():
     # yapf: disable
-    if unformatted(args):
+    if  unformatted(  args  ):
         return True
     # yapf: enable
     elif b:
@@ -221,10 +171,10 @@ def test_func():
 # Regression test for https://github.com/psf/black/issues/2567.
 if True:
     # fmt: off
-    for _ in range(1):
-        # fmt: on
-        print("This won't be formatted")
-    print("This won't be formatted either")
+    for _ in range( 1 ):
+    # fmt: on
+        print ( "This won't be formatted" )
+    print ( "This won't be formatted either" )
 else:
     print("This will be formatted")
 
@@ -234,12 +184,14 @@ class A:
     async def call(param):
         if param:
             # fmt: off
-            if param[0:4] in ("ABCD", "EFGH"):
+            if param[0:4] in (
+                "ABCD", "EFGH"
+            )  :
                 # fmt: on
-                print("This won't be formatted")
+                print ( "This won't be formatted" )
 
             elif param[0:4] in ("ZZZZ",):
-                print("This won't be formatted either")
+                print ( "This won't be formatted either" )
 
         print("This will be formatted")
 
@@ -248,8 +200,7 @@ class A:
 class Named(t.Protocol):
     # fmt: off
     @property
-    def this_wont_be_formatted(self) -> str:
-        ...
+    def  this_wont_be_formatted ( self ) -> str: ...
 
 
 class Factory(t.Protocol):
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtskip3.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtskip3.py.snap
deleted file mode 100644
index 002454e8da..0000000000
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__fmtskip3.py.snap
+++ /dev/null
@@ -1,64 +0,0 @@
----
-source: crates/ruff_python_formatter/tests/fixtures.rs
-input_file: crates/ruff_python_formatter/resources/test/fixtures/black/simple_cases/fmtskip3.py
----
-## Input
-
-```py
-a  =    3
-# fmt: off
-b,    c = 1, 2
-d =    6  # fmt: skip
-e = 5
-# fmt: on
-f = ["This is a very long line that should be formatted into a clearer line ", "by rearranging."]
-```
-
-## Black Differences
-
-```diff
---- Black
-+++ Ruff
-@@ -1,7 +1,7 @@
- a = 3
- # fmt: off
--b,    c = 1, 2
--d =    6  # fmt: skip
-+b, c = 1, 2
-+d = 6  # fmt: skip
- e = 5
- # fmt: on
- f = [
-```
-
-## Ruff Output
-
-```py
-a = 3
-# fmt: off
-b, c = 1, 2
-d = 6  # fmt: skip
-e = 5
-# fmt: on
-f = [
-    "This is a very long line that should be formatted into a clearer line ",
-    "by rearranging.",
-]
-```
-
-## Black Output
-
-```py
-a = 3
-# fmt: off
-b,    c = 1, 2
-d =    6  # fmt: skip
-e = 5
-# fmt: on
-f = [
-    "This is a very long line that should be formatted into a clearer line ",
-    "by rearranging.",
-]
-```
-
-
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap
new file mode 100644
index 0000000000..f961fc36e8
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap
@@ -0,0 +1,60 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py
+---
+## Input
+```py
+pass
+
+# fmt: off
+  # A comment that falls into the verbatim range
+a +   b # a trailing comment
+
+# in between comments
+
+# function comment
+def test():
+    pass
+
+    # trailing comment that falls into the verbatim range
+
+  # fmt: on
+
+a +   b
+
+def test():
+    pass
+    # fmt: off
+    # a trailing comment
+
+```
+
+## Output
+```py
+pass
+
+# fmt: off
+  # A comment that falls into the verbatim range
+a +   b # a trailing comment
+
+# in between comments
+
+# function comment
+def test():
+    pass
+
+    # trailing comment that falls into the verbatim range
+
+  # fmt: on
+
+a + b
+
+
+def test():
+    pass
+    # fmt: off
+    # a trailing comment
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__empty_file.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__empty_file.py.snap
new file mode 100644
index 0000000000..7dbe39d5d1
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__empty_file.py.snap
@@ -0,0 +1,24 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/empty_file.py
+---
+## Input
+```py
+# fmt: off
+
+    # this does not work because there are no statements
+
+# fmt: on
+```
+
+## Output
+```py
+# fmt: off
+
+# this does not work because there are no statements
+
+# fmt: on
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap
new file mode 100644
index 0000000000..396dd028e3
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap
@@ -0,0 +1,52 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.py
+---
+## Input
+```py
+def test():
+    # fmt: off
+    """ This docstring does not
+        get formatted
+    """
+
+    # fmt: on
+
+    but + this  + does
+
+def test():
+    # fmt: off
+        # just for fun
+    # fmt: on
+        # leading comment
+    """   This docstring gets formatted
+    """ # trailing comment
+
+    and_this +  gets + formatted + too
+```
+
+## Output
+```py
+def test():
+    # fmt: off
+    """ This docstring does not
+        get formatted
+    """
+
+    # fmt: on
+
+    but + this + does
+
+
+def test():
+    # fmt: off
+        # just for fun
+    # fmt: on
+    # leading comment
+    """This docstring gets formatted"""  # trailing comment
+
+    and_this + gets + formatted + too
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__form_feed.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__form_feed.py.snap
new file mode 100644
index 0000000000..0c009fa424
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__form_feed.py.snap
@@ -0,0 +1,28 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/form_feed.py
+---
+## Input
+```py
+# fmt: off
+# DB layer  (form feed at the start of the next line)
+
+# fmt: on
+
+def test():
+    pass
+```
+
+## Output
+```py
+# fmt: off
+# DB layer  (form feed at the start of the next line)
+
+# fmt: on
+
+def test():
+    pass
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__last_statement.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__last_statement.py.snap
new file mode 100644
index 0000000000..07d0eeaf0c
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__last_statement.py.snap
@@ -0,0 +1,35 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/last_statement.py
+---
+## Input
+```py
+def test():
+    # fmt: off
+
+    a  + b
+
+
+
+        # suppressed comments
+
+a   + b # formatted
+```
+
+## Output
+```py
+def test():
+    # fmt: off
+
+    a  + b
+
+
+
+        # suppressed comments
+
+
+a + b  # formatted
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__no_fmt_on.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__no_fmt_on.py.snap
new file mode 100644
index 0000000000..15ded04ff6
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__no_fmt_on.py.snap
@@ -0,0 +1,33 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/no_fmt_on.py
+---
+## Input
+```py
+def test():
+    # fmt: off
+    not   formatted
+
+    if unformatted +  a:
+        pass
+
+# Get's formatted again
+a   + b
+```
+
+## Output
+```py
+def test():
+    # fmt: off
+    not   formatted
+
+    if unformatted +  a:
+        pass
+
+
+# Get's formatted again
+a + b
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__off_on_off_on.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__off_on_off_on.py.snap
new file mode 100644
index 0000000000..c33f5faa9b
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__off_on_off_on.py.snap
@@ -0,0 +1,156 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/off_on_off_on.py
+---
+## Input
+```py
+# Tricky sequences of fmt off and on
+
+# Formatted
+a +   b
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+a   + b
+    # formatted
+
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+    # not formatted 2
+# fmt: off
+a   + b
+# fmt: on
+
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+    # formatted 1
+# fmt: off
+    # not formatted 2
+a   + b
+# fmt: on
+    # formatted
+b   + c
+
+
+# fmt: off
+a   + b
+
+    # not formatted
+# fmt: on
+    # formatted
+a   + b
+
+
+# fmt: off
+a   + b
+
+    # not formatted 1
+# fmt: on
+    # formatted
+# fmt: off
+    # not formatted 2
+a   + b
+
+
+# fmt: off
+a   + b
+
+    # not formatted 1
+# fmt: on
+    # formatted
+
+# leading
+a    + b
+# fmt: off
+
+    # leading unformatted
+def test  ():
+    pass
+
+ # fmt: on
+
+a   + b
+```
+
+## Output
+```py
+# Tricky sequences of fmt off and on
+
+# Formatted
+a + b
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+a + b
+# formatted
+
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+# not formatted 2
+# fmt: off
+a   + b
+# fmt: on
+
+
+# fmt: off
+    # not formatted 1
+# fmt: on
+# formatted 1
+# fmt: off
+    # not formatted 2
+a   + b
+# fmt: on
+# formatted
+b + c
+
+
+# fmt: off
+a   + b
+
+    # not formatted
+# fmt: on
+# formatted
+a + b
+
+
+# fmt: off
+a   + b
+
+    # not formatted 1
+# fmt: on
+# formatted
+# fmt: off
+    # not formatted 2
+a   + b
+
+
+# fmt: off
+a   + b
+
+    # not formatted 1
+# fmt: on
+# formatted
+
+# leading
+a + b
+# fmt: off
+
+    # leading unformatted
+def test  ():
+    pass
+
+ # fmt: on
+
+a + b
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__simple.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__simple.py.snap
new file mode 100644
index 0000000000..e9f968a425
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__simple.py.snap
@@ -0,0 +1,32 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/simple.py
+---
+## Input
+```py
+# Get's formatted
+a +   b
+
+# fmt: off
+a + [1, 2, 3, 4, 5  ]
+# fmt: on
+
+# Get's formatted again
+a +  b
+```
+
+## Output
+```py
+# Get's formatted
+a + b
+
+# fmt: off
+a + [1, 2, 3, 4, 5  ]
+# fmt: on
+
+# Get's formatted again
+a + b
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__trailing_comments.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__trailing_comments.py.snap
new file mode 100644
index 0000000000..e80951bd3a
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__trailing_comments.py.snap
@@ -0,0 +1,96 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/trailing_comments.py
+---
+## Input
+```py
+a = 10
+# fmt: off
+
+# more format
+
+def test(): ...
+
+
+# fmt: on
+
+b =   20
+# Sequence of trailing comments that toggle between format on and off. The sequence ends with a `fmt: on`, so that the function gets formatted.
+#   formatted 1
+# fmt: off
+    # not formatted
+# fmt: on
+    # formatted comment
+# fmt: off
+    # not formatted 2
+# fmt: on
+
+    # formatted
+def test2  ():
+    ...
+
+a =   10
+
+# Sequence of trailing comments that toggles between format on and off. The sequence ends with a `fmt: off`, so that the function is not formatted.
+    # formatted 1
+# fmt: off
+    # not formatted
+# fmt: on
+    # formattd
+# fmt: off
+
+    # not formatted
+def test3  ():
+    ...
+
+# fmt: on
+```
+
+## Output
+```py
+a = 10
+# fmt: off
+
+# more format
+
+def test(): ...
+
+
+# fmt: on
+
+b = 20
+# Sequence of trailing comments that toggle between format on and off. The sequence ends with a `fmt: on`, so that the function gets formatted.
+#   formatted 1
+# fmt: off
+    # not formatted
+# fmt: on
+# formatted comment
+# fmt: off
+    # not formatted 2
+# fmt: on
+
+
+# formatted
+def test2():
+    ...
+
+
+a = 10
+
+# Sequence of trailing comments that toggles between format on and off. The sequence ends with a `fmt: off`, so that the function is not formatted.
+# formatted 1
+# fmt: off
+    # not formatted
+# fmt: on
+# formattd
+# fmt: off
+
+    # not formatted
+def test3  ():
+    ...
+
+# fmt: on
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__yapf.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__yapf.py.snap
new file mode 100644
index 0000000000..45f0ad07d0
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__yapf.py.snap
@@ -0,0 +1,48 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/yapf.py
+---
+## Input
+```py
+# Get's formatted
+a +   b
+
+# yapf: disable
+a + [1, 2, 3, 4, 5  ]
+# yapf: enable
+
+# Get's formatted again
+a +  b
+
+
+# yapf: disable
+a + [1, 2, 3, 4, 5   ]
+# fmt: on
+
+# Get's formatted again
+a +  b
+```
+
+## Output
+```py
+# Get's formatted
+a + b
+
+# yapf: disable
+a + [1, 2, 3, 4, 5  ]
+# yapf: enable
+
+# Get's formatted again
+a + b
+
+
+# yapf: disable
+a + [1, 2, 3, 4, 5   ]
+# fmt: on
+
+# Get's formatted again
+a + b
+```
+
+
+

From 96d310fbab0112f8ab899f6d665f79a5aecdafd5 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 13:39:44 -0400
Subject: [PATCH 115/155] Remove `Stmt::TryStar` (#6566)

## Summary

Instead, we set an `is_star` flag on `Stmt::Try`. This is similar to the
pattern we've migrated towards for `Stmt::For` (removing
`Stmt::AsyncFor`) and friends. While these are significant differences
for an interpreter, we tend to handle these cases identically or nearly
identically.

## Test Plan

`cargo test`
---
 crates/ruff/src/autofix/edits.rs              |   9 +-
 .../src/checkers/ast/analyze/statement.rs     |   9 +-
 crates/ruff/src/checkers/ast/mod.rs           |   9 +-
 .../rules/jump_statement_in_finally.rs        |   1 -
 .../src/rules/flake8_return/rules/function.rs |   2 +-
 crates/ruff/src/rules/isort/block.rs          |   9 +-
 .../mccabe/rules/function_is_too_complex.rs   |   9 +-
 .../rules/pylint/rules/continue_in_finally.rs |   3 +-
 .../rules/pylint/rules/too_many_branches.rs   |   9 +-
 .../rules/pylint/rules/too_many_statements.rs |   9 +-
 .../pylint/rules/useless_else_on_loop.rs      |   7 -
 .../ruff/src/rules/ruff/rules/unreachable.rs  |  11 +-
 .../tryceratops/rules/raise_within_try.rs     |   2 +-
 .../rules/tryceratops/rules/verbose_raise.rs  |   3 -
 crates/ruff_python_ast/src/comparable.rs      |  24 +---
 crates/ruff_python_ast/src/helpers.rs         |  13 +-
 crates/ruff_python_ast/src/node.rs            |  83 +-----------
 crates/ruff_python_ast/src/nodes.rs           |  30 +----
 .../ruff_python_ast/src/statement_visitor.rs  |  16 +--
 crates/ruff_python_ast/src/traversal.rs       |  21 ---
 crates/ruff_python_ast/src/visitor.rs         |  15 +--
 .../ruff_python_ast/src/visitor/preorder.rs   |   1 -
 crates/ruff_python_codegen/src/generator.rs   |  34 +----
 .../src/comments/placement.rs                 |  19 ---
 crates/ruff_python_formatter/src/generated.rs |  36 -----
 .../src/statement/mod.rs                      |   2 -
 .../src/statement/stmt_try.rs                 | 126 ++++--------------
 .../src/statement/stmt_try_star.rs            |  19 ---
 crates/ruff_python_parser/src/python.lalrpop  |   7 +-
 crates/ruff_python_parser/src/python.rs       |   9 +-
 ...uff_python_parser__parser__tests__try.snap |   1 +
 ...ython_parser__parser__tests__try_star.snap |   5 +-
 .../src/analyze/branch_detection.rs           |   6 -
 33 files changed, 70 insertions(+), 489 deletions(-)
 delete mode 100644 crates/ruff_python_formatter/src/statement/stmt_try_star.rs

diff --git a/crates/ruff/src/autofix/edits.rs b/crates/ruff/src/autofix/edits.rs
index 6bdc112ffb..1ab80106af 100644
--- a/crates/ruff/src/autofix/edits.rs
+++ b/crates/ruff/src/autofix/edits.rs
@@ -209,14 +209,7 @@ fn is_lone_child(child: &Stmt, parent: &Stmt) -> bool {
             handlers,
             orelse,
             finalbody,
-            range: _,
-        })
-        | Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
-            range: _,
+            ..
         }) => {
             if is_only(body, child)
                 || is_only(orelse, child)
diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs
index 880bec99dc..c7f2d0223d 100644
--- a/crates/ruff/src/checkers/ast/analyze/statement.rs
+++ b/crates/ruff/src/checkers/ast/analyze/statement.rs
@@ -1225,14 +1225,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) {
             handlers,
             orelse,
             finalbody,
-            range: _,
-        })
-        | Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
-            range: _,
+            ..
         }) => {
             if checker.enabled(Rule::JumpStatementInFinally) {
                 flake8_bugbear::rules::jump_statement_in_finally(checker, finalbody);
diff --git a/crates/ruff/src/checkers/ast/mod.rs b/crates/ruff/src/checkers/ast/mod.rs
index 4eb0589eb2..fce7af9fbe 100644
--- a/crates/ruff/src/checkers/ast/mod.rs
+++ b/crates/ruff/src/checkers/ast/mod.rs
@@ -599,14 +599,7 @@ where
                 handlers,
                 orelse,
                 finalbody,
-                range: _,
-            })
-            | Stmt::TryStar(ast::StmtTryStar {
-                body,
-                handlers,
-                orelse,
-                finalbody,
-                range: _,
+                ..
             }) => {
                 let mut handled_exceptions = Exceptions::empty();
                 for type_ in extract_handled_exceptions(handlers) {
diff --git a/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs b/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs
index 2d796f4706..5c5ca90cb7 100644
--- a/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs
+++ b/crates/ruff/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs
@@ -74,7 +74,6 @@ fn walk_stmt(checker: &mut Checker, body: &[Stmt], f: fn(&Stmt) -> bool) {
             }
             Stmt::If(ast::StmtIf { body, .. })
             | Stmt::Try(ast::StmtTry { body, .. })
-            | Stmt::TryStar(ast::StmtTryStar { body, .. })
             | Stmt::With(ast::StmtWith { body, .. }) => {
                 walk_stmt(checker, body, f);
             }
diff --git a/crates/ruff/src/rules/flake8_return/rules/function.rs b/crates/ruff/src/rules/flake8_return/rules/function.rs
index 90dfb25173..cb470bde87 100644
--- a/crates/ruff/src/rules/flake8_return/rules/function.rs
+++ b/crates/ruff/src/rules/flake8_return/rules/function.rs
@@ -457,7 +457,7 @@ fn implicit_return(checker: &mut Checker, stmt: &Stmt) {
                 implicit_return(checker, last_stmt);
             }
         }
-        Stmt::Return(_) | Stmt::Raise(_) | Stmt::Try(_) | Stmt::TryStar(_) => {}
+        Stmt::Return(_) | Stmt::Raise(_) | Stmt::Try(_) => {}
         Stmt::Expr(ast::StmtExpr { value, .. })
             if matches!(
                 value.as_ref(),
diff --git a/crates/ruff/src/rules/isort/block.rs b/crates/ruff/src/rules/isort/block.rs
index 3832444b4c..cc32b50a50 100644
--- a/crates/ruff/src/rules/isort/block.rs
+++ b/crates/ruff/src/rules/isort/block.rs
@@ -254,14 +254,7 @@ where
                 handlers,
                 orelse,
                 finalbody,
-                range: _,
-            })
-            | Stmt::TryStar(ast::StmtTryStar {
-                body,
-                handlers,
-                orelse,
-                finalbody,
-                range: _,
+                ..
             }) => {
                 for except_handler in handlers {
                     self.visit_except_handler(except_handler);
diff --git a/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs b/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs
index 60938d334c..c56ae7e2ed 100644
--- a/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs
+++ b/crates/ruff/src/rules/mccabe/rules/function_is_too_complex.rs
@@ -106,14 +106,7 @@ fn get_complexity_number(stmts: &[Stmt]) -> usize {
                 handlers,
                 orelse,
                 finalbody,
-                range: _,
-            })
-            | Stmt::TryStar(ast::StmtTryStar {
-                body,
-                handlers,
-                orelse,
-                finalbody,
-                range: _,
+                ..
             }) => {
                 complexity += get_complexity_number(body);
                 if !orelse.is_empty() {
diff --git a/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs b/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs
index 8624f65304..78e4ae85aa 100644
--- a/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs
+++ b/crates/ruff/src/rules/pylint/rules/continue_in_finally.rs
@@ -64,8 +64,7 @@ fn traverse_body(checker: &mut Checker, body: &[Stmt]) {
                     traverse_body(checker, &clause.body);
                 }
             }
-            Stmt::Try(ast::StmtTry { body, orelse, .. })
-            | Stmt::TryStar(ast::StmtTryStar { body, orelse, .. }) => {
+            Stmt::Try(ast::StmtTry { body, orelse, .. }) => {
                 traverse_body(checker, body);
                 traverse_body(checker, orelse);
             }
diff --git a/crates/ruff/src/rules/pylint/rules/too_many_branches.rs b/crates/ruff/src/rules/pylint/rules/too_many_branches.rs
index 1c5615eea9..7c083b10f7 100644
--- a/crates/ruff/src/rules/pylint/rules/too_many_branches.rs
+++ b/crates/ruff/src/rules/pylint/rules/too_many_branches.rs
@@ -121,14 +121,7 @@ fn num_branches(stmts: &[Stmt]) -> usize {
                 handlers,
                 orelse,
                 finalbody,
-                range: _,
-            })
-            | Stmt::TryStar(ast::StmtTryStar {
-                body,
-                handlers,
-                orelse,
-                finalbody,
-                range: _,
+                ..
             }) => {
                 1 + num_branches(body)
                     + (if orelse.is_empty() {
diff --git a/crates/ruff/src/rules/pylint/rules/too_many_statements.rs b/crates/ruff/src/rules/pylint/rules/too_many_statements.rs
index a026c6f12b..406f5959fc 100644
--- a/crates/ruff/src/rules/pylint/rules/too_many_statements.rs
+++ b/crates/ruff/src/rules/pylint/rules/too_many_statements.rs
@@ -98,14 +98,7 @@ fn num_statements(stmts: &[Stmt]) -> usize {
                 handlers,
                 orelse,
                 finalbody,
-                range: _,
-            })
-            | Stmt::TryStar(ast::StmtTryStar {
-                body,
-                handlers,
-                orelse,
-                finalbody,
-                range: _,
+                ..
             }) => {
                 count += 1;
                 count += num_statements(body);
diff --git a/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs b/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs
index bf290b59c5..ff354860c5 100644
--- a/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs
+++ b/crates/ruff/src/rules/pylint/rules/useless_else_on_loop.rs
@@ -73,13 +73,6 @@ fn loop_exits_early(body: &[Stmt]) -> bool {
             orelse,
             finalbody,
             ..
-        })
-        | Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
-            ..
         }) => {
             loop_exits_early(body)
                 || loop_exits_early(orelse)
diff --git a/crates/ruff/src/rules/ruff/rules/unreachable.rs b/crates/ruff/src/rules/ruff/rules/unreachable.rs
index 7549d91053..180bd84e6c 100644
--- a/crates/ruff/src/rules/ruff/rules/unreachable.rs
+++ b/crates/ruff/src/rules/ruff/rules/unreachable.rs
@@ -3,7 +3,7 @@ use std::{fmt, iter, usize};
 use log::error;
 use ruff_python_ast::{
     Expr, Identifier, MatchCase, Pattern, PatternMatchAs, Ranged, Stmt, StmtFor, StmtMatch,
-    StmtReturn, StmtTry, StmtTryStar, StmtWhile, StmtWith,
+    StmtReturn, StmtTry, StmtWhile, StmtWith,
 };
 use ruff_text_size::{TextRange, TextSize};
 
@@ -541,13 +541,6 @@ impl<'stmt> BasicBlocksBuilder<'stmt> {
                     orelse,
                     finalbody,
                     ..
-                })
-                | Stmt::TryStar(StmtTryStar {
-                    body,
-                    handlers,
-                    orelse,
-                    finalbody,
-                    ..
                 }) => {
                     // TODO: handle `try` statements. The `try` control flow is very
                     // complex, what blocks are and aren't taken and from which
@@ -900,7 +893,6 @@ fn needs_next_block(stmts: &[Stmt]) -> bool {
         | Stmt::With(_)
         | Stmt::Match(_)
         | Stmt::Try(_)
-        | Stmt::TryStar(_)
         | Stmt::Assert(_) => true,
         Stmt::TypeAlias(_) => todo!(),
         Stmt::IpyEscapeCommand(_) => todo!(),
@@ -931,7 +923,6 @@ fn is_control_flow_stmt(stmt: &Stmt) -> bool {
         | Stmt::Match(_)
         | Stmt::Raise(_)
         | Stmt::Try(_)
-        | Stmt::TryStar(_)
         | Stmt::Assert(_)
         | Stmt::Break(_)
         | Stmt::Continue(_) => true,
diff --git a/crates/ruff/src/rules/tryceratops/rules/raise_within_try.rs b/crates/ruff/src/rules/tryceratops/rules/raise_within_try.rs
index bdaf9f6e38..7748651468 100644
--- a/crates/ruff/src/rules/tryceratops/rules/raise_within_try.rs
+++ b/crates/ruff/src/rules/tryceratops/rules/raise_within_try.rs
@@ -70,7 +70,7 @@ where
     fn visit_stmt(&mut self, stmt: &'b Stmt) {
         match stmt {
             Stmt::Raise(_) => self.raises.push(stmt),
-            Stmt::Try(_) | Stmt::TryStar(_) => (),
+            Stmt::Try(_) => (),
             _ => walk_stmt(self, stmt),
         }
     }
diff --git a/crates/ruff/src/rules/tryceratops/rules/verbose_raise.rs b/crates/ruff/src/rules/tryceratops/rules/verbose_raise.rs
index 9c881e1cb3..70ff1e3c21 100644
--- a/crates/ruff/src/rules/tryceratops/rules/verbose_raise.rs
+++ b/crates/ruff/src/rules/tryceratops/rules/verbose_raise.rs
@@ -61,9 +61,6 @@ where
             }
             Stmt::Try(ast::StmtTry {
                 body, finalbody, ..
-            })
-            | Stmt::TryStar(ast::StmtTryStar {
-                body, finalbody, ..
             }) => {
                 for stmt in body.iter().chain(finalbody.iter()) {
                     walk_stmt(self, stmt);
diff --git a/crates/ruff_python_ast/src/comparable.rs b/crates/ruff_python_ast/src/comparable.rs
index f8dbdf2732..a28e6d2190 100644
--- a/crates/ruff_python_ast/src/comparable.rs
+++ b/crates/ruff_python_ast/src/comparable.rs
@@ -1133,14 +1133,7 @@ pub struct StmtTry<'a> {
     handlers: Vec>,
     orelse: Vec>,
     finalbody: Vec>,
-}
-
-#[derive(Debug, PartialEq, Eq, Hash)]
-pub struct StmtTryStar<'a> {
-    body: Vec>,
-    handlers: Vec>,
-    orelse: Vec>,
-    finalbody: Vec>,
+    is_star: bool,
 }
 
 #[derive(Debug, PartialEq, Eq, Hash)]
@@ -1198,7 +1191,6 @@ pub enum ComparableStmt<'a> {
     Match(StmtMatch<'a>),
     Raise(StmtRaise<'a>),
     Try(StmtTry<'a>),
-    TryStar(StmtTryStar<'a>),
     TypeAlias(StmtTypeAlias<'a>),
     Assert(StmtAssert<'a>),
     Import(StmtImport<'a>),
@@ -1358,24 +1350,14 @@ impl<'a> From<&'a ast::Stmt> for ComparableStmt<'a> {
                 handlers,
                 orelse,
                 finalbody,
+                is_star,
                 range: _,
             }) => Self::Try(StmtTry {
                 body: body.iter().map(Into::into).collect(),
                 handlers: handlers.iter().map(Into::into).collect(),
                 orelse: orelse.iter().map(Into::into).collect(),
                 finalbody: finalbody.iter().map(Into::into).collect(),
-            }),
-            ast::Stmt::TryStar(ast::StmtTryStar {
-                body,
-                handlers,
-                orelse,
-                finalbody,
-                range: _,
-            }) => Self::TryStar(StmtTryStar {
-                body: body.iter().map(Into::into).collect(),
-                handlers: handlers.iter().map(Into::into).collect(),
-                orelse: orelse.iter().map(Into::into).collect(),
-                finalbody: finalbody.iter().map(Into::into).collect(),
+                is_star: *is_star,
             }),
             ast::Stmt::Assert(ast::StmtAssert {
                 test,
diff --git a/crates/ruff_python_ast/src/helpers.rs b/crates/ruff_python_ast/src/helpers.rs
index 2f43d3da1c..ad97566880 100644
--- a/crates/ruff_python_ast/src/helpers.rs
+++ b/crates/ruff_python_ast/src/helpers.rs
@@ -25,7 +25,6 @@ pub const fn is_compound_statement(stmt: &Stmt) -> bool {
             | Stmt::With(_)
             | Stmt::If(_)
             | Stmt::Try(_)
-            | Stmt::TryStar(_)
     )
 }
 
@@ -478,13 +477,7 @@ where
             handlers,
             orelse,
             finalbody,
-            range: _,
-        })
-        | Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
+            is_star: _,
             range: _,
         }) => {
             any_over_body(body, func)
@@ -920,7 +913,7 @@ where
                 self.raises
                     .push((stmt.range(), exc.as_deref(), cause.as_deref()));
             }
-            Stmt::ClassDef(_) | Stmt::FunctionDef(_) | Stmt::Try(_) | Stmt::TryStar(_) => {}
+            Stmt::ClassDef(_) | Stmt::FunctionDef(_) | Stmt::Try(_) => {}
             Stmt::If(ast::StmtIf {
                 body,
                 elif_else_clauses,
@@ -981,7 +974,7 @@ pub fn in_nested_block<'a>(mut parents: impl Iterator) -> bool
     parents.any(|parent| {
         matches!(
             parent,
-            Stmt::Try(_) | Stmt::TryStar(_) | Stmt::If(_) | Stmt::With(_) | Stmt::Match(_)
+            Stmt::Try(_) | Stmt::If(_) | Stmt::With(_) | Stmt::Match(_)
         )
     })
 }
diff --git a/crates/ruff_python_ast/src/node.rs b/crates/ruff_python_ast/src/node.rs
index d24d431833..c6a7e7d675 100644
--- a/crates/ruff_python_ast/src/node.rs
+++ b/crates/ruff_python_ast/src/node.rs
@@ -43,7 +43,6 @@ pub enum AnyNode {
     StmtMatch(ast::StmtMatch),
     StmtRaise(ast::StmtRaise),
     StmtTry(ast::StmtTry),
-    StmtTryStar(ast::StmtTryStar),
     StmtAssert(ast::StmtAssert),
     StmtImport(ast::StmtImport),
     StmtImportFrom(ast::StmtImportFrom),
@@ -126,7 +125,6 @@ impl AnyNode {
             AnyNode::StmtMatch(node) => Some(Stmt::Match(node)),
             AnyNode::StmtRaise(node) => Some(Stmt::Raise(node)),
             AnyNode::StmtTry(node) => Some(Stmt::Try(node)),
-            AnyNode::StmtTryStar(node) => Some(Stmt::TryStar(node)),
             AnyNode::StmtAssert(node) => Some(Stmt::Assert(node)),
             AnyNode::StmtImport(node) => Some(Stmt::Import(node)),
             AnyNode::StmtImportFrom(node) => Some(Stmt::ImportFrom(node)),
@@ -243,7 +241,6 @@ impl AnyNode {
             | AnyNode::StmtMatch(_)
             | AnyNode::StmtRaise(_)
             | AnyNode::StmtTry(_)
-            | AnyNode::StmtTryStar(_)
             | AnyNode::StmtAssert(_)
             | AnyNode::StmtImport(_)
             | AnyNode::StmtImportFrom(_)
@@ -301,7 +298,6 @@ impl AnyNode {
             | AnyNode::StmtMatch(_)
             | AnyNode::StmtRaise(_)
             | AnyNode::StmtTry(_)
-            | AnyNode::StmtTryStar(_)
             | AnyNode::StmtAssert(_)
             | AnyNode::StmtImport(_)
             | AnyNode::StmtImportFrom(_)
@@ -395,7 +391,6 @@ impl AnyNode {
             | AnyNode::StmtMatch(_)
             | AnyNode::StmtRaise(_)
             | AnyNode::StmtTry(_)
-            | AnyNode::StmtTryStar(_)
             | AnyNode::StmtAssert(_)
             | AnyNode::StmtImport(_)
             | AnyNode::StmtImportFrom(_)
@@ -474,7 +469,6 @@ impl AnyNode {
             | AnyNode::StmtMatch(_)
             | AnyNode::StmtRaise(_)
             | AnyNode::StmtTry(_)
-            | AnyNode::StmtTryStar(_)
             | AnyNode::StmtAssert(_)
             | AnyNode::StmtImport(_)
             | AnyNode::StmtImportFrom(_)
@@ -578,7 +572,6 @@ impl AnyNode {
             Self::StmtMatch(node) => AnyNodeRef::StmtMatch(node),
             Self::StmtRaise(node) => AnyNodeRef::StmtRaise(node),
             Self::StmtTry(node) => AnyNodeRef::StmtTry(node),
-            Self::StmtTryStar(node) => AnyNodeRef::StmtTryStar(node),
             Self::StmtAssert(node) => AnyNodeRef::StmtAssert(node),
             Self::StmtImport(node) => AnyNodeRef::StmtImport(node),
             Self::StmtImportFrom(node) => AnyNodeRef::StmtImportFrom(node),
@@ -1445,54 +1438,7 @@ impl AstNode for ast::StmtTry {
             handlers,
             orelse,
             finalbody,
-            range: _,
-        } = self;
-
-        visitor.visit_body(body);
-        for except_handler in handlers {
-            visitor.visit_except_handler(except_handler);
-        }
-        visitor.visit_body(orelse);
-        visitor.visit_body(finalbody);
-    }
-}
-impl AstNode for ast::StmtTryStar {
-    fn cast(kind: AnyNode) -> Option
-    where
-        Self: Sized,
-    {
-        if let AnyNode::StmtTryStar(node) = kind {
-            Some(node)
-        } else {
-            None
-        }
-    }
-
-    fn cast_ref(kind: AnyNodeRef) -> Option<&Self> {
-        if let AnyNodeRef::StmtTryStar(node) = kind {
-            Some(node)
-        } else {
-            None
-        }
-    }
-
-    fn as_any_node_ref(&self) -> AnyNodeRef {
-        AnyNodeRef::from(self)
-    }
-
-    fn into_any_node(self) -> AnyNode {
-        AnyNode::from(self)
-    }
-
-    fn visit_preorder<'a, V>(&'a self, visitor: &mut V)
-    where
-        V: PreorderVisitor<'a> + ?Sized,
-    {
-        let ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
+            is_star: _,
             range: _,
         } = self;
 
@@ -4056,7 +4002,6 @@ impl From for AnyNode {
             Stmt::Match(node) => AnyNode::StmtMatch(node),
             Stmt::Raise(node) => AnyNode::StmtRaise(node),
             Stmt::Try(node) => AnyNode::StmtTry(node),
-            Stmt::TryStar(node) => AnyNode::StmtTryStar(node),
             Stmt::Assert(node) => AnyNode::StmtAssert(node),
             Stmt::Import(node) => AnyNode::StmtImport(node),
             Stmt::ImportFrom(node) => AnyNode::StmtImportFrom(node),
@@ -4246,12 +4191,6 @@ impl From for AnyNode {
     }
 }
 
-impl From for AnyNode {
-    fn from(node: ast::StmtTryStar) -> Self {
-        AnyNode::StmtTryStar(node)
-    }
-}
-
 impl From for AnyNode {
     fn from(node: ast::StmtAssert) -> Self {
         AnyNode::StmtAssert(node)
@@ -4627,7 +4566,6 @@ impl Ranged for AnyNode {
             AnyNode::StmtMatch(node) => node.range(),
             AnyNode::StmtRaise(node) => node.range(),
             AnyNode::StmtTry(node) => node.range(),
-            AnyNode::StmtTryStar(node) => node.range(),
             AnyNode::StmtAssert(node) => node.range(),
             AnyNode::StmtImport(node) => node.range(),
             AnyNode::StmtImportFrom(node) => node.range(),
@@ -4713,7 +4651,6 @@ pub enum AnyNodeRef<'a> {
     StmtMatch(&'a ast::StmtMatch),
     StmtRaise(&'a ast::StmtRaise),
     StmtTry(&'a ast::StmtTry),
-    StmtTryStar(&'a ast::StmtTryStar),
     StmtAssert(&'a ast::StmtAssert),
     StmtImport(&'a ast::StmtImport),
     StmtImportFrom(&'a ast::StmtImportFrom),
@@ -4798,7 +4735,6 @@ impl AnyNodeRef<'_> {
             AnyNodeRef::StmtMatch(node) => NonNull::from(*node).cast(),
             AnyNodeRef::StmtRaise(node) => NonNull::from(*node).cast(),
             AnyNodeRef::StmtTry(node) => NonNull::from(*node).cast(),
-            AnyNodeRef::StmtTryStar(node) => NonNull::from(*node).cast(),
             AnyNodeRef::StmtAssert(node) => NonNull::from(*node).cast(),
             AnyNodeRef::StmtImport(node) => NonNull::from(*node).cast(),
             AnyNodeRef::StmtImportFrom(node) => NonNull::from(*node).cast(),
@@ -4889,7 +4825,6 @@ impl AnyNodeRef<'_> {
             AnyNodeRef::StmtMatch(_) => NodeKind::StmtMatch,
             AnyNodeRef::StmtRaise(_) => NodeKind::StmtRaise,
             AnyNodeRef::StmtTry(_) => NodeKind::StmtTry,
-            AnyNodeRef::StmtTryStar(_) => NodeKind::StmtTryStar,
             AnyNodeRef::StmtAssert(_) => NodeKind::StmtAssert,
             AnyNodeRef::StmtImport(_) => NodeKind::StmtImport,
             AnyNodeRef::StmtImportFrom(_) => NodeKind::StmtImportFrom,
@@ -4972,7 +4907,6 @@ impl AnyNodeRef<'_> {
             | AnyNodeRef::StmtMatch(_)
             | AnyNodeRef::StmtRaise(_)
             | AnyNodeRef::StmtTry(_)
-            | AnyNodeRef::StmtTryStar(_)
             | AnyNodeRef::StmtAssert(_)
             | AnyNodeRef::StmtImport(_)
             | AnyNodeRef::StmtImportFrom(_)
@@ -5089,7 +5023,6 @@ impl AnyNodeRef<'_> {
             | AnyNodeRef::StmtMatch(_)
             | AnyNodeRef::StmtRaise(_)
             | AnyNodeRef::StmtTry(_)
-            | AnyNodeRef::StmtTryStar(_)
             | AnyNodeRef::StmtAssert(_)
             | AnyNodeRef::StmtImport(_)
             | AnyNodeRef::StmtImportFrom(_)
@@ -5146,7 +5079,6 @@ impl AnyNodeRef<'_> {
             | AnyNodeRef::StmtMatch(_)
             | AnyNodeRef::StmtRaise(_)
             | AnyNodeRef::StmtTry(_)
-            | AnyNodeRef::StmtTryStar(_)
             | AnyNodeRef::StmtAssert(_)
             | AnyNodeRef::StmtImport(_)
             | AnyNodeRef::StmtImportFrom(_)
@@ -5240,7 +5172,6 @@ impl AnyNodeRef<'_> {
             | AnyNodeRef::StmtMatch(_)
             | AnyNodeRef::StmtRaise(_)
             | AnyNodeRef::StmtTry(_)
-            | AnyNodeRef::StmtTryStar(_)
             | AnyNodeRef::StmtAssert(_)
             | AnyNodeRef::StmtImport(_)
             | AnyNodeRef::StmtImportFrom(_)
@@ -5319,7 +5250,6 @@ impl AnyNodeRef<'_> {
             | AnyNodeRef::StmtMatch(_)
             | AnyNodeRef::StmtRaise(_)
             | AnyNodeRef::StmtTry(_)
-            | AnyNodeRef::StmtTryStar(_)
             | AnyNodeRef::StmtAssert(_)
             | AnyNodeRef::StmtImport(_)
             | AnyNodeRef::StmtImportFrom(_)
@@ -5395,7 +5325,6 @@ impl AnyNodeRef<'_> {
                 | AnyNodeRef::StmtFunctionDef(_)
                 | AnyNodeRef::StmtClassDef(_)
                 | AnyNodeRef::StmtTry(_)
-                | AnyNodeRef::StmtTryStar(_)
                 | AnyNodeRef::ExceptHandlerExceptHandler(_)
                 | AnyNodeRef::ElifElseClause(_)
         )
@@ -5433,7 +5362,6 @@ impl AnyNodeRef<'_> {
             AnyNodeRef::StmtMatch(node) => node.visit_preorder(visitor),
             AnyNodeRef::StmtRaise(node) => node.visit_preorder(visitor),
             AnyNodeRef::StmtTry(node) => node.visit_preorder(visitor),
-            AnyNodeRef::StmtTryStar(node) => node.visit_preorder(visitor),
             AnyNodeRef::StmtAssert(node) => node.visit_preorder(visitor),
             AnyNodeRef::StmtImport(node) => node.visit_preorder(visitor),
             AnyNodeRef::StmtImportFrom(node) => node.visit_preorder(visitor),
@@ -5608,12 +5536,6 @@ impl<'a> From<&'a ast::StmtTry> for AnyNodeRef<'a> {
     }
 }
 
-impl<'a> From<&'a ast::StmtTryStar> for AnyNodeRef<'a> {
-    fn from(node: &'a ast::StmtTryStar) -> Self {
-        AnyNodeRef::StmtTryStar(node)
-    }
-}
-
 impl<'a> From<&'a ast::StmtAssert> for AnyNodeRef<'a> {
     fn from(node: &'a ast::StmtAssert) -> Self {
         AnyNodeRef::StmtAssert(node)
@@ -5943,7 +5865,6 @@ impl<'a> From<&'a Stmt> for AnyNodeRef<'a> {
             Stmt::Match(node) => AnyNodeRef::StmtMatch(node),
             Stmt::Raise(node) => AnyNodeRef::StmtRaise(node),
             Stmt::Try(node) => AnyNodeRef::StmtTry(node),
-            Stmt::TryStar(node) => AnyNodeRef::StmtTryStar(node),
             Stmt::Assert(node) => AnyNodeRef::StmtAssert(node),
             Stmt::Import(node) => AnyNodeRef::StmtImport(node),
             Stmt::ImportFrom(node) => AnyNodeRef::StmtImportFrom(node),
@@ -6103,7 +6024,6 @@ impl Ranged for AnyNodeRef<'_> {
             AnyNodeRef::StmtMatch(node) => node.range(),
             AnyNodeRef::StmtRaise(node) => node.range(),
             AnyNodeRef::StmtTry(node) => node.range(),
-            AnyNodeRef::StmtTryStar(node) => node.range(),
             AnyNodeRef::StmtAssert(node) => node.range(),
             AnyNodeRef::StmtImport(node) => node.range(),
             AnyNodeRef::StmtImportFrom(node) => node.range(),
@@ -6191,7 +6111,6 @@ pub enum NodeKind {
     StmtMatch,
     StmtRaise,
     StmtTry,
-    StmtTryStar,
     StmtAssert,
     StmtImport,
     StmtImportFrom,
diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs
index 331968c47e..af9d150f54 100644
--- a/crates/ruff_python_ast/src/nodes.rs
+++ b/crates/ruff_python_ast/src/nodes.rs
@@ -73,8 +73,6 @@ pub enum Stmt {
     Raise(StmtRaise),
     #[is(name = "try_stmt")]
     Try(StmtTry),
-    #[is(name = "try_star_stmt")]
-    TryStar(StmtTryStar),
     #[is(name = "assert_stmt")]
     Assert(StmtAssert),
     #[is(name = "import_stmt")]
@@ -362,7 +360,8 @@ impl From for Stmt {
     }
 }
 
-/// See also [Try](https://docs.python.org/3/library/ast.html#ast.Try)
+/// See also [Try](https://docs.python.org/3/library/ast.html#ast.Try) and
+/// [TryStar](https://docs.python.org/3/library/ast.html#ast.TryStar)
 #[derive(Clone, Debug, PartialEq)]
 pub struct StmtTry {
     pub range: TextRange,
@@ -370,6 +369,7 @@ pub struct StmtTry {
     pub handlers: Vec,
     pub orelse: Vec,
     pub finalbody: Vec,
+    pub is_star: bool,
 }
 
 impl From for Stmt {
@@ -378,22 +378,6 @@ impl From for Stmt {
     }
 }
 
-/// See also [TryStar](https://docs.python.org/3/library/ast.html#ast.TryStar)
-#[derive(Clone, Debug, PartialEq)]
-pub struct StmtTryStar {
-    pub range: TextRange,
-    pub body: Vec,
-    pub handlers: Vec,
-    pub orelse: Vec,
-    pub finalbody: Vec,
-}
-
-impl From for Stmt {
-    fn from(payload: StmtTryStar) -> Self {
-        Stmt::TryStar(payload)
-    }
-}
-
 /// See also [Assert](https://docs.python.org/3/library/ast.html#ast.Assert)
 #[derive(Clone, Debug, PartialEq)]
 pub struct StmtAssert {
@@ -2666,11 +2650,6 @@ impl Ranged for crate::nodes::StmtTry {
         self.range
     }
 }
-impl Ranged for crate::nodes::StmtTryStar {
-    fn range(&self) -> TextRange {
-        self.range
-    }
-}
 impl Ranged for crate::nodes::StmtAssert {
     fn range(&self) -> TextRange {
         self.range
@@ -2739,7 +2718,6 @@ impl Ranged for crate::Stmt {
             Self::Match(node) => node.range(),
             Self::Raise(node) => node.range(),
             Self::Try(node) => node.range(),
-            Self::TryStar(node) => node.range(),
             Self::Assert(node) => node.range(),
             Self::Import(node) => node.range(),
             Self::ImportFrom(node) => node.range(),
@@ -3086,7 +3064,7 @@ mod size_assertions {
     assert_eq_size!(Stmt, [u8; 144]);
     assert_eq_size!(StmtFunctionDef, [u8; 144]);
     assert_eq_size!(StmtClassDef, [u8; 104]);
-    assert_eq_size!(StmtTry, [u8; 104]);
+    assert_eq_size!(StmtTry, [u8; 112]);
     assert_eq_size!(Expr, [u8; 80]);
     assert_eq_size!(Constant, [u8; 40]);
     assert_eq_size!(Pattern, [u8; 96]);
diff --git a/crates/ruff_python_ast/src/statement_visitor.rs b/crates/ruff_python_ast/src/statement_visitor.rs
index 57f458d8fb..7ab3ebe06c 100644
--- a/crates/ruff_python_ast/src/statement_visitor.rs
+++ b/crates/ruff_python_ast/src/statement_visitor.rs
@@ -66,21 +66,7 @@ pub fn walk_stmt<'a, V: StatementVisitor<'a> + ?Sized>(visitor: &mut V, stmt: &'
             handlers,
             orelse,
             finalbody,
-            range: _,
-        }) => {
-            visitor.visit_body(body);
-            for except_handler in handlers {
-                visitor.visit_except_handler(except_handler);
-            }
-            visitor.visit_body(orelse);
-            visitor.visit_body(finalbody);
-        }
-        Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
-            range: _,
+            ..
         }) => {
             visitor.visit_body(body);
             for except_handler in handlers {
diff --git a/crates/ruff_python_ast/src/traversal.rs b/crates/ruff_python_ast/src/traversal.rs
index 6a732aa890..d89e29484b 100644
--- a/crates/ruff_python_ast/src/traversal.rs
+++ b/crates/ruff_python_ast/src/traversal.rs
@@ -64,27 +64,6 @@ pub fn suite<'a>(stmt: &'a Stmt, parent: &'a Stmt) -> Option<&'a Suite> {
                     .find(|body| body.contains(stmt))
             }
         }
-        Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
-            ..
-        }) => {
-            if body.contains(stmt) {
-                Some(body)
-            } else if orelse.contains(stmt) {
-                Some(orelse)
-            } else if finalbody.contains(stmt) {
-                Some(finalbody)
-            } else {
-                handlers
-                    .iter()
-                    .filter_map(ExceptHandler::as_except_handler)
-                    .map(|handler| &handler.body)
-                    .find(|body| body.contains(stmt))
-            }
-        }
         _ => None,
     }
 }
diff --git a/crates/ruff_python_ast/src/visitor.rs b/crates/ruff_python_ast/src/visitor.rs
index d9c9eff67c..db9b856eb6 100644
--- a/crates/ruff_python_ast/src/visitor.rs
+++ b/crates/ruff_python_ast/src/visitor.rs
@@ -266,20 +266,7 @@ pub fn walk_stmt<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, stmt: &'a Stmt) {
             handlers,
             orelse,
             finalbody,
-            range: _,
-        }) => {
-            visitor.visit_body(body);
-            for except_handler in handlers {
-                visitor.visit_except_handler(except_handler);
-            }
-            visitor.visit_body(orelse);
-            visitor.visit_body(finalbody);
-        }
-        Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
+            is_star: _,
             range: _,
         }) => {
             visitor.visit_body(body);
diff --git a/crates/ruff_python_ast/src/visitor/preorder.rs b/crates/ruff_python_ast/src/visitor/preorder.rs
index 229f111a57..59e8100590 100644
--- a/crates/ruff_python_ast/src/visitor/preorder.rs
+++ b/crates/ruff_python_ast/src/visitor/preorder.rs
@@ -192,7 +192,6 @@ where
             Stmt::Match(stmt) => stmt.visit_preorder(visitor),
             Stmt::Raise(stmt) => stmt.visit_preorder(visitor),
             Stmt::Try(stmt) => stmt.visit_preorder(visitor),
-            Stmt::TryStar(stmt) => stmt.visit_preorder(visitor),
             Stmt::Assert(stmt) => stmt.visit_preorder(visitor),
             Stmt::Import(stmt) => stmt.visit_preorder(visitor),
             Stmt::ImportFrom(stmt) => stmt.visit_preorder(visitor),
diff --git a/crates/ruff_python_codegen/src/generator.rs b/crates/ruff_python_codegen/src/generator.rs
index 9af88721bd..d20d8afa4c 100644
--- a/crates/ruff_python_codegen/src/generator.rs
+++ b/crates/ruff_python_codegen/src/generator.rs
@@ -513,6 +513,7 @@ impl<'a> Generator<'a> {
                 handlers,
                 orelse,
                 finalbody,
+                is_star,
                 range: _,
             }) => {
                 statement!({
@@ -522,38 +523,7 @@ impl<'a> Generator<'a> {
 
                 for handler in handlers {
                     statement!({
-                        self.unparse_except_handler(handler, false);
-                    });
-                }
-
-                if !orelse.is_empty() {
-                    statement!({
-                        self.p("else:");
-                    });
-                    self.body(orelse);
-                }
-                if !finalbody.is_empty() {
-                    statement!({
-                        self.p("finally:");
-                    });
-                    self.body(finalbody);
-                }
-            }
-            Stmt::TryStar(ast::StmtTryStar {
-                body,
-                handlers,
-                orelse,
-                finalbody,
-                range: _,
-            }) => {
-                statement!({
-                    self.p("try:");
-                });
-                self.body(body);
-
-                for handler in handlers {
-                    statement!({
-                        self.unparse_except_handler(handler, true);
+                        self.unparse_except_handler(handler, *is_star);
                     });
                 }
 
diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs
index 685aa2d3b8..1ad9ffd046 100644
--- a/crates/ruff_python_formatter/src/comments/placement.rs
+++ b/crates/ruff_python_formatter/src/comments/placement.rs
@@ -196,12 +196,6 @@ fn is_first_statement_in_body(statement: AnyNodeRef, has_body: AnyNodeRef) -> bo
             orelse,
             finalbody,
             ..
-        })
-        | AnyNodeRef::StmtTryStar(ast::StmtTryStar {
-            body,
-            orelse,
-            finalbody,
-            ..
         }) => {
             are_same_optional(statement, body.first())
                 || are_same_optional(statement, orelse.first())
@@ -1418,13 +1412,6 @@ fn last_child_in_body(node: AnyNodeRef) -> Option {
             orelse,
             finalbody,
             ..
-        })
-        | AnyNodeRef::StmtTryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            finalbody,
-            ..
         }) => {
             if finalbody.is_empty() {
                 if orelse.is_empty() {
@@ -1461,12 +1448,6 @@ fn is_first_statement_in_alternate_body(statement: AnyNodeRef, has_body: AnyNode
             orelse,
             finalbody,
             ..
-        })
-        | AnyNodeRef::StmtTryStar(ast::StmtTryStar {
-            handlers,
-            orelse,
-            finalbody,
-            ..
         }) => {
             are_same_optional(statement, handlers.first())
                 || are_same_optional(statement, orelse.first())
diff --git a/crates/ruff_python_formatter/src/generated.rs b/crates/ruff_python_formatter/src/generated.rs
index 13617df622..5541df5c4b 100644
--- a/crates/ruff_python_formatter/src/generated.rs
+++ b/crates/ruff_python_formatter/src/generated.rs
@@ -582,42 +582,6 @@ impl<'ast> IntoFormat> for ast::StmtTry {
     }
 }
 
-impl FormatRule>
-    for crate::statement::stmt_try_star::FormatStmtTryStar
-{
-    #[inline]
-    fn fmt(&self, node: &ast::StmtTryStar, f: &mut PyFormatter) -> FormatResult<()> {
-        FormatNodeRule::::fmt(self, node, f)
-    }
-}
-impl<'ast> AsFormat> for ast::StmtTryStar {
-    type Format<'a> = FormatRefWithRule<
-        'a,
-        ast::StmtTryStar,
-        crate::statement::stmt_try_star::FormatStmtTryStar,
-        PyFormatContext<'ast>,
-    >;
-    fn format(&self) -> Self::Format<'_> {
-        FormatRefWithRule::new(
-            self,
-            crate::statement::stmt_try_star::FormatStmtTryStar::default(),
-        )
-    }
-}
-impl<'ast> IntoFormat> for ast::StmtTryStar {
-    type Format = FormatOwnedWithRule<
-        ast::StmtTryStar,
-        crate::statement::stmt_try_star::FormatStmtTryStar,
-        PyFormatContext<'ast>,
-    >;
-    fn into_format(self) -> Self::Format {
-        FormatOwnedWithRule::new(
-            self,
-            crate::statement::stmt_try_star::FormatStmtTryStar::default(),
-        )
-    }
-}
-
 impl FormatRule>
     for crate::statement::stmt_assert::FormatStmtAssert
 {
diff --git a/crates/ruff_python_formatter/src/statement/mod.rs b/crates/ruff_python_formatter/src/statement/mod.rs
index aeaf272ab7..cf39929eb9 100644
--- a/crates/ruff_python_formatter/src/statement/mod.rs
+++ b/crates/ruff_python_formatter/src/statement/mod.rs
@@ -24,7 +24,6 @@ pub(crate) mod stmt_pass;
 pub(crate) mod stmt_raise;
 pub(crate) mod stmt_return;
 pub(crate) mod stmt_try;
-pub(crate) mod stmt_try_star;
 pub(crate) mod stmt_type_alias;
 pub(crate) mod stmt_while;
 pub(crate) mod stmt_with;
@@ -50,7 +49,6 @@ impl FormatRule> for FormatStmt {
             Stmt::Match(x) => x.format().fmt(f),
             Stmt::Raise(x) => x.format().fmt(f),
             Stmt::Try(x) => x.format().fmt(f),
-            Stmt::TryStar(x) => x.format().fmt(f),
             Stmt::Assert(x) => x.format().fmt(f),
             Stmt::Import(x) => x.format().fmt(f),
             Stmt::ImportFrom(x) => x.format().fmt(f),
diff --git a/crates/ruff_python_formatter/src/statement/stmt_try.rs b/crates/ruff_python_formatter/src/statement/stmt_try.rs
index 7db4372469..f869fdf3bf 100644
--- a/crates/ruff_python_formatter/src/statement/stmt_try.rs
+++ b/crates/ruff_python_formatter/src/statement/stmt_try.rs
@@ -1,86 +1,13 @@
-use crate::comments;
-use crate::comments::SourceComment;
-use crate::comments::{leading_alternate_branch_comments, trailing_comments};
-use crate::other::except_handler_except_handler::ExceptHandlerKind;
-use crate::prelude::*;
-use crate::statement::FormatRefWithRule;
-use crate::statement::Stmt;
-use crate::{FormatNodeRule, PyFormatter};
 use ruff_formatter::FormatRuleWithOptions;
 use ruff_formatter::{write, Buffer, FormatResult};
-use ruff_python_ast::node::AnyNodeRef;
-use ruff_python_ast::{ExceptHandler, Ranged, StmtTry, StmtTryStar, Suite};
-use ruff_text_size::TextRange;
+use ruff_python_ast::{ExceptHandler, Ranged, StmtTry, Suite};
 
-pub(super) enum AnyStatementTry<'a> {
-    Try(&'a StmtTry),
-    TryStar(&'a StmtTryStar),
-}
-impl<'a> AnyStatementTry<'a> {
-    const fn except_handler_kind(&self) -> ExceptHandlerKind {
-        match self {
-            AnyStatementTry::Try(_) => ExceptHandlerKind::Regular,
-            AnyStatementTry::TryStar(_) => ExceptHandlerKind::Starred,
-        }
-    }
-
-    fn body(&self) -> &Suite {
-        match self {
-            AnyStatementTry::Try(try_) => &try_.body,
-            AnyStatementTry::TryStar(try_) => &try_.body,
-        }
-    }
-
-    fn handlers(&self) -> &[ExceptHandler] {
-        match self {
-            AnyStatementTry::Try(try_) => try_.handlers.as_slice(),
-            AnyStatementTry::TryStar(try_) => try_.handlers.as_slice(),
-        }
-    }
-    fn orelse(&self) -> &Suite {
-        match self {
-            AnyStatementTry::Try(try_) => &try_.orelse,
-            AnyStatementTry::TryStar(try_) => &try_.orelse,
-        }
-    }
-
-    fn finalbody(&self) -> &Suite {
-        match self {
-            AnyStatementTry::Try(try_) => &try_.finalbody,
-            AnyStatementTry::TryStar(try_) => &try_.finalbody,
-        }
-    }
-}
-
-impl Ranged for AnyStatementTry<'_> {
-    fn range(&self) -> TextRange {
-        match self {
-            AnyStatementTry::Try(with) => with.range(),
-            AnyStatementTry::TryStar(with) => with.range(),
-        }
-    }
-}
-
-impl<'a> From<&'a StmtTry> for AnyStatementTry<'a> {
-    fn from(value: &'a StmtTry) -> Self {
-        AnyStatementTry::Try(value)
-    }
-}
-
-impl<'a> From<&'a StmtTryStar> for AnyStatementTry<'a> {
-    fn from(value: &'a StmtTryStar) -> Self {
-        AnyStatementTry::TryStar(value)
-    }
-}
-
-impl<'a> From<&AnyStatementTry<'a>> for AnyNodeRef<'a> {
-    fn from(value: &AnyStatementTry<'a>) -> Self {
-        match value {
-            AnyStatementTry::Try(with) => AnyNodeRef::StmtTry(with),
-            AnyStatementTry::TryStar(with) => AnyNodeRef::StmtTryStar(with),
-        }
-    }
-}
+use crate::comments;
+use crate::comments::{leading_alternate_branch_comments, trailing_comments, SourceComment};
+use crate::other::except_handler_except_handler::ExceptHandlerKind;
+use crate::prelude::*;
+use crate::statement::{FormatRefWithRule, Stmt};
+use crate::{FormatNodeRule, PyFormatter};
 
 #[derive(Default)]
 pub struct FormatStmtTry;
@@ -102,9 +29,10 @@ impl FormatRuleWithOptions> for FormatExceptH
 impl FormatRule> for FormatExceptHandler {
     fn fmt(&self, item: &ExceptHandler, f: &mut PyFormatter) -> FormatResult<()> {
         match item {
-            ExceptHandler::ExceptHandler(x) => {
-                x.format().with_options(self.except_handler_kind).fmt(f)
-            }
+            ExceptHandler::ExceptHandler(except_handler) => except_handler
+                .format()
+                .with_options(self.except_handler_kind)
+                .fmt(f),
         }
     }
 }
@@ -121,14 +49,20 @@ impl<'ast> AsFormat> for ExceptHandler {
         FormatRefWithRule::new(self, FormatExceptHandler::default())
     }
 }
-impl Format> for AnyStatementTry<'_> {
-    fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
+
+impl FormatNodeRule for FormatStmtTry {
+    fn fmt_fields(&self, item: &StmtTry, f: &mut PyFormatter) -> FormatResult<()> {
+        let StmtTry {
+            body,
+            handlers,
+            orelse,
+            finalbody,
+            is_star,
+            range: _,
+        } = item;
+
         let comments_info = f.context().comments().clone();
-        let mut dangling_comments = comments_info.dangling_comments(self);
-        let body = self.body();
-        let handlers = self.handlers();
-        let orelse = self.orelse();
-        let finalbody = self.finalbody();
+        let mut dangling_comments = comments_info.dangling_comments(item);
 
         (_, dangling_comments) = format_case("try", body, None, dangling_comments, f)?;
         let mut previous_node = body.last();
@@ -139,7 +73,11 @@ impl Format> for AnyStatementTry<'_> {
                 f,
                 [
                     leading_alternate_branch_comments(handler_comments, previous_node),
-                    &handler.format().with_options(self.except_handler_kind()),
+                    &handler.format().with_options(if *is_star {
+                        ExceptHandlerKind::Starred
+                    } else {
+                        ExceptHandlerKind::Regular
+                    }),
                 ]
             )?;
             previous_node = match handler {
@@ -154,12 +92,6 @@ impl Format> for AnyStatementTry<'_> {
 
         write!(f, [comments::dangling_comments(dangling_comments)])
     }
-}
-
-impl FormatNodeRule for FormatStmtTry {
-    fn fmt_fields(&self, item: &StmtTry, f: &mut PyFormatter) -> FormatResult<()> {
-        AnyStatementTry::from(item).fmt(f)
-    }
 
     fn fmt_dangling_comments(&self, _node: &StmtTry, _f: &mut PyFormatter) -> FormatResult<()> {
         // dangling comments are formatted as part of AnyStatementTry::fmt
diff --git a/crates/ruff_python_formatter/src/statement/stmt_try_star.rs b/crates/ruff_python_formatter/src/statement/stmt_try_star.rs
deleted file mode 100644
index 3c20fc42ee..0000000000
--- a/crates/ruff_python_formatter/src/statement/stmt_try_star.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-use crate::statement::stmt_try::AnyStatementTry;
-use crate::{FormatNodeRule, PyFormatter};
-use ruff_formatter::Format;
-use ruff_formatter::FormatResult;
-use ruff_python_ast::StmtTryStar;
-
-#[derive(Default)]
-pub struct FormatStmtTryStar;
-
-impl FormatNodeRule for FormatStmtTryStar {
-    fn fmt_fields(&self, item: &StmtTryStar, f: &mut PyFormatter) -> FormatResult<()> {
-        AnyStatementTry::from(item).fmt(f)
-    }
-
-    fn fmt_dangling_comments(&self, _node: &StmtTryStar, _f: &mut PyFormatter) -> FormatResult<()> {
-        // dangling comments are formatted as part of AnyStatementTry::fmt
-        Ok(())
-    }
-}
diff --git a/crates/ruff_python_parser/src/python.lalrpop b/crates/ruff_python_parser/src/python.lalrpop
index 15ab75db65..54b6832ba2 100644
--- a/crates/ruff_python_parser/src/python.lalrpop
+++ b/crates/ruff_python_parser/src/python.lalrpop
@@ -952,6 +952,7 @@ TryStatement: ast::Stmt = {
                 handlers,
                 orelse,
                 finalbody,
+                is_star: false,
                 range: (location..end_location).into()
             },
         )
@@ -965,12 +966,13 @@ TryStatement: ast::Stmt = {
             .map(Ranged::end)
             .or_else(|| handlers.last().map(Ranged::end))
             .unwrap();
-        ast::Stmt::TryStar(
-            ast::StmtTryStar {
+        ast::Stmt::Try(
+            ast::StmtTry {
                 body,
                 handlers,
                 orelse,
                 finalbody,
+                is_star: true,
                 range: (location..end_location).into()
             },
         )
@@ -985,6 +987,7 @@ TryStatement: ast::Stmt = {
                 handlers,
                 orelse,
                 finalbody,
+                is_star: false,
                 range: (location..end_location).into()
             },
         )
diff --git a/crates/ruff_python_parser/src/python.rs b/crates/ruff_python_parser/src/python.rs
index 209f8c89a1..b45d27805c 100644
--- a/crates/ruff_python_parser/src/python.rs
+++ b/crates/ruff_python_parser/src/python.rs
@@ -1,5 +1,5 @@
 // auto-generated: "lalrpop 0.20.0"
-// sha3: eea7f30d1f9d5648f73bb9aeb9c0d61be448c1d648b743eb3155da459e4e6038
+// sha3: d7e633596695f78340d0d083cd0561185ac7f8efadb0297003c81a41031f6e24
 use num_bigint::BigInt;
 use ruff_text_size::TextSize;
 use ruff_python_ast::{self as ast, Ranged, IpyEscapeKind};
@@ -35125,6 +35125,7 @@ fn __action150<
                 handlers,
                 orelse,
                 finalbody,
+                is_star: false,
                 range: (location..end_location).into()
             },
         )
@@ -35155,12 +35156,13 @@ fn __action151<
             .map(Ranged::end)
             .or_else(|| handlers.last().map(Ranged::end))
             .unwrap();
-        ast::Stmt::TryStar(
-            ast::StmtTryStar {
+        ast::Stmt::Try(
+            ast::StmtTry {
                 body,
                 handlers,
                 orelse,
                 finalbody,
+                is_star: true,
                 range: (location..end_location).into()
             },
         )
@@ -35189,6 +35191,7 @@ fn __action152<
                 handlers,
                 orelse,
                 finalbody,
+                is_star: false,
                 range: (location..end_location).into()
             },
         )
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap
index 78942ef266..e3fd432492 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try.snap
@@ -243,6 +243,7 @@ expression: parse_ast
             ],
             orelse: [],
             finalbody: [],
+            is_star: false,
         },
     ),
 ]
diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap
index 1f8294f3b2..7940ea7359 100644
--- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap
+++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__parser__tests__try_star.snap
@@ -3,8 +3,8 @@ source: crates/ruff_python_parser/src/parser.rs
 expression: parse_ast
 ---
 [
-    TryStar(
-        StmtTryStar {
+    Try(
+        StmtTry {
             range: 0..260,
             body: [
                 Raise(
@@ -436,6 +436,7 @@ expression: parse_ast
             ],
             orelse: [],
             finalbody: [],
+            is_star: true,
         },
     ),
 ]
diff --git a/crates/ruff_python_semantic/src/analyze/branch_detection.rs b/crates/ruff_python_semantic/src/analyze/branch_detection.rs
index 97c6b2b9f9..e7bbf1b428 100644
--- a/crates/ruff_python_semantic/src/analyze/branch_detection.rs
+++ b/crates/ruff_python_semantic/src/analyze/branch_detection.rs
@@ -59,12 +59,6 @@ fn alternatives(stmt: &Stmt) -> Vec> {
             handlers,
             orelse,
             ..
-        })
-        | Stmt::TryStar(ast::StmtTryStar {
-            body,
-            handlers,
-            orelse,
-            ..
         }) => vec![body.iter().chain(orelse.iter()).collect()]
             .into_iter()
             .chain(handlers.iter().map(|handler| {

From 46862473b9b521555bfea2a14e5247bafa3b0774 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 14:24:44 -0400
Subject: [PATCH 116/155] Omit `NotImplementedError` from `TRY003` (#6568)

Closes https://github.com/astral-sh/ruff/issues/6528.
---
 .../test/fixtures/tryceratops/TRY003.py       |  4 ++
 .../tryceratops/rules/raise_vanilla_args.rs   | 66 ++++++++++++-------
 2 files changed, 45 insertions(+), 25 deletions(-)

diff --git a/crates/ruff/resources/test/fixtures/tryceratops/TRY003.py b/crates/ruff/resources/test/fixtures/tryceratops/TRY003.py
index b6ae22682f..5de205fa4c 100644
--- a/crates/ruff/resources/test/fixtures/tryceratops/TRY003.py
+++ b/crates/ruff/resources/test/fixtures/tryceratops/TRY003.py
@@ -52,3 +52,7 @@ def good(a: int):
 def another_good(a):
     if a % 2 == 0:
         raise GoodArgCantBeEven(a)
+
+
+def another_good():
+    raise NotImplementedError("This is acceptable too")
diff --git a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
index 53f56c5829..d9cc91351b 100644
--- a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
+++ b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
@@ -1,7 +1,6 @@
-use ruff_python_ast::{self as ast, Arguments, Constant, Expr, Ranged};
-
 use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::{self as ast, Arguments, Constant, Expr, Ranged};
 
 use crate::checkers::ast::Checker;
 
@@ -17,6 +16,10 @@ use crate::checkers::ast::Checker;
 /// If the exception message is instead defined within the exception class, it
 /// will be consistent across all `raise` invocations.
 ///
+/// This rule is not enforced for some built-in exceptions that are commonly
+/// raised with a message and would be unusual to subclass, such as
+/// `NotImplementedError`.
+///
 /// ## Example
 /// ```python
 /// class CantBeNegative(Exception):
@@ -49,14 +52,44 @@ impl Violation for RaiseVanillaArgs {
     }
 }
 
-fn any_string(expr: &Expr, predicate: F) -> bool
-where
-    F: (Fn(&str) -> bool) + Copy,
-{
+/// TRY003
+pub(crate) fn raise_vanilla_args(checker: &mut Checker, expr: &Expr) {
+    let Expr::Call(ast::ExprCall {
+        func,
+        arguments: Arguments { args, .. },
+        ..
+    }) = expr else {
+        return;
+    };
+
+    let Some(arg) = args.first() else {
+        return;
+    };
+
+    // Ignore some built-in exceptions that don't make sense to subclass, like
+    // `NotImplementedError`.
+    if checker
+        .semantic()
+        .resolve_call_path(func)
+        .is_some_and(|call_path| matches!(call_path.as_slice(), ["", "NotImplementedError"]))
+    {
+        return;
+    }
+
+    if contains_message(arg) {
+        checker
+            .diagnostics
+            .push(Diagnostic::new(RaiseVanillaArgs, expr.range()));
+    }
+}
+
+/// Returns `true` if an expression appears to be an exception message (i.e., a string with
+/// some whitespace).
+fn contains_message(expr: &Expr) -> bool {
     match expr {
         Expr::FString(ast::ExprFString { values, .. }) => {
             for value in values {
-                if any_string(value, predicate) {
+                if contains_message(value) {
                     return true;
                 }
             }
@@ -65,7 +98,7 @@ where
             value: Constant::Str(value),
             ..
         }) => {
-            if predicate(value) {
+            if value.chars().any(char::is_whitespace) {
                 return true;
             }
         }
@@ -74,20 +107,3 @@ where
 
     false
 }
-
-/// TRY003
-pub(crate) fn raise_vanilla_args(checker: &mut Checker, expr: &Expr) {
-    if let Expr::Call(ast::ExprCall {
-        arguments: Arguments { args, .. },
-        ..
-    }) = expr
-    {
-        if let Some(arg) = args.first() {
-            if any_string(arg, |part| part.chars().any(char::is_whitespace)) {
-                checker
-                    .diagnostics
-                    .push(Diagnostic::new(RaiseVanillaArgs, expr.range()));
-            }
-        }
-    }
-}

From 5ddf143cae100359ef9f22398f67463bd0bca43e Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 15:24:16 -0400
Subject: [PATCH 117/155] Clarify FBT documentation and refine rule names
 (#6567)

Closes https://github.com/astral-sh/ruff/issues/6530.
---
 .../src/checkers/ast/analyze/expression.rs    |   6 +-
 .../src/checkers/ast/analyze/statement.rs     |   8 +-
 crates/ruff/src/codes.rs                      |   6 +-
 crates/ruff/src/registry/rule_set.rs          |   6 +-
 .../src/rules/flake8_boolean_trap/helpers.rs  |  17 +--
 .../ruff/src/rules/flake8_boolean_trap/mod.rs |   6 +-
 ...olean_default_value_positional_argument.rs | 126 ++++++++++++++++++
 ...rs => boolean_positional_value_in_call.rs} |  32 ++---
 ... boolean_type_hint_positional_argument.rs} |  44 ++++--
 ...an_default_value_in_function_definition.rs |  91 -------------
 .../rules/flake8_boolean_trap/rules/mod.rs    |  12 +-
 ...e8_boolean_trap__tests__FBT001_FBT.py.snap |  36 ++---
 ...e8_boolean_trap__tests__FBT002_FBT.py.snap |  16 +--
 13 files changed, 221 insertions(+), 185 deletions(-)
 create mode 100644 crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs
 rename crates/ruff/src/rules/flake8_boolean_trap/rules/{check_boolean_positional_value_in_function_call.rs => boolean_positional_value_in_call.rs} (60%)
 rename crates/ruff/src/rules/flake8_boolean_trap/rules/{check_positional_boolean_in_def.rs => boolean_type_hint_positional_argument.rs} (70%)
 delete mode 100644 crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs

diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs
index 15cf51627d..2ea6293cdc 100644
--- a/crates/ruff/src/checkers/ast/analyze/expression.rs
+++ b/crates/ruff/src/checkers/ast/analyze/expression.rs
@@ -673,10 +673,8 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) {
                     checker, expr, func, args, keywords,
                 );
             }
-            if checker.enabled(Rule::BooleanPositionalValueInFunctionCall) {
-                flake8_boolean_trap::rules::check_boolean_positional_value_in_function_call(
-                    checker, args, func,
-                );
+            if checker.enabled(Rule::BooleanPositionalValueInCall) {
+                flake8_boolean_trap::rules::boolean_positional_value_in_call(checker, args, func);
             }
             if checker.enabled(Rule::Debugger) {
                 flake8_debugger::rules::debugger_call(checker, expr, func);
diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs
index c7f2d0223d..aeb82605fd 100644
--- a/crates/ruff/src/checkers/ast/analyze/statement.rs
+++ b/crates/ruff/src/checkers/ast/analyze/statement.rs
@@ -309,16 +309,16 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) {
             ]) {
                 flake8_pytest_style::rules::marks(checker, decorator_list);
             }
-            if checker.enabled(Rule::BooleanPositionalArgInFunctionDefinition) {
-                flake8_boolean_trap::rules::check_positional_boolean_in_def(
+            if checker.enabled(Rule::BooleanTypeHintPositionalArgument) {
+                flake8_boolean_trap::rules::boolean_type_hint_positional_argument(
                     checker,
                     name,
                     decorator_list,
                     parameters,
                 );
             }
-            if checker.enabled(Rule::BooleanDefaultValueInFunctionDefinition) {
-                flake8_boolean_trap::rules::check_boolean_default_value_in_function_definition(
+            if checker.enabled(Rule::BooleanDefaultValuePositionalArgument) {
+                flake8_boolean_trap::rules::boolean_default_value_positional_argument(
                     checker,
                     name,
                     decorator_list,
diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs
index ba86706c6a..b8ac97ab17 100644
--- a/crates/ruff/src/codes.rs
+++ b/crates/ruff/src/codes.rs
@@ -568,9 +568,9 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> {
         (Flake8Bandit, "701") => (RuleGroup::Unspecified, rules::flake8_bandit::rules::Jinja2AutoescapeFalse),
 
         // flake8-boolean-trap
-        (Flake8BooleanTrap, "001") => (RuleGroup::Unspecified, rules::flake8_boolean_trap::rules::BooleanPositionalArgInFunctionDefinition),
-        (Flake8BooleanTrap, "002") => (RuleGroup::Unspecified, rules::flake8_boolean_trap::rules::BooleanDefaultValueInFunctionDefinition),
-        (Flake8BooleanTrap, "003") => (RuleGroup::Unspecified, rules::flake8_boolean_trap::rules::BooleanPositionalValueInFunctionCall),
+        (Flake8BooleanTrap, "001") => (RuleGroup::Unspecified, rules::flake8_boolean_trap::rules::BooleanTypeHintPositionalArgument),
+        (Flake8BooleanTrap, "002") => (RuleGroup::Unspecified, rules::flake8_boolean_trap::rules::BooleanDefaultValuePositionalArgument),
+        (Flake8BooleanTrap, "003") => (RuleGroup::Unspecified, rules::flake8_boolean_trap::rules::BooleanPositionalValueInCall),
 
         // flake8-unused-arguments
         (Flake8UnusedArguments, "001") => (RuleGroup::Unspecified, rules::flake8_unused_arguments::rules::UnusedFunctionArgument),
diff --git a/crates/ruff/src/registry/rule_set.rs b/crates/ruff/src/registry/rule_set.rs
index 555ba0e5b2..e141a4e25e 100644
--- a/crates/ruff/src/registry/rule_set.rs
+++ b/crates/ruff/src/registry/rule_set.rs
@@ -72,7 +72,7 @@ impl RuleSet {
     /// let set_1 = RuleSet::from_rules(&[Rule::AmbiguousFunctionName, Rule::AnyType]);
     /// let set_2 = RuleSet::from_rules(&[
     ///     Rule::BadQuotesInlineString,
-    ///     Rule::BooleanPositionalValueInFunctionCall,
+    ///     Rule::BooleanPositionalValueInCall,
     /// ]);
     ///
     /// let union = set_1.union(&set_2);
@@ -80,7 +80,7 @@ impl RuleSet {
     /// assert!(union.contains(Rule::AmbiguousFunctionName));
     /// assert!(union.contains(Rule::AnyType));
     /// assert!(union.contains(Rule::BadQuotesInlineString));
-    /// assert!(union.contains(Rule::BooleanPositionalValueInFunctionCall));
+    /// assert!(union.contains(Rule::BooleanPositionalValueInCall));
     /// ```
     #[must_use]
     pub const fn union(mut self, other: &Self) -> Self {
@@ -132,7 +132,7 @@ impl RuleSet {
     /// ])));
     ///
     /// assert!(!set_1.intersects(&RuleSet::from_rules(&[
-    ///     Rule::BooleanPositionalValueInFunctionCall,
+    ///     Rule::BooleanPositionalValueInCall,
     ///     Rule::BadQuotesInlineString
     /// ])));
     /// ```
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/helpers.rs b/crates/ruff/src/rules/flake8_boolean_trap/helpers.rs
index 2c5f68aaa3..9e1e101e07 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/helpers.rs
+++ b/crates/ruff/src/rules/flake8_boolean_trap/helpers.rs
@@ -1,8 +1,4 @@
-use ruff_python_ast::{self as ast, Constant, Expr, Ranged};
-
-use ruff_diagnostics::{Diagnostic, DiagnosticKind};
-
-use crate::checkers::ast::Checker;
+use ruff_python_ast::{self as ast, Constant, Expr};
 
 /// Returns `true` if a function call is allowed to use a boolean trap.
 pub(super) fn is_allowed_func_call(name: &str) -> bool {
@@ -62,18 +58,13 @@ pub(super) fn allow_boolean_trap(func: &Expr) -> bool {
     false
 }
 
-const fn is_boolean_arg(arg: &Expr) -> bool {
+/// Returns `true` if an expression is a boolean literal.
+pub(super) const fn is_boolean(expr: &Expr) -> bool {
     matches!(
-        &arg,
+        &expr,
         Expr::Constant(ast::ExprConstant {
             value: Constant::Bool(_),
             ..
         })
     )
 }
-
-pub(super) fn add_if_boolean(checker: &mut Checker, arg: &Expr, kind: DiagnosticKind) {
-    if is_boolean_arg(arg) {
-        checker.diagnostics.push(Diagnostic::new(kind, arg.range()));
-    }
-}
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/mod.rs b/crates/ruff/src/rules/flake8_boolean_trap/mod.rs
index ab0d6f8741..7a4a1ff943 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/mod.rs
+++ b/crates/ruff/src/rules/flake8_boolean_trap/mod.rs
@@ -13,9 +13,9 @@ mod tests {
     use crate::test::test_path;
     use crate::{assert_messages, settings};
 
-    #[test_case(Rule::BooleanPositionalArgInFunctionDefinition, Path::new("FBT.py"))]
-    #[test_case(Rule::BooleanDefaultValueInFunctionDefinition, Path::new("FBT.py"))]
-    #[test_case(Rule::BooleanPositionalValueInFunctionCall, Path::new("FBT.py"))]
+    #[test_case(Rule::BooleanTypeHintPositionalArgument, Path::new("FBT.py"))]
+    #[test_case(Rule::BooleanDefaultValuePositionalArgument, Path::new("FBT.py"))]
+    #[test_case(Rule::BooleanPositionalValueInCall, Path::new("FBT.py"))]
     fn rules(rule_code: Rule, path: &Path) -> Result<()> {
         let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy());
         let diagnostics = test_path(
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs b/crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs
new file mode 100644
index 0000000000..b80bff7752
--- /dev/null
+++ b/crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs
@@ -0,0 +1,126 @@
+use ruff_diagnostics::{Diagnostic, Violation};
+use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::call_path::collect_call_path;
+use ruff_python_ast::{Decorator, ParameterWithDefault, Parameters, Ranged};
+
+use crate::checkers::ast::Checker;
+use crate::rules::flake8_boolean_trap::helpers::{is_allowed_func_def, is_boolean};
+
+/// ## What it does
+/// Checks for the use of boolean positional arguments in function definitions,
+/// as determined by the presence of a boolean default value.
+///
+/// ## Why is this bad?
+/// Calling a function with boolean positional arguments is confusing as the
+/// meaning of the boolean value is not clear to the caller and to future
+/// readers of the code.
+///
+/// The use of a boolean will also limit the function to only two possible
+/// behaviors, which makes the function difficult to extend in the future.
+///
+/// Instead, consider refactoring into separate implementations for the
+/// `True` and `False` cases, using an `Enum`, or making the argument a
+/// keyword-only argument, to force callers to be explicit when providing
+/// the argument.
+///
+/// ## Example
+/// ```python
+/// from math import ceil, floor
+///
+///
+/// def round_number(number, up=True):
+///     return ceil(number) if up else floor(number)
+///
+///
+/// round_number(1.5, True)  # What does `True` mean?
+/// round_number(1.5, False)  # What does `False` mean?
+/// ```
+///
+/// Instead, refactor into separate implementations:
+/// ```python
+/// from math import ceil, floor
+///
+///
+/// def round_up(number):
+///     return ceil(number)
+///
+///
+/// def round_down(number):
+///     return floor(number)
+///
+///
+/// round_up(1.5)
+/// round_down(1.5)
+/// ```
+///
+/// Or, refactor to use an `Enum`:
+/// ```python
+/// from enum import Enum
+///
+///
+/// class RoundingMethod(Enum):
+///     UP = 1
+///     DOWN = 2
+///
+///
+/// def round_number(value, method):
+///     ...
+/// ```
+///
+/// Or, make the argument a keyword-only argument:
+/// ```python
+/// from math import ceil, floor
+///
+///
+/// def round_number(number, *, up=True):
+///     return ceil(number) if up else floor(number)
+///
+///
+/// round_number(1.5, up=True)
+/// round_number(1.5, up=False)
+/// ```
+///
+/// ## References
+/// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls)
+/// - [_How to Avoid “The Boolean Trap”_ by Adam Johnson](https://adamj.eu/tech/2021/07/10/python-type-hints-how-to-avoid-the-boolean-trap/)
+#[violation]
+pub struct BooleanDefaultValuePositionalArgument;
+
+impl Violation for BooleanDefaultValuePositionalArgument {
+    #[derive_message_formats]
+    fn message(&self) -> String {
+        format!("Boolean default positional argument in function definition")
+    }
+}
+
+pub(crate) fn boolean_default_value_positional_argument(
+    checker: &mut Checker,
+    name: &str,
+    decorator_list: &[Decorator],
+    parameters: &Parameters,
+) {
+    if is_allowed_func_def(name) {
+        return;
+    }
+
+    if decorator_list.iter().any(|decorator| {
+        collect_call_path(&decorator.expression)
+            .is_some_and(|call_path| call_path.as_slice() == [name, "setter"])
+    }) {
+        return;
+    }
+
+    for ParameterWithDefault {
+        parameter,
+        default,
+        range: _,
+    } in parameters.posonlyargs.iter().chain(¶meters.args)
+    {
+        if default.as_ref().is_some_and(|default| is_boolean(default)) {
+            checker.diagnostics.push(Diagnostic::new(
+                BooleanDefaultValuePositionalArgument,
+                parameter.name.range(),
+            ));
+        }
+    }
+}
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_positional_value_in_function_call.rs b/crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_positional_value_in_call.rs
similarity index 60%
rename from crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_positional_value_in_function_call.rs
rename to crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_positional_value_in_call.rs
index 6138fa67bd..0f6bf1fca7 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_positional_value_in_function_call.rs
+++ b/crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_positional_value_in_call.rs
@@ -1,11 +1,9 @@
-use ruff_python_ast::Expr;
-
-use ruff_diagnostics::Violation;
-
+use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::{Expr, Ranged};
 
 use crate::checkers::ast::Checker;
-use crate::rules::flake8_boolean_trap::helpers::{add_if_boolean, allow_boolean_trap};
+use crate::rules::flake8_boolean_trap::helpers::{allow_boolean_trap, is_boolean};
 
 /// ## What it does
 /// Checks for boolean positional arguments in function calls.
@@ -17,44 +15,42 @@ use crate::rules::flake8_boolean_trap::helpers::{add_if_boolean, allow_boolean_t
 ///
 /// ## Example
 /// ```python
-/// def foo(flag: bool) -> None:
+/// def func(flag: bool) -> None:
 ///     ...
 ///
 ///
-/// foo(True)
+/// func(True)
 /// ```
 ///
 /// Use instead:
 /// ```python
-/// def foo(flag: bool) -> None:
+/// def func(flag: bool) -> None:
 ///     ...
 ///
 ///
-/// foo(flag=True)
+/// func(flag=True)
 /// ```
 ///
 /// ## References
 /// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls)
 /// - [_How to Avoid “The Boolean Trap”_ by Adam Johnson](https://adamj.eu/tech/2021/07/10/python-type-hints-how-to-avoid-the-boolean-trap/)
 #[violation]
-pub struct BooleanPositionalValueInFunctionCall;
+pub struct BooleanPositionalValueInCall;
 
-impl Violation for BooleanPositionalValueInFunctionCall {
+impl Violation for BooleanPositionalValueInCall {
     #[derive_message_formats]
     fn message(&self) -> String {
         format!("Boolean positional value in function call")
     }
 }
 
-pub(crate) fn check_boolean_positional_value_in_function_call(
-    checker: &mut Checker,
-    args: &[Expr],
-    func: &Expr,
-) {
+pub(crate) fn boolean_positional_value_in_call(checker: &mut Checker, args: &[Expr], func: &Expr) {
     if allow_boolean_trap(func) {
         return;
     }
-    for arg in args {
-        add_if_boolean(checker, arg, BooleanPositionalValueInFunctionCall.into());
+    for arg in args.iter().filter(|arg| is_boolean(arg)) {
+        checker
+            .diagnostics
+            .push(Diagnostic::new(BooleanPositionalValueInCall, arg.range()));
     }
 }
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_positional_boolean_in_def.rs b/crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_type_hint_positional_argument.rs
similarity index 70%
rename from crates/ruff/src/rules/flake8_boolean_trap/rules/check_positional_boolean_in_def.rs
rename to crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_type_hint_positional_argument.rs
index b1197a75a7..cfe52b2829 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_positional_boolean_in_def.rs
+++ b/crates/ruff/src/rules/flake8_boolean_trap/rules/boolean_type_hint_positional_argument.rs
@@ -11,16 +11,22 @@ use crate::checkers::ast::Checker;
 use crate::rules::flake8_boolean_trap::helpers::is_allowed_func_def;
 
 /// ## What it does
-/// Checks for boolean positional arguments in function definitions.
+/// Checks for the use of boolean positional arguments in function definitions,
+/// as determined by the presence of a `bool` type hint.
 ///
 /// ## Why is this bad?
 /// Calling a function with boolean positional arguments is confusing as the
-/// meaning of the boolean value is not clear to the caller, and to future
+/// meaning of the boolean value is not clear to the caller and to future
 /// readers of the code.
 ///
 /// The use of a boolean will also limit the function to only two possible
 /// behaviors, which makes the function difficult to extend in the future.
 ///
+/// Instead, consider refactoring into separate implementations for the
+/// `True` and `False` cases, using an `Enum`, or making the argument a
+/// keyword-only argument, to force callers to be explicit when providing
+/// the argument.
+///
 /// ## Example
 /// ```python
 /// from math import ceil, floor
@@ -65,20 +71,33 @@ use crate::rules::flake8_boolean_trap::helpers::is_allowed_func_def;
 ///     ...
 /// ```
 ///
+/// Or, make the argument a keyword-only argument:
+/// ```python
+/// from math import ceil, floor
+///
+///
+/// def round_number(number: float, *, up: bool) -> int:
+///     return ceil(number) if up else floor(number)
+///
+///
+/// round_number(1.5, up=True)
+/// round_number(1.5, up=False)
+/// ```
+///
 /// ## References
 /// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls)
 /// - [_How to Avoid “The Boolean Trap”_ by Adam Johnson](https://adamj.eu/tech/2021/07/10/python-type-hints-how-to-avoid-the-boolean-trap/)
 #[violation]
-pub struct BooleanPositionalArgInFunctionDefinition;
+pub struct BooleanTypeHintPositionalArgument;
 
-impl Violation for BooleanPositionalArgInFunctionDefinition {
+impl Violation for BooleanTypeHintPositionalArgument {
     #[derive_message_formats]
     fn message(&self) -> String {
-        format!("Boolean positional arg in function definition")
+        format!("Boolean-typed positional argument in function definition")
     }
 }
 
-pub(crate) fn check_positional_boolean_in_def(
+pub(crate) fn boolean_type_hint_positional_argument(
     checker: &mut Checker,
     name: &str,
     decorator_list: &[Decorator],
@@ -101,15 +120,12 @@ pub(crate) fn check_positional_boolean_in_def(
         range: _,
     } in parameters.posonlyargs.iter().chain(¶meters.args)
     {
-        if parameter.annotation.is_none() {
-            continue;
-        }
-        let Some(expr) = ¶meter.annotation else {
+        let Some(annotation) = parameter.annotation.as_ref() else {
             continue;
         };
 
         // check for both bool (python class) and 'bool' (string annotation)
-        let hint = match expr.as_ref() {
+        let hint = match annotation.as_ref() {
             Expr::Name(name) => &name.id == "bool",
             Expr::Constant(ast::ExprConstant {
                 value: Constant::Str(ast::StringConstant { value, .. }),
@@ -117,12 +133,12 @@ pub(crate) fn check_positional_boolean_in_def(
             }) => value == "bool",
             _ => false,
         };
-        if !hint {
+        if !hint || !checker.semantic().is_builtin("bool") {
             continue;
         }
         checker.diagnostics.push(Diagnostic::new(
-            BooleanPositionalArgInFunctionDefinition,
-            parameter.range(),
+            BooleanTypeHintPositionalArgument,
+            parameter.name.range(),
         ));
     }
 }
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs b/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs
deleted file mode 100644
index ecf8ff7dc8..0000000000
--- a/crates/ruff/src/rules/flake8_boolean_trap/rules/check_boolean_default_value_in_function_definition.rs
+++ /dev/null
@@ -1,91 +0,0 @@
-use ruff_python_ast::{Decorator, ParameterWithDefault, Parameters};
-
-use ruff_diagnostics::Violation;
-use ruff_macros::{derive_message_formats, violation};
-use ruff_python_ast::call_path::collect_call_path;
-
-use crate::checkers::ast::Checker;
-use crate::rules::flake8_boolean_trap::helpers::{add_if_boolean, is_allowed_func_def};
-
-/// ## What it does
-/// Checks for the use of booleans as default values in function definitions.
-///
-/// ## Why is this bad?
-/// Calling a function with boolean default means that the keyword argument
-/// argument can be omitted, which makes the function call ambiguous.
-///
-/// Instead, consider defining the relevant argument as a required keyword
-/// argument to force callers to be explicit about their intent.
-///
-/// ## Example
-/// ```python
-/// from math import ceil, floor
-///
-///
-/// def round_number(number: float, up: bool = True) -> int:
-///     return ceil(number) if up else floor(number)
-///
-///
-/// round_number(1.5)
-/// round_number(1.5, up=False)
-/// ```
-///
-/// Use instead:
-/// ```python
-/// from math import ceil, floor
-///
-///
-/// def round_number(number: float, *, up: bool) -> int:
-///     return ceil(number) if up else floor(number)
-///
-///
-/// round_number(1.5, up=True)
-/// round_number(1.5, up=False)
-/// ```
-///
-/// ## References
-/// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls)
-/// - [_How to Avoid “The Boolean Trap”_ by Adam Johnson](https://adamj.eu/tech/2021/07/10/python-type-hints-how-to-avoid-the-boolean-trap/)
-#[violation]
-pub struct BooleanDefaultValueInFunctionDefinition;
-
-impl Violation for BooleanDefaultValueInFunctionDefinition {
-    #[derive_message_formats]
-    fn message(&self) -> String {
-        format!("Boolean default value in function definition")
-    }
-}
-
-pub(crate) fn check_boolean_default_value_in_function_definition(
-    checker: &mut Checker,
-    name: &str,
-    decorator_list: &[Decorator],
-    parameters: &Parameters,
-) {
-    if is_allowed_func_def(name) {
-        return;
-    }
-
-    if decorator_list.iter().any(|decorator| {
-        collect_call_path(&decorator.expression)
-            .is_some_and(|call_path| call_path.as_slice() == [name, "setter"])
-    }) {
-        return;
-    }
-
-    for ParameterWithDefault {
-        parameter: _,
-        default,
-        range: _,
-    } in parameters.args.iter().chain(¶meters.posonlyargs)
-    {
-        let Some(default) = default else {
-            continue;
-        };
-        add_if_boolean(
-            checker,
-            default,
-            BooleanDefaultValueInFunctionDefinition.into(),
-        );
-    }
-}
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/rules/mod.rs b/crates/ruff/src/rules/flake8_boolean_trap/rules/mod.rs
index b40aa58dc5..a9aae13b67 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/rules/mod.rs
+++ b/crates/ruff/src/rules/flake8_boolean_trap/rules/mod.rs
@@ -1,7 +1,7 @@
-pub(crate) use check_boolean_default_value_in_function_definition::*;
-pub(crate) use check_boolean_positional_value_in_function_call::*;
-pub(crate) use check_positional_boolean_in_def::*;
+pub(crate) use boolean_default_value_positional_argument::*;
+pub(crate) use boolean_positional_value_in_call::*;
+pub(crate) use boolean_type_hint_positional_argument::*;
 
-mod check_boolean_default_value_in_function_definition;
-mod check_boolean_positional_value_in_function_call;
-mod check_positional_boolean_in_def;
+mod boolean_default_value_positional_argument;
+mod boolean_positional_value_in_call;
+mod boolean_type_hint_positional_argument;
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT001_FBT.py.snap b/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT001_FBT.py.snap
index f973bacf59..1c38f9930e 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT001_FBT.py.snap
+++ b/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT001_FBT.py.snap
@@ -1,91 +1,91 @@
 ---
 source: crates/ruff/src/rules/flake8_boolean_trap/mod.rs
 ---
-FBT.py:4:5: FBT001 Boolean positional arg in function definition
+FBT.py:4:5: FBT001 Boolean-typed positional argument in function definition
   |
 2 |     posonly_nohint,
 3 |     posonly_nonboolhint: int,
 4 |     posonly_boolhint: bool,
-  |     ^^^^^^^^^^^^^^^^^^^^^^ FBT001
+  |     ^^^^^^^^^^^^^^^^ FBT001
 5 |     posonly_boolstrhint: "bool",
 6 |     /,
   |
 
-FBT.py:5:5: FBT001 Boolean positional arg in function definition
+FBT.py:5:5: FBT001 Boolean-typed positional argument in function definition
   |
 3 |     posonly_nonboolhint: int,
 4 |     posonly_boolhint: bool,
 5 |     posonly_boolstrhint: "bool",
-  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
+  |     ^^^^^^^^^^^^^^^^^^^ FBT001
 6 |     /,
 7 |     offset,
   |
 
-FBT.py:10:5: FBT001 Boolean positional arg in function definition
+FBT.py:10:5: FBT001 Boolean-typed positional argument in function definition
    |
  8 |     posorkw_nonvalued_nohint,
  9 |     posorkw_nonvalued_nonboolhint: int,
 10 |     posorkw_nonvalued_boolhint: bool,
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
 11 |     posorkw_nonvalued_boolstrhint: "bool",
 12 |     posorkw_boolvalued_nohint=True,
    |
 
-FBT.py:11:5: FBT001 Boolean positional arg in function definition
+FBT.py:11:5: FBT001 Boolean-typed positional argument in function definition
    |
  9 |     posorkw_nonvalued_nonboolhint: int,
 10 |     posorkw_nonvalued_boolhint: bool,
 11 |     posorkw_nonvalued_boolstrhint: "bool",
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
 12 |     posorkw_boolvalued_nohint=True,
 13 |     posorkw_boolvalued_nonboolhint: int = True,
    |
 
-FBT.py:14:5: FBT001 Boolean positional arg in function definition
+FBT.py:14:5: FBT001 Boolean-typed positional argument in function definition
    |
 12 |     posorkw_boolvalued_nohint=True,
 13 |     posorkw_boolvalued_nonboolhint: int = True,
 14 |     posorkw_boolvalued_boolhint: bool = True,
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
 15 |     posorkw_boolvalued_boolstrhint: "bool" = True,
 16 |     posorkw_nonboolvalued_nohint=1,
    |
 
-FBT.py:15:5: FBT001 Boolean positional arg in function definition
+FBT.py:15:5: FBT001 Boolean-typed positional argument in function definition
    |
 13 |     posorkw_boolvalued_nonboolhint: int = True,
 14 |     posorkw_boolvalued_boolhint: bool = True,
 15 |     posorkw_boolvalued_boolstrhint: "bool" = True,
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
 16 |     posorkw_nonboolvalued_nohint=1,
 17 |     posorkw_nonboolvalued_nonboolhint: int = 2,
    |
 
-FBT.py:18:5: FBT001 Boolean positional arg in function definition
+FBT.py:18:5: FBT001 Boolean-typed positional argument in function definition
    |
 16 |     posorkw_nonboolvalued_nohint=1,
 17 |     posorkw_nonboolvalued_nonboolhint: int = 2,
 18 |     posorkw_nonboolvalued_boolhint: bool = 3,
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
 19 |     posorkw_nonboolvalued_boolstrhint: "bool" = 4,
 20 |     *,
    |
 
-FBT.py:19:5: FBT001 Boolean positional arg in function definition
+FBT.py:19:5: FBT001 Boolean-typed positional argument in function definition
    |
 17 |     posorkw_nonboolvalued_nonboolhint: int = 2,
 18 |     posorkw_nonboolvalued_boolhint: bool = 3,
 19 |     posorkw_nonboolvalued_boolstrhint: "bool" = 4,
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT001
 20 |     *,
 21 |     kwonly_nonvalued_nohint,
    |
 
-FBT.py:86:19: FBT001 Boolean positional arg in function definition
+FBT.py:86:19: FBT001 Boolean-typed positional argument in function definition
    |
 85 |     # FBT001: Boolean positional arg in function definition
 86 |     def foo(self, value: bool) -> None:
-   |                   ^^^^^^^^^^^ FBT001
+   |                   ^^^^^ FBT001
 87 |         pass
    |
 
diff --git a/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT002_FBT.py.snap b/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT002_FBT.py.snap
index 5a76f50142..688254791d 100644
--- a/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT002_FBT.py.snap
+++ b/crates/ruff/src/rules/flake8_boolean_trap/snapshots/ruff__rules__flake8_boolean_trap__tests__FBT002_FBT.py.snap
@@ -1,42 +1,42 @@
 ---
 source: crates/ruff/src/rules/flake8_boolean_trap/mod.rs
 ---
-FBT.py:12:31: FBT002 Boolean default value in function definition
+FBT.py:12:5: FBT002 Boolean default positional argument in function definition
    |
 10 |     posorkw_nonvalued_boolhint: bool,
 11 |     posorkw_nonvalued_boolstrhint: "bool",
 12 |     posorkw_boolvalued_nohint=True,
-   |                               ^^^^ FBT002
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^ FBT002
 13 |     posorkw_boolvalued_nonboolhint: int = True,
 14 |     posorkw_boolvalued_boolhint: bool = True,
    |
 
-FBT.py:13:43: FBT002 Boolean default value in function definition
+FBT.py:13:5: FBT002 Boolean default positional argument in function definition
    |
 11 |     posorkw_nonvalued_boolstrhint: "bool",
 12 |     posorkw_boolvalued_nohint=True,
 13 |     posorkw_boolvalued_nonboolhint: int = True,
-   |                                           ^^^^ FBT002
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT002
 14 |     posorkw_boolvalued_boolhint: bool = True,
 15 |     posorkw_boolvalued_boolstrhint: "bool" = True,
    |
 
-FBT.py:14:41: FBT002 Boolean default value in function definition
+FBT.py:14:5: FBT002 Boolean default positional argument in function definition
    |
 12 |     posorkw_boolvalued_nohint=True,
 13 |     posorkw_boolvalued_nonboolhint: int = True,
 14 |     posorkw_boolvalued_boolhint: bool = True,
-   |                                         ^^^^ FBT002
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT002
 15 |     posorkw_boolvalued_boolstrhint: "bool" = True,
 16 |     posorkw_nonboolvalued_nohint=1,
    |
 
-FBT.py:15:46: FBT002 Boolean default value in function definition
+FBT.py:15:5: FBT002 Boolean default positional argument in function definition
    |
 13 |     posorkw_boolvalued_nonboolhint: int = True,
 14 |     posorkw_boolvalued_boolhint: bool = True,
 15 |     posorkw_boolvalued_boolstrhint: "bool" = True,
-   |                                              ^^^^ FBT002
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FBT002
 16 |     posorkw_nonboolvalued_nohint=1,
 17 |     posorkw_nonboolvalued_nonboolhint: int = 2,
    |

From cd634a948946e729c62be685715a3ebfb1ee1377 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 15:47:10 -0400
Subject: [PATCH 118/155] Expand documentation around flake8-type-checking
 rules for SQLAlchemy (#6570)

## Summary

Not addressing the root issue as much as improving the documentation.

Closes https://github.com/astral-sh/ruff/issues/6510.
---
 .../runtime_evaluated_base_classes_4.py       | 12 ++++
 .../src/rules/flake8_type_checking/mod.rs     |  9 ++-
 .../rules/typing_only_runtime_import.rs       | 62 +++++++++++++++----
 .../rules/flake8_type_checking/settings.rs    | 11 +++-
 ...t_runtime_evaluated_base_classes_4.py.snap |  4 ++
 ruff.schema.json                              |  4 +-
 6 files changed, 85 insertions(+), 17 deletions(-)
 create mode 100644 crates/ruff/resources/test/fixtures/flake8_type_checking/runtime_evaluated_base_classes_4.py
 create mode 100644 crates/ruff/src/rules/flake8_type_checking/snapshots/ruff__rules__flake8_type_checking__tests__typing-only-standard-library-import_runtime_evaluated_base_classes_4.py.snap

diff --git a/crates/ruff/resources/test/fixtures/flake8_type_checking/runtime_evaluated_base_classes_4.py b/crates/ruff/resources/test/fixtures/flake8_type_checking/runtime_evaluated_base_classes_4.py
new file mode 100644
index 0000000000..55da289edc
--- /dev/null
+++ b/crates/ruff/resources/test/fixtures/flake8_type_checking/runtime_evaluated_base_classes_4.py
@@ -0,0 +1,12 @@
+from __future__ import annotations
+
+from datetime import date
+
+from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
+
+
+class Birthday(DeclarativeBase):
+
+    __tablename__ = "birthday"
+    id: Mapped[int] = mapped_column(primary_key=True)
+    day: Mapped[date]
diff --git a/crates/ruff/src/rules/flake8_type_checking/mod.rs b/crates/ruff/src/rules/flake8_type_checking/mod.rs
index 3be76de290..99a76cb890 100644
--- a/crates/ruff/src/rules/flake8_type_checking/mod.rs
+++ b/crates/ruff/src/rules/flake8_type_checking/mod.rs
@@ -89,13 +89,20 @@ mod tests {
         Rule::TypingOnlyStandardLibraryImport,
         Path::new("runtime_evaluated_base_classes_3.py")
     )]
+    #[test_case(
+        Rule::TypingOnlyStandardLibraryImport,
+        Path::new("runtime_evaluated_base_classes_4.py")
+    )]
     fn runtime_evaluated_base_classes(rule_code: Rule, path: &Path) -> Result<()> {
         let snapshot = format!("{}_{}", rule_code.as_ref(), path.to_string_lossy());
         let diagnostics = test_path(
             Path::new("flake8_type_checking").join(path).as_path(),
             &settings::Settings {
                 flake8_type_checking: super::settings::Settings {
-                    runtime_evaluated_base_classes: vec!["pydantic.BaseModel".to_string()],
+                    runtime_evaluated_base_classes: vec![
+                        "pydantic.BaseModel".to_string(),
+                        "sqlalchemy.orm.DeclarativeBase".to_string(),
+                    ],
                     ..Default::default()
                 },
                 ..settings::Settings::for_rule(rule_code)
diff --git a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs
index 19b2f3472b..3d9d968431 100644
--- a/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs
+++ b/crates/ruff/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs
@@ -20,17 +20,25 @@ use crate::rules::isort::{categorize, ImportSection, ImportType};
 ///
 /// ## Why is this bad?
 /// Unused imports add a performance overhead at runtime, and risk creating
-/// import cycles.
+/// import cycles. If an import is _only_ used in typing-only contexts, it can
+/// instead be imported conditionally under an `if TYPE_CHECKING:` block to
+/// minimize runtime overhead.
+///
+/// If a class _requires_ that type annotations be available at runtime (as is
+/// the case for Pydantic, SQLAlchemy, and other libraries), consider using
+/// the [`flake8-type-checking.runtime-evaluated-base-classes`] and
+/// [`flake8-type-checking.runtime-evaluated-decorators`] settings to mark them
+/// as such.
 ///
 /// ## Example
 /// ```python
 /// from __future__ import annotations
 ///
-/// import A
+/// import local_module
 ///
 ///
-/// def foo(a: A) -> int:
-///     return len(a)
+/// def func(sized: local_module.Container) -> int:
+///     return len(sized)
 /// ```
 ///
 /// Use instead:
@@ -40,13 +48,17 @@ use crate::rules::isort::{categorize, ImportSection, ImportType};
 /// from typing import TYPE_CHECKING
 ///
 /// if TYPE_CHECKING:
-///     import A
+///     import local_module
 ///
 ///
-/// def foo(a: A) -> int:
-///     return len(a)
+/// def func(sized: local_module.Container) -> int:
+///     return len(sized)
 /// ```
 ///
+/// ## Options
+/// - `flake8-type-checking.runtime-evaluated-base-classes`
+/// - `flake8-type-checking.runtime-evaluated-decorators`
+///
 /// ## References
 /// - [PEP 536](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking)
 #[violation]
@@ -76,7 +88,15 @@ impl Violation for TypingOnlyFirstPartyImport {
 ///
 /// ## Why is this bad?
 /// Unused imports add a performance overhead at runtime, and risk creating
-/// import cycles.
+/// import cycles. If an import is _only_ used in typing-only contexts, it can
+/// instead be imported conditionally under an `if TYPE_CHECKING:` block to
+/// minimize runtime overhead.
+///
+/// If a class _requires_ that type annotations be available at runtime (as is
+/// the case for Pydantic, SQLAlchemy, and other libraries), consider using
+/// the [`flake8-type-checking.runtime-evaluated-base-classes`] and
+/// [`flake8-type-checking.runtime-evaluated-decorators`] settings to mark them
+/// as such.
 ///
 /// ## Example
 /// ```python
@@ -85,7 +105,7 @@ impl Violation for TypingOnlyFirstPartyImport {
 /// import pandas as pd
 ///
 ///
-/// def foo(df: pd.DataFrame) -> int:
+/// def func(df: pd.DataFrame) -> int:
 ///     return len(df)
 /// ```
 ///
@@ -99,10 +119,14 @@ impl Violation for TypingOnlyFirstPartyImport {
 ///     import pandas as pd
 ///
 ///
-/// def foo(df: pd.DataFrame) -> int:
+/// def func(df: pd.DataFrame) -> int:
 ///     return len(df)
 /// ```
 ///
+/// ## Options
+/// - `flake8-type-checking.runtime-evaluated-base-classes`
+/// - `flake8-type-checking.runtime-evaluated-decorators`
+///
 /// ## References
 /// - [PEP 536](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking)
 #[violation]
@@ -132,7 +156,15 @@ impl Violation for TypingOnlyThirdPartyImport {
 ///
 /// ## Why is this bad?
 /// Unused imports add a performance overhead at runtime, and risk creating
-/// import cycles.
+/// import cycles. If an import is _only_ used in typing-only contexts, it can
+/// instead be imported conditionally under an `if TYPE_CHECKING:` block to
+/// minimize runtime overhead.
+///
+/// If a class _requires_ that type annotations be available at runtime (as is
+/// the case for Pydantic, SQLAlchemy, and other libraries), consider using
+/// the [`flake8-type-checking.runtime-evaluated-base-classes`] and
+/// [`flake8-type-checking.runtime-evaluated-decorators`] settings to mark them
+/// as such.
 ///
 /// ## Example
 /// ```python
@@ -141,7 +173,7 @@ impl Violation for TypingOnlyThirdPartyImport {
 /// from pathlib import Path
 ///
 ///
-/// def foo(path: Path) -> str:
+/// def func(path: Path) -> str:
 ///     return str(path)
 /// ```
 ///
@@ -155,10 +187,14 @@ impl Violation for TypingOnlyThirdPartyImport {
 ///     from pathlib import Path
 ///
 ///
-/// def foo(path: Path) -> str:
+/// def func(path: Path) -> str:
 ///     return str(path)
 /// ```
 ///
+/// ## Options
+/// - `flake8-type-checking.runtime-evaluated-base-classes`
+/// - `flake8-type-checking.runtime-evaluated-decorators`
+///
 /// ## References
 /// - [PEP 536](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking)
 #[violation]
diff --git a/crates/ruff/src/rules/flake8_type_checking/settings.rs b/crates/ruff/src/rules/flake8_type_checking/settings.rs
index 69cd913dae..4e9871e5ec 100644
--- a/crates/ruff/src/rules/flake8_type_checking/settings.rs
+++ b/crates/ruff/src/rules/flake8_type_checking/settings.rs
@@ -23,6 +23,7 @@ pub struct Options {
     )]
     /// Enforce TC001, TC002, and TC003 rules even when valid runtime imports
     /// are present for the same module.
+    ///
     /// See flake8-type-checking's [strict](https://github.com/snok/flake8-type-checking#strict) option.
     pub strict: Option,
     #[option(
@@ -39,11 +40,19 @@ pub struct Options {
         default = "[]",
         value_type = "list[str]",
         example = r#"
-            runtime-evaluated-base-classes = ["pydantic.BaseModel"]
+            runtime-evaluated-base-classes = ["pydantic.BaseModel", "sqlalchemy.orm.DeclarativeBase"]
         "#
     )]
     /// Exempt classes that list any of the enumerated classes as a base class
     /// from needing to be moved into type-checking blocks.
+    ///
+    /// Common examples include Pydantic's `pydantic.BaseModel` and SQLAlchemy's
+    /// `sqlalchemy.orm.DeclarativeBase`, but can also support user-defined
+    /// classes that inherit from those base classes. For example, if you define
+    /// a common `DeclarativeBase` subclass that's used throughout your project
+    /// (e.g., `class Base(DeclarativeBase) ...` in `base.py`), you can add it to
+    /// this list (`runtime-evaluated-base-classes = ["base.Base"]`) to exempt
+    /// models from being moved into type-checking blocks.
     pub runtime_evaluated_base_classes: Option>,
     #[option(
         default = "[]",
diff --git a/crates/ruff/src/rules/flake8_type_checking/snapshots/ruff__rules__flake8_type_checking__tests__typing-only-standard-library-import_runtime_evaluated_base_classes_4.py.snap b/crates/ruff/src/rules/flake8_type_checking/snapshots/ruff__rules__flake8_type_checking__tests__typing-only-standard-library-import_runtime_evaluated_base_classes_4.py.snap
new file mode 100644
index 0000000000..abbbb06448
--- /dev/null
+++ b/crates/ruff/src/rules/flake8_type_checking/snapshots/ruff__rules__flake8_type_checking__tests__typing-only-standard-library-import_runtime_evaluated_base_classes_4.py.snap
@@ -0,0 +1,4 @@
+---
+source: crates/ruff/src/rules/flake8_type_checking/mod.rs
+---
+
diff --git a/ruff.schema.json b/ruff.schema.json
index 95cda80152..c60a447c5a 100644
--- a/ruff.schema.json
+++ b/ruff.schema.json
@@ -1090,7 +1090,7 @@
           }
         },
         "runtime-evaluated-base-classes": {
-          "description": "Exempt classes that list any of the enumerated classes as a base class from needing to be moved into type-checking blocks.",
+          "description": "Exempt classes that list any of the enumerated classes as a base class from needing to be moved into type-checking blocks.\n\nCommon examples include Pydantic's `pydantic.BaseModel` and SQLAlchemy's `sqlalchemy.orm.DeclarativeBase`, but can also support user-defined classes that inherit from those base classes. For example, if you define a common `DeclarativeBase` subclass that's used throughout your project (e.g., `class Base(DeclarativeBase) ...` in `base.py`), you can add it to this list (`runtime-evaluated-base-classes = [\"base.Base\"]`) to exempt models from being moved into type-checking blocks.",
           "type": [
             "array",
             "null"
@@ -1110,7 +1110,7 @@
           }
         },
         "strict": {
-          "description": "Enforce TC001, TC002, and TC003 rules even when valid runtime imports are present for the same module. See flake8-type-checking's [strict](https://github.com/snok/flake8-type-checking#strict) option.",
+          "description": "Enforce TC001, TC002, and TC003 rules even when valid runtime imports are present for the same module.\n\nSee flake8-type-checking's [strict](https://github.com/snok/flake8-type-checking#strict) option.",
           "type": [
             "boolean",
             "null"

From 70696061cd0822e9212725415aabc77905f85067 Mon Sep 17 00:00:00 2001
From: Harutaka Kawamura 
Date: Tue, 15 Aug 2023 05:25:23 +0900
Subject: [PATCH 119/155] [`flake8-pytest-style`] Implement
 `pytest-unittest-raises-assertion` (`PT027`) (#6554)

---
 .../fixtures/flake8_pytest_style/PT027_0.py   |  48 ++++
 .../fixtures/flake8_pytest_style/PT027_1.py   |  12 +
 .../src/checkers/ast/analyze/expression.rs    |   7 +
 crates/ruff/src/codes.rs                      |   1 +
 .../ruff/src/rules/flake8_pytest_style/mod.rs |  12 +
 .../flake8_pytest_style/rules/assertion.rs    | 185 ++++++++++++-
 ...__flake8_pytest_style__tests__PT027_0.snap | 248 ++++++++++++++++++
 ...__flake8_pytest_style__tests__PT027_1.snap |  21 ++
 .../tryceratops/rules/raise_vanilla_args.rs   |   3 +-
 ruff.schema.json                              |   1 +
 10 files changed, 536 insertions(+), 2 deletions(-)
 create mode 100644 crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_0.py
 create mode 100644 crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_1.py
 create mode 100644 crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_0.snap
 create mode 100644 crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_1.snap

diff --git a/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_0.py b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_0.py
new file mode 100644
index 0000000000..b9614f0647
--- /dev/null
+++ b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_0.py
@@ -0,0 +1,48 @@
+import unittest
+
+
+class Test(unittest.TestCase):
+    def test_errors(self):
+        with self.assertRaises(ValueError):
+            raise ValueError
+        with self.assertRaises(expected_exception=ValueError):
+            raise ValueError
+
+        with self.failUnlessRaises(ValueError):
+            raise ValueError
+
+        with self.assertRaisesRegex(ValueError, "test"):
+            raise ValueError("test")
+
+        with self.assertRaisesRegex(ValueError, expected_regex="test"):
+            raise ValueError("test")
+
+        with self.assertRaisesRegex(
+            expected_exception=ValueError, expected_regex="test"
+        ):
+            raise ValueError("test")
+
+        with self.assertRaisesRegex(
+            expected_regex="test", expected_exception=ValueError
+        ):
+            raise ValueError("test")
+
+        with self.assertRaisesRegexp(ValueError, "test"):
+            raise ValueError("test")
+
+    def test_unfixable_errors(self):
+        with self.assertRaises(ValueError, msg="msg"):
+            raise ValueError
+
+        with self.assertRaises(
+            # comment
+            ValueError
+        ):
+            raise ValueError
+
+        with (
+            self
+            # comment
+            .assertRaises(ValueError)
+        ):
+            raise ValueError
diff --git a/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_1.py b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_1.py
new file mode 100644
index 0000000000..708a582ad3
--- /dev/null
+++ b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT027_1.py
@@ -0,0 +1,12 @@
+import unittest
+import pytest
+
+
+class Test(unittest.TestCase):
+    def test_pytest_raises(self):
+        with pytest.raises(ValueError):
+            raise ValueError
+
+    def test_errors(self):
+        with self.assertRaises(ValueError):
+            raise ValueError
diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs
index 2ea6293cdc..2951899f4c 100644
--- a/crates/ruff/src/checkers/ast/analyze/expression.rs
+++ b/crates/ruff/src/checkers/ast/analyze/expression.rs
@@ -756,6 +756,13 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) {
                     checker.diagnostics.push(diagnostic);
                 }
             }
+            if checker.enabled(Rule::PytestUnittestRaisesAssertion) {
+                if let Some(diagnostic) =
+                    flake8_pytest_style::rules::unittest_raises_assertion(checker, call)
+                {
+                    checker.diagnostics.push(diagnostic);
+                }
+            }
             if checker.enabled(Rule::SubprocessPopenPreexecFn) {
                 pylint::rules::subprocess_popen_preexec_fn(checker, call);
             }
diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs
index b8ac97ab17..79add843bc 100644
--- a/crates/ruff/src/codes.rs
+++ b/crates/ruff/src/codes.rs
@@ -697,6 +697,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> {
         (Flake8PytestStyle, "024") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestUnnecessaryAsyncioMarkOnFixture),
         (Flake8PytestStyle, "025") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestErroneousUseFixturesOnFixture),
         (Flake8PytestStyle, "026") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestUseFixturesWithoutParameters),
+        (Flake8PytestStyle, "027") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestUnittestRaisesAssertion),
 
         // flake8-pie
         (Flake8Pie, "790") => (RuleGroup::Unspecified, rules::flake8_pie::rules::UnnecessaryPass),
diff --git a/crates/ruff/src/rules/flake8_pytest_style/mod.rs b/crates/ruff/src/rules/flake8_pytest_style/mod.rs
index c36222950e..023ba3d23e 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/mod.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/mod.rs
@@ -250,6 +250,18 @@ mod tests {
         Settings::default(),
         "PT026"
     )]
+    #[test_case(
+        Rule::PytestUnittestRaisesAssertion,
+        Path::new("PT027_0.py"),
+        Settings::default(),
+        "PT027_0"
+    )]
+    #[test_case(
+        Rule::PytestUnittestRaisesAssertion,
+        Path::new("PT027_1.py"),
+        Settings::default(),
+        "PT027_1"
+    )]
     fn test_pytest_style(
         rule_code: Rule,
         path: &Path,
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs
index dbb571c527..5514cd8744 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs
@@ -7,12 +7,14 @@ use libcst_native::{
     ParenthesizedNode, SimpleStatementLine, SimpleWhitespace, SmallStatement, Statement,
     TrailingWhitespace, UnaryOperation,
 };
-use ruff_python_ast::{self as ast, BoolOp, ExceptHandler, Expr, Keyword, Ranged, Stmt, UnaryOp};
 
 use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation};
 use ruff_macros::{derive_message_formats, violation};
 use ruff_python_ast::helpers::Truthiness;
 use ruff_python_ast::visitor::Visitor;
+use ruff_python_ast::{
+    self as ast, Arguments, BoolOp, ExceptHandler, Expr, Keyword, Ranged, Stmt, UnaryOp,
+};
 use ruff_python_ast::{visitor, whitespace};
 use ruff_python_codegen::Stylist;
 use ruff_source_file::Locator;
@@ -21,6 +23,7 @@ use crate::autofix::codemods::CodegenStylist;
 use crate::checkers::ast::Checker;
 use crate::cst::matchers::match_indented_block;
 use crate::cst::matchers::match_module;
+use crate::importer::ImportRequest;
 use crate::registry::AsRule;
 
 use super::unittest_assert::UnittestAssert;
@@ -291,6 +294,186 @@ pub(crate) fn unittest_assertion(
     }
 }
 
+/// ## What it does
+/// Checks for uses of exception-related assertion methods from the `unittest`
+/// module.
+///
+/// ## Why is this bad?
+/// To enforce the assertion style recommended by `pytest`, `pytest.raises` is
+/// preferred over the exception-related assertion methods in `unittest`, like
+/// `assertRaises`.
+///
+/// ## Example
+/// ```python
+/// import unittest
+///
+///
+/// class TestFoo(unittest.TestCase):
+///     def test_foo(self):
+///         with self.assertRaises(ValueError):
+///             raise ValueError("foo")
+/// ```
+///
+/// Use instead:
+/// ```python
+/// import unittest
+/// import pytest
+///
+///
+/// class TestFoo(unittest.TestCase):
+///     def test_foo(self):
+///         with pytest.raises(ValueError):
+///             raise ValueError("foo")
+/// ```
+///
+/// ## References
+/// - [`pytest` documentation: Assertions about expected exceptions](https://docs.pytest.org/en/latest/how-to/assert.html#assertions-about-expected-exceptions)
+#[violation]
+pub struct PytestUnittestRaisesAssertion {
+    assertion: String,
+}
+
+impl Violation for PytestUnittestRaisesAssertion {
+    const AUTOFIX: AutofixKind = AutofixKind::Sometimes;
+
+    #[derive_message_formats]
+    fn message(&self) -> String {
+        let PytestUnittestRaisesAssertion { assertion } = self;
+        format!("Use `pytest.raises` instead of unittest-style `{assertion}`")
+    }
+
+    fn autofix_title(&self) -> Option {
+        let PytestUnittestRaisesAssertion { assertion } = self;
+        Some(format!("Replace `{assertion}` with `pytest.raises`"))
+    }
+}
+
+/// PT027
+pub(crate) fn unittest_raises_assertion(
+    checker: &Checker,
+    call: &ast::ExprCall,
+) -> Option {
+    let Expr::Attribute(ast::ExprAttribute { attr, .. }) = call.func.as_ref() else {
+        return None;
+    };
+
+    if !matches!(
+        attr.as_str(),
+        "assertRaises" | "failUnlessRaises" | "assertRaisesRegex" | "assertRaisesRegexp"
+    ) {
+        return None;
+    }
+
+    let mut diagnostic = Diagnostic::new(
+        PytestUnittestRaisesAssertion {
+            assertion: attr.to_string(),
+        },
+        call.func.range(),
+    );
+    if checker.patch(diagnostic.kind.rule())
+        && !checker.indexer().has_comments(call, checker.locator())
+    {
+        if let Some(args) = to_pytest_raises_args(checker, attr.as_str(), &call.arguments) {
+            diagnostic.try_set_fix(|| {
+                let (import_edit, binding) = checker.importer().get_or_import_symbol(
+                    &ImportRequest::import("pytest", "raises"),
+                    call.func.start(),
+                    checker.semantic(),
+                )?;
+                let edit = Edit::range_replacement(format!("{binding}({args})"), call.range());
+                Ok(Fix::suggested_edits(import_edit, [edit]))
+            });
+        }
+    }
+
+    Some(diagnostic)
+}
+
+fn to_pytest_raises_args<'a>(
+    checker: &Checker<'a>,
+    attr: &str,
+    arguments: &Arguments,
+) -> Option> {
+    let args = match attr {
+        "assertRaises" | "failUnlessRaises" => {
+            match (arguments.args.as_slice(), arguments.keywords.as_slice()) {
+                // Ex) `assertRaises(Exception)`
+                ([arg], []) => Cow::Borrowed(checker.locator().slice(arg.range())),
+                // Ex) `assertRaises(expected_exception=Exception)`
+                ([], [kwarg])
+                    if kwarg
+                        .arg
+                        .as_ref()
+                        .is_some_and(|id| id.as_str() == "expected_exception") =>
+                {
+                    Cow::Borrowed(checker.locator().slice(kwarg.value.range()))
+                }
+                _ => return None,
+            }
+        }
+        "assertRaisesRegex" | "assertRaisesRegexp" => {
+            match (arguments.args.as_slice(), arguments.keywords.as_slice()) {
+                // Ex) `assertRaisesRegex(Exception, regex)`
+                ([arg1, arg2], []) => Cow::Owned(format!(
+                    "{}, match={}",
+                    checker.locator().slice(arg1.range()),
+                    checker.locator().slice(arg2.range())
+                )),
+                // Ex) `assertRaisesRegex(Exception, expected_regex=regex)`
+                ([arg], [kwarg])
+                    if kwarg
+                        .arg
+                        .as_ref()
+                        .is_some_and(|arg| arg.as_str() == "expected_regex") =>
+                {
+                    Cow::Owned(format!(
+                        "{}, match={}",
+                        checker.locator().slice(arg.range()),
+                        checker.locator().slice(kwarg.value.range())
+                    ))
+                }
+                // Ex) `assertRaisesRegex(expected_exception=Exception, expected_regex=regex)`
+                ([], [kwarg1, kwarg2])
+                    if kwarg1
+                        .arg
+                        .as_ref()
+                        .is_some_and(|id| id.as_str() == "expected_exception")
+                        && kwarg2
+                            .arg
+                            .as_ref()
+                            .is_some_and(|id| id.as_str() == "expected_regex") =>
+                {
+                    Cow::Owned(format!(
+                        "{}, match={}",
+                        checker.locator().slice(kwarg1.value.range()),
+                        checker.locator().slice(kwarg2.value.range())
+                    ))
+                }
+                // Ex) `assertRaisesRegex(expected_regex=regex, expected_exception=Exception)`
+                ([], [kwarg1, kwarg2])
+                    if kwarg1
+                        .arg
+                        .as_ref()
+                        .is_some_and(|id| id.as_str() == "expected_regex")
+                        && kwarg2
+                            .arg
+                            .as_ref()
+                            .is_some_and(|id| id.as_str() == "expected_exception") =>
+                {
+                    Cow::Owned(format!(
+                        "{}, match={}",
+                        checker.locator().slice(kwarg2.value.range()),
+                        checker.locator().slice(kwarg1.value.range())
+                    ))
+                }
+                _ => return None,
+            }
+        }
+        _ => return None,
+    };
+    Some(args)
+}
+
 /// PT015
 pub(crate) fn assert_falsy(checker: &mut Checker, stmt: &Stmt, test: &Expr) {
     if Truthiness::from_expr(test, |id| checker.semantic().is_builtin(id)).is_falsey() {
diff --git a/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_0.snap b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_0.snap
new file mode 100644
index 0000000000..8ac1da881c
--- /dev/null
+++ b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_0.snap
@@ -0,0 +1,248 @@
+---
+source: crates/ruff/src/rules/flake8_pytest_style/mod.rs
+---
+PT027_0.py:6:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaises`
+  |
+4 | class Test(unittest.TestCase):
+5 |     def test_errors(self):
+6 |         with self.assertRaises(ValueError):
+  |              ^^^^^^^^^^^^^^^^^ PT027
+7 |             raise ValueError
+8 |         with self.assertRaises(expected_exception=ValueError):
+  |
+  = help: Replace `assertRaises` with `pytest.raises`
+
+ℹ Suggested fix
+1 1 | import unittest
+  2 |+import pytest
+2 3 | 
+3 4 | 
+4 5 | class Test(unittest.TestCase):
+5 6 |     def test_errors(self):
+6   |-        with self.assertRaises(ValueError):
+  7 |+        with pytest.raises(ValueError):
+7 8 |             raise ValueError
+8 9 |         with self.assertRaises(expected_exception=ValueError):
+9 10 |             raise ValueError
+
+PT027_0.py:8:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaises`
+  |
+6 |         with self.assertRaises(ValueError):
+7 |             raise ValueError
+8 |         with self.assertRaises(expected_exception=ValueError):
+  |              ^^^^^^^^^^^^^^^^^ PT027
+9 |             raise ValueError
+  |
+  = help: Replace `assertRaises` with `pytest.raises`
+
+ℹ Suggested fix
+1  1  | import unittest
+   2  |+import pytest
+2  3  | 
+3  4  | 
+4  5  | class Test(unittest.TestCase):
+5  6  |     def test_errors(self):
+6  7  |         with self.assertRaises(ValueError):
+7  8  |             raise ValueError
+8     |-        with self.assertRaises(expected_exception=ValueError):
+   9  |+        with pytest.raises(ValueError):
+9  10 |             raise ValueError
+10 11 | 
+11 12 |         with self.failUnlessRaises(ValueError):
+
+PT027_0.py:11:14: PT027 [*] Use `pytest.raises` instead of unittest-style `failUnlessRaises`
+   |
+ 9 |             raise ValueError
+10 | 
+11 |         with self.failUnlessRaises(ValueError):
+   |              ^^^^^^^^^^^^^^^^^^^^^ PT027
+12 |             raise ValueError
+   |
+   = help: Replace `failUnlessRaises` with `pytest.raises`
+
+ℹ Suggested fix
+1  1  | import unittest
+   2  |+import pytest
+2  3  | 
+3  4  | 
+4  5  | class Test(unittest.TestCase):
+--------------------------------------------------------------------------------
+8  9  |         with self.assertRaises(expected_exception=ValueError):
+9  10 |             raise ValueError
+10 11 | 
+11    |-        with self.failUnlessRaises(ValueError):
+   12 |+        with pytest.raises(ValueError):
+12 13 |             raise ValueError
+13 14 | 
+14 15 |         with self.assertRaisesRegex(ValueError, "test"):
+
+PT027_0.py:14:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaisesRegex`
+   |
+12 |             raise ValueError
+13 | 
+14 |         with self.assertRaisesRegex(ValueError, "test"):
+   |              ^^^^^^^^^^^^^^^^^^^^^^ PT027
+15 |             raise ValueError("test")
+   |
+   = help: Replace `assertRaisesRegex` with `pytest.raises`
+
+ℹ Suggested fix
+1  1  | import unittest
+   2  |+import pytest
+2  3  | 
+3  4  | 
+4  5  | class Test(unittest.TestCase):
+--------------------------------------------------------------------------------
+11 12 |         with self.failUnlessRaises(ValueError):
+12 13 |             raise ValueError
+13 14 | 
+14    |-        with self.assertRaisesRegex(ValueError, "test"):
+   15 |+        with pytest.raises(ValueError, match="test"):
+15 16 |             raise ValueError("test")
+16 17 | 
+17 18 |         with self.assertRaisesRegex(ValueError, expected_regex="test"):
+
+PT027_0.py:17:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaisesRegex`
+   |
+15 |             raise ValueError("test")
+16 | 
+17 |         with self.assertRaisesRegex(ValueError, expected_regex="test"):
+   |              ^^^^^^^^^^^^^^^^^^^^^^ PT027
+18 |             raise ValueError("test")
+   |
+   = help: Replace `assertRaisesRegex` with `pytest.raises`
+
+ℹ Suggested fix
+1  1  | import unittest
+   2  |+import pytest
+2  3  | 
+3  4  | 
+4  5  | class Test(unittest.TestCase):
+--------------------------------------------------------------------------------
+14 15 |         with self.assertRaisesRegex(ValueError, "test"):
+15 16 |             raise ValueError("test")
+16 17 | 
+17    |-        with self.assertRaisesRegex(ValueError, expected_regex="test"):
+   18 |+        with pytest.raises(ValueError, match="test"):
+18 19 |             raise ValueError("test")
+19 20 | 
+20 21 |         with self.assertRaisesRegex(
+
+PT027_0.py:20:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaisesRegex`
+   |
+18 |             raise ValueError("test")
+19 | 
+20 |         with self.assertRaisesRegex(
+   |              ^^^^^^^^^^^^^^^^^^^^^^ PT027
+21 |             expected_exception=ValueError, expected_regex="test"
+22 |         ):
+   |
+   = help: Replace `assertRaisesRegex` with `pytest.raises`
+
+ℹ Suggested fix
+1  1  | import unittest
+   2  |+import pytest
+2  3  | 
+3  4  | 
+4  5  | class Test(unittest.TestCase):
+--------------------------------------------------------------------------------
+17 18 |         with self.assertRaisesRegex(ValueError, expected_regex="test"):
+18 19 |             raise ValueError("test")
+19 20 | 
+20    |-        with self.assertRaisesRegex(
+21    |-            expected_exception=ValueError, expected_regex="test"
+22    |-        ):
+   21 |+        with pytest.raises(ValueError, match="test"):
+23 22 |             raise ValueError("test")
+24 23 | 
+25 24 |         with self.assertRaisesRegex(
+
+PT027_0.py:25:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaisesRegex`
+   |
+23 |             raise ValueError("test")
+24 | 
+25 |         with self.assertRaisesRegex(
+   |              ^^^^^^^^^^^^^^^^^^^^^^ PT027
+26 |             expected_regex="test", expected_exception=ValueError
+27 |         ):
+   |
+   = help: Replace `assertRaisesRegex` with `pytest.raises`
+
+ℹ Suggested fix
+1  1  | import unittest
+   2  |+import pytest
+2  3  | 
+3  4  | 
+4  5  | class Test(unittest.TestCase):
+--------------------------------------------------------------------------------
+22 23 |         ):
+23 24 |             raise ValueError("test")
+24 25 | 
+25    |-        with self.assertRaisesRegex(
+26    |-            expected_regex="test", expected_exception=ValueError
+27    |-        ):
+   26 |+        with pytest.raises(ValueError, match="test"):
+28 27 |             raise ValueError("test")
+29 28 | 
+30 29 |         with self.assertRaisesRegexp(ValueError, "test"):
+
+PT027_0.py:30:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaisesRegexp`
+   |
+28 |             raise ValueError("test")
+29 | 
+30 |         with self.assertRaisesRegexp(ValueError, "test"):
+   |              ^^^^^^^^^^^^^^^^^^^^^^^ PT027
+31 |             raise ValueError("test")
+   |
+   = help: Replace `assertRaisesRegexp` with `pytest.raises`
+
+ℹ Suggested fix
+1  1  | import unittest
+   2  |+import pytest
+2  3  | 
+3  4  | 
+4  5  | class Test(unittest.TestCase):
+--------------------------------------------------------------------------------
+27 28 |         ):
+28 29 |             raise ValueError("test")
+29 30 | 
+30    |-        with self.assertRaisesRegexp(ValueError, "test"):
+   31 |+        with pytest.raises(ValueError, match="test"):
+31 32 |             raise ValueError("test")
+32 33 | 
+33 34 |     def test_unfixable_errors(self):
+
+PT027_0.py:34:14: PT027 Use `pytest.raises` instead of unittest-style `assertRaises`
+   |
+33 |     def test_unfixable_errors(self):
+34 |         with self.assertRaises(ValueError, msg="msg"):
+   |              ^^^^^^^^^^^^^^^^^ PT027
+35 |             raise ValueError
+   |
+   = help: Replace `assertRaises` with `pytest.raises`
+
+PT027_0.py:37:14: PT027 Use `pytest.raises` instead of unittest-style `assertRaises`
+   |
+35 |             raise ValueError
+36 | 
+37 |         with self.assertRaises(
+   |              ^^^^^^^^^^^^^^^^^ PT027
+38 |             # comment
+39 |             ValueError
+   |
+   = help: Replace `assertRaises` with `pytest.raises`
+
+PT027_0.py:44:13: PT027 Use `pytest.raises` instead of unittest-style `assertRaises`
+   |
+43 |           with (
+44 |               self
+   |  _____________^
+45 | |             # comment
+46 | |             .assertRaises(ValueError)
+   | |_________________________^ PT027
+47 |           ):
+48 |               raise ValueError
+   |
+   = help: Replace `assertRaises` with `pytest.raises`
+
+
diff --git a/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_1.snap b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_1.snap
new file mode 100644
index 0000000000..7656398481
--- /dev/null
+++ b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT027_1.snap
@@ -0,0 +1,21 @@
+---
+source: crates/ruff/src/rules/flake8_pytest_style/mod.rs
+---
+PT027_1.py:11:14: PT027 [*] Use `pytest.raises` instead of unittest-style `assertRaises`
+   |
+10 |     def test_errors(self):
+11 |         with self.assertRaises(ValueError):
+   |              ^^^^^^^^^^^^^^^^^ PT027
+12 |             raise ValueError
+   |
+   = help: Replace `assertRaises` with `pytest.raises`
+
+ℹ Suggested fix
+8  8  |             raise ValueError
+9  9  | 
+10 10 |     def test_errors(self):
+11    |-        with self.assertRaises(ValueError):
+   11 |+        with pytest.raises(ValueError):
+12 12 |             raise ValueError
+
+
diff --git a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
index d9cc91351b..aadfa930c4 100644
--- a/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
+++ b/crates/ruff/src/rules/tryceratops/rules/raise_vanilla_args.rs
@@ -58,7 +58,8 @@ pub(crate) fn raise_vanilla_args(checker: &mut Checker, expr: &Expr) {
         func,
         arguments: Arguments { args, .. },
         ..
-    }) = expr else {
+    }) = expr
+    else {
         return;
     };
 
diff --git a/ruff.schema.json b/ruff.schema.json
index c60a447c5a..ed2098be3e 100644
--- a/ruff.schema.json
+++ b/ruff.schema.json
@@ -2335,6 +2335,7 @@
         "PT024",
         "PT025",
         "PT026",
+        "PT027",
         "PTH",
         "PTH1",
         "PTH10",

From a3bf6d9cb7c7da0c485886e2e5d5526d77ff2955 Mon Sep 17 00:00:00 2001
From: konsti 
Date: Mon, 14 Aug 2023 22:40:56 +0200
Subject: [PATCH 120/155] Formatter ecosystem checks: Use twine instead of
 build (#6559)

---
 scripts/formatter_ecosystem_checks.sh | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/scripts/formatter_ecosystem_checks.sh b/scripts/formatter_ecosystem_checks.sh
index f26405212e..4acbce21a6 100755
--- a/scripts/formatter_ecosystem_checks.sh
+++ b/scripts/formatter_ecosystem_checks.sh
@@ -17,10 +17,10 @@ dir="$target/progress_projects"
 mkdir -p "$dir"
 
 # small util library
-if [ ! -d "$dir/build/.git" ]; then
-  git clone --filter=tree:0 https://github.com/pypa/build "$dir/build"
+if [ ! -d "$dir/twine/.git" ]; then
+  git clone --filter=tree:0 https://github.com/pypa/twine "$dir/twine"
 fi
-git -C "$dir/build" checkout d90f9ac6503a40ddbfaef94b7a7040f87178a4b3
+git -C "$dir/twine" checkout 0bb428c410b8df64c04dc881ac1db37d932f3066
 # web framework that implements a lot of magic
 if [ ! -d "$dir/django/.git" ]; then
   git clone --filter=tree:0 https://github.com/django/django "$dir/django"

From 1a52b548e7237816e288837cfc6983881a8d3d94 Mon Sep 17 00:00:00 2001
From: Evan Rittenhouse 
Date: Mon, 14 Aug 2023 15:47:37 -0500
Subject: [PATCH 121/155] Ignore PERF203 if `try` contains loop control flow
 statements (#6536)

---
 .../test/fixtures/perflint/PERF203.py         | 26 +++++++++++++
 .../perflint/rules/try_except_in_loop.rs      | 37 +++++++++++++++++--
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/crates/ruff/resources/test/fixtures/perflint/PERF203.py b/crates/ruff/resources/test/fixtures/perflint/PERF203.py
index 14b3fa38a3..8a82c3c249 100644
--- a/crates/ruff/resources/test/fixtures/perflint/PERF203.py
+++ b/crates/ruff/resources/test/fixtures/perflint/PERF203.py
@@ -21,3 +21,29 @@ while i < 10:
         print("error")
 
     i += 1
+
+# OK - no other way to write this
+for i in range(10):
+    try:
+        print(f"{i}")
+        break
+    except:
+        print("error")
+
+# OK - no other way to write this
+for i in range(10):
+    try:
+        print(f"{i}")
+        continue
+    except:
+        print("error")
+
+
+# OK - no other way to write this
+for i in range(10):
+    try:
+        print(f"{i}")
+        if i > 0:
+            break
+    except:
+        print("error")
diff --git a/crates/ruff/src/rules/perflint/rules/try_except_in_loop.rs b/crates/ruff/src/rules/perflint/rules/try_except_in_loop.rs
index ffa8a428fa..84e14e5386 100644
--- a/crates/ruff/src/rules/perflint/rules/try_except_in_loop.rs
+++ b/crates/ruff/src/rules/perflint/rules/try_except_in_loop.rs
@@ -1,7 +1,7 @@
-use ruff_python_ast::{self as ast, Ranged, Stmt};
-
 use ruff_diagnostics::{Diagnostic, Violation};
 use ruff_macros::{derive_message_formats, violation};
+use ruff_python_ast::statement_visitor::{walk_stmt, StatementVisitor};
+use ruff_python_ast::{self as ast, Ranged, Stmt};
 
 use crate::checkers::ast::Checker;
 use crate::settings::types::PythonVersion;
@@ -35,6 +35,7 @@ use crate::settings::types::PythonVersion;
 ///         int_numbers.append(int(num))
 ///     except ValueError as e:
 ///         print(f"Couldn't convert to integer: {e}")
+///         break
 /// ```
 ///
 /// Use instead:
@@ -67,7 +68,7 @@ pub(crate) fn try_except_in_loop(checker: &mut Checker, body: &[Stmt]) {
         return;
     }
 
-    let [Stmt::Try(ast::StmtTry { handlers, .. })] = body else {
+    let [Stmt::Try(ast::StmtTry { handlers, body, .. })] = body else {
         return;
     };
 
@@ -75,7 +76,37 @@ pub(crate) fn try_except_in_loop(checker: &mut Checker, body: &[Stmt]) {
         return;
     };
 
+    // Avoid flagging `try`-`except` blocks that contain `break` or `continue`,
+    // which rely on the exception handling mechanism.
+    if has_break_or_continue(body) {
+        return;
+    }
+
     checker
         .diagnostics
         .push(Diagnostic::new(TryExceptInLoop, handler.range()));
 }
+
+/// Returns `true` if a `break` or `continue` statement is present in `body`.
+fn has_break_or_continue(body: &[Stmt]) -> bool {
+    let mut visitor = LoopControlFlowVisitor::default();
+    visitor.visit_body(body);
+    visitor.has_break_or_continue
+}
+
+#[derive(Debug, Default)]
+struct LoopControlFlowVisitor {
+    has_break_or_continue: bool,
+}
+
+impl StatementVisitor<'_> for LoopControlFlowVisitor {
+    fn visit_stmt(&mut self, stmt: &Stmt) {
+        match stmt {
+            Stmt::Break(_) | Stmt::Continue(_) => self.has_break_or_continue = true,
+            Stmt::FunctionDef(_) | Stmt::ClassDef(_) => {
+                // Don't recurse.
+            }
+            _ => walk_stmt(self, stmt),
+        }
+    }
+}

From a51d1ac980dc274fefb05d1a6d08c467a2a1154b Mon Sep 17 00:00:00 2001
From: Harutaka Kawamura 
Date: Tue, 15 Aug 2023 06:03:42 +0900
Subject: [PATCH 122/155] Add `PT006` and `PT007` docs (#6531)

---
 .../flake8_pytest_style/rules/parametrize.rs  | 105 ++++++++++++++++++
 1 file changed, 105 insertions(+)

diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
index 8c635daaf2..383bd3840e 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
@@ -15,6 +15,52 @@ use crate::registry::{AsRule, Rule};
 use super::super::types;
 use super::helpers::{is_pytest_parametrize, split_names};
 
+/// ## What it does
+/// Checks for the type of parameter names passed to `pytest.mark.parametrize`.
+///
+/// ## Why is this bad?
+/// The `argnames` argument of `pytest.mark.parametrize` takes a string or
+/// a sequence of strings. For a single parameter, it's preferable to use a
+/// string, and for multiple parameters, it's preferable to use the style
+/// configured via the `flake8-pytest-style.parametrize-names-type` setting.
+///
+/// ## Example
+/// ```python
+/// # single parameter, always expecting string
+/// @pytest.mark.parametrize(("param",), [1, 2, 3])
+/// def test_foo(param):
+///     ...
+///
+///
+/// # multiple parameters, expecting tuple
+/// @pytest.mark.parametrize(["param1", "param2"], [(1, 2), (3, 4)])
+/// def test_bar(param1, param2):
+///     ...
+///
+///
+/// # multiple parameters, expecting tuple
+/// @pytest.mark.parametrize("param1,param2", [(1, 2), (3, 4)])
+/// def test_baz(param1, param2):
+///     ...
+/// ```
+///
+/// Use instead:
+/// ```python
+/// @pytest.mark.parametrize("param", [1, 2, 3])
+/// def test_foo(param):
+///     ...
+///
+///
+/// @pytest.mark.parametrize(("param1", "param2"), [(1, 2), (3, 4)])
+/// def test_bar(param1, param2):
+///     ...
+/// ```
+///
+/// ## Options
+/// - `flake8-pytest-style.parametrize-names-type`
+///
+/// ## References
+/// - [`pytest` documentation: How to parametrize fixtures and test functions](https://docs.pytest.org/en/latest/how-to/parametrize.html#pytest-mark-parametrize)
 #[violation]
 pub struct PytestParametrizeNamesWrongType {
     pub expected: types::ParametrizeNameType,
@@ -35,6 +81,65 @@ impl Violation for PytestParametrizeNamesWrongType {
     }
 }
 
+/// ## What it does
+/// Checks for the type of parameter values passed to `pytest.mark.parametrize`.
+///
+/// ## Why is this bad?
+/// The `argvalues` argument of `pytest.mark.parametrize` takes an iterator of
+/// parameter values. For a single parameter, it's preferable to use a list,
+/// and for multiple parameters, it's preferable to use a list of rows with
+/// the type configured via the `flake8-pytest-style.parametrize-values-row-type`
+/// setting.
+///
+/// ## Example
+/// ```python
+/// # expected list, got tuple
+/// @pytest.mark.parametrize("param", (1, 2))
+/// def test_foo(param):
+///     ...
+///
+///
+/// # expected top-level list, got tuple
+/// @pytest.mark.parametrize(
+///     ("param1", "param2"),
+///     (
+///         (1, 2),
+///         (3, 4),
+///     ),
+/// )
+/// def test_bar(param1, param2):
+///     ...
+///
+///
+/// # expected individual rows to be tuples, got lists
+/// @pytest.mark.parametrize(
+///     ("param1", "param2"),
+///     [
+///         [1, 2],
+///         [3, 4],
+///     ],
+/// )
+/// def test_baz(param1, param2):
+///     ...
+/// ```
+///
+/// Use instead:
+/// ```python
+/// @pytest.mark.parametrize("param", [1, 2, 3])
+/// def test_foo(param):
+///     ...
+///
+///
+/// @pytest.mark.parametrize(("param1", "param2"), [(1, 2), (3, 4)])
+/// def test_bar(param1, param2):
+///     ...
+/// ```
+///
+/// ## Options
+/// - `flake8-pytest-style.parametrize-values-row-type`
+///
+/// ## References
+/// - [`pytest` documentation: How to parametrize fixtures and test functions](https://docs.pytest.org/en/latest/how-to/parametrize.html#pytest-mark-parametrize)
 #[violation]
 pub struct PytestParametrizeValuesWrongType {
     pub values: types::ParametrizeValuesType,

From b1870b2b16e7ee7c13e8a8909d611c214ff59d20 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 17:08:02 -0400
Subject: [PATCH 123/155] Add deprecated unittest assertions to PT009 (#6572)

## Summary

This rule was missing `self.failIf` and friends.

## Test Plan

`cargo test`
---
 .../fixtures/flake8_pytest_style/PT009.py     | 12 +++
 .../rules/unittest_assert.rs                  | 68 ++++++++++++----
 ...es__flake8_pytest_style__tests__PT009.snap | 80 +++++++++++++++++++
 .../rules/deprecated_unittest_alias.rs        | 22 ++---
 4 files changed, 155 insertions(+), 27 deletions(-)

diff --git a/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT009.py b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT009.py
index e25aef6fac..128c6b0325 100644
--- a/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT009.py
+++ b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT009.py
@@ -80,3 +80,15 @@ class Test(unittest.TestCase):
 
     def test_assert_not_regexp_matches(self):
         self.assertNotRegex("abc", r"abc")  # Error
+
+    def test_fail_if(self):
+        self.failIf("abc")  # Error
+
+    def test_fail_unless(self):
+        self.failUnless("abc")  # Error
+
+    def test_fail_unless_equal(self):
+        self.failUnlessEqual(1, 2)  # Error
+
+    def test_fail_if_equal(self):
+        self.failIfEqual(1, 2)  # Error
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/unittest_assert.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/unittest_assert.rs
index 52274ab22c..49c78e10d4 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/unittest_assert.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/unittest_assert.rs
@@ -19,6 +19,13 @@ pub(crate) enum UnittestAssert {
     DictEqual,
     Equal,
     Equals,
+    FailIf,
+    FailIfAlmostEqual,
+    FailIfEqual,
+    FailUnless,
+    FailUnlessAlmostEqual,
+    FailUnlessEqual,
+    // FailUnlessRaises,
     False,
     Greater,
     GreaterEqual,
@@ -62,10 +69,16 @@ impl std::fmt::Display for UnittestAssert {
             UnittestAssert::AlmostEqual => write!(f, "assertAlmostEqual"),
             UnittestAssert::AlmostEquals => write!(f, "assertAlmostEquals"),
             UnittestAssert::CountEqual => write!(f, "assertCountEqual"),
-            UnittestAssert::DictEqual => write!(f, "assertDictEqual"),
             UnittestAssert::DictContainsSubset => write!(f, "assertDictContainsSubset"),
+            UnittestAssert::DictEqual => write!(f, "assertDictEqual"),
             UnittestAssert::Equal => write!(f, "assertEqual"),
             UnittestAssert::Equals => write!(f, "assertEquals"),
+            UnittestAssert::FailIf => write!(f, "failIf"),
+            UnittestAssert::FailIfAlmostEqual => write!(f, "failIfAlmostEqual"),
+            UnittestAssert::FailIfEqual => write!(f, "failIfEqual"),
+            UnittestAssert::FailUnless => write!(f, "failUnless"),
+            UnittestAssert::FailUnlessAlmostEqual => write!(f, "failUnlessAlmostEqual"),
+            UnittestAssert::FailUnlessEqual => write!(f, "failUnlessEqual"),
             UnittestAssert::False => write!(f, "assertFalse"),
             UnittestAssert::Greater => write!(f, "assertGreater"),
             UnittestAssert::GreaterEqual => write!(f, "assertGreaterEqual"),
@@ -110,6 +123,12 @@ impl TryFrom<&str> for UnittestAssert {
             "assertDictEqual" => Ok(UnittestAssert::DictEqual),
             "assertEqual" => Ok(UnittestAssert::Equal),
             "assertEquals" => Ok(UnittestAssert::Equals),
+            "failIf" => Ok(UnittestAssert::FailIf),
+            "failIfAlmostEqual" => Ok(UnittestAssert::FailIfAlmostEqual),
+            "failIfEqual" => Ok(UnittestAssert::FailIfEqual),
+            "failUnless" => Ok(UnittestAssert::FailUnless),
+            "failUnlessAlmostEqual" => Ok(UnittestAssert::FailUnlessAlmostEqual),
+            "failUnlessEqual" => Ok(UnittestAssert::FailUnlessEqual),
             "assertFalse" => Ok(UnittestAssert::False),
             "assertGreater" => Ok(UnittestAssert::Greater),
             "assertGreaterEqual" => Ok(UnittestAssert::GreaterEqual),
@@ -198,6 +217,12 @@ impl UnittestAssert {
             UnittestAssert::True => &["expr", "msg"],
             UnittestAssert::TupleEqual => &["first", "second", "msg"],
             UnittestAssert::Underscore => &["expr", "msg"],
+            UnittestAssert::FailIf => &["expr", "msg"],
+            UnittestAssert::FailIfAlmostEqual => &["first", "second", "msg"],
+            UnittestAssert::FailIfEqual => &["first", "second", "msg"],
+            UnittestAssert::FailUnless => &["expr", "msg"],
+            UnittestAssert::FailUnlessAlmostEqual => &["first", "second", "places", "msg", "delta"],
+            UnittestAssert::FailUnlessEqual => &["first", "second", "places", "msg", "delta"],
         }
     }
 
@@ -257,28 +282,35 @@ impl UnittestAssert {
     pub(crate) fn generate_assert(self, args: &[Expr], keywords: &[Keyword]) -> Result {
         let args = self.args_map(args, keywords)?;
         match self {
-            UnittestAssert::True | UnittestAssert::False => {
+            UnittestAssert::True
+            | UnittestAssert::False
+            | UnittestAssert::FailUnless
+            | UnittestAssert::FailIf => {
                 let expr = *args
                     .get("expr")
                     .ok_or_else(|| anyhow!("Missing argument `expr`"))?;
                 let msg = args.get("msg").copied();
-                Ok(if matches!(self, UnittestAssert::False) {
-                    assert(
-                        &Expr::UnaryOp(ast::ExprUnaryOp {
-                            op: UnaryOp::Not,
-                            operand: Box::new(expr.clone()),
-                            range: TextRange::default(),
-                        }),
-                        msg,
-                    )
-                } else {
-                    assert(expr, msg)
-                })
+                Ok(
+                    if matches!(self, UnittestAssert::False | UnittestAssert::FailIf) {
+                        assert(
+                            &Expr::UnaryOp(ast::ExprUnaryOp {
+                                op: UnaryOp::Not,
+                                operand: Box::new(expr.clone()),
+                                range: TextRange::default(),
+                            }),
+                            msg,
+                        )
+                    } else {
+                        assert(expr, msg)
+                    },
+                )
             }
             UnittestAssert::Equal
             | UnittestAssert::Equals
+            | UnittestAssert::FailUnlessEqual
             | UnittestAssert::NotEqual
             | UnittestAssert::NotEquals
+            | UnittestAssert::FailIfEqual
             | UnittestAssert::Greater
             | UnittestAssert::GreaterEqual
             | UnittestAssert::Less
@@ -293,8 +325,12 @@ impl UnittestAssert {
                     .ok_or_else(|| anyhow!("Missing argument `second`"))?;
                 let msg = args.get("msg").copied();
                 let cmp_op = match self {
-                    UnittestAssert::Equal | UnittestAssert::Equals => CmpOp::Eq,
-                    UnittestAssert::NotEqual | UnittestAssert::NotEquals => CmpOp::NotEq,
+                    UnittestAssert::Equal
+                    | UnittestAssert::Equals
+                    | UnittestAssert::FailUnlessEqual => CmpOp::Eq,
+                    UnittestAssert::NotEqual
+                    | UnittestAssert::NotEquals
+                    | UnittestAssert::FailIfEqual => CmpOp::NotEq,
                     UnittestAssert::Greater => CmpOp::Gt,
                     UnittestAssert::GreaterEqual => CmpOp::GtE,
                     UnittestAssert::Less => CmpOp::Lt,
diff --git a/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT009.snap b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT009.snap
index be4c1bb726..ff04ae6a49 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT009.snap
+++ b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT009.snap
@@ -548,6 +548,8 @@ PT009.py:82:9: PT009 [*] Use a regular `assert` instead of unittest-style `asser
 81 |     def test_assert_not_regexp_matches(self):
 82 |         self.assertNotRegex("abc", r"abc")  # Error
    |         ^^^^^^^^^^^^^^^^^^^ PT009
+83 | 
+84 |     def test_fail_if(self):
    |
    = help: Replace `assertNotRegex(...)` with `assert ...`
 
@@ -557,5 +559,83 @@ PT009.py:82:9: PT009 [*] Use a regular `assert` instead of unittest-style `asser
 81 81 |     def test_assert_not_regexp_matches(self):
 82    |-        self.assertNotRegex("abc", r"abc")  # Error
    82 |+        assert not re.search("abc", "abc")  # Error
+83 83 | 
+84 84 |     def test_fail_if(self):
+85 85 |         self.failIf("abc")  # Error
+
+PT009.py:85:9: PT009 [*] Use a regular `assert` instead of unittest-style `failIf`
+   |
+84 |     def test_fail_if(self):
+85 |         self.failIf("abc")  # Error
+   |         ^^^^^^^^^^^ PT009
+86 | 
+87 |     def test_fail_unless(self):
+   |
+   = help: Replace `failIf(...)` with `assert ...`
+
+ℹ Suggested fix
+82 82 |         self.assertNotRegex("abc", r"abc")  # Error
+83 83 | 
+84 84 |     def test_fail_if(self):
+85    |-        self.failIf("abc")  # Error
+   85 |+        assert not "abc"  # Error
+86 86 | 
+87 87 |     def test_fail_unless(self):
+88 88 |         self.failUnless("abc")  # Error
+
+PT009.py:88:9: PT009 [*] Use a regular `assert` instead of unittest-style `failUnless`
+   |
+87 |     def test_fail_unless(self):
+88 |         self.failUnless("abc")  # Error
+   |         ^^^^^^^^^^^^^^^ PT009
+89 | 
+90 |     def test_fail_unless_equal(self):
+   |
+   = help: Replace `failUnless(...)` with `assert ...`
+
+ℹ Suggested fix
+85 85 |         self.failIf("abc")  # Error
+86 86 | 
+87 87 |     def test_fail_unless(self):
+88    |-        self.failUnless("abc")  # Error
+   88 |+        assert "abc"  # Error
+89 89 | 
+90 90 |     def test_fail_unless_equal(self):
+91 91 |         self.failUnlessEqual(1, 2)  # Error
+
+PT009.py:91:9: PT009 [*] Use a regular `assert` instead of unittest-style `failUnlessEqual`
+   |
+90 |     def test_fail_unless_equal(self):
+91 |         self.failUnlessEqual(1, 2)  # Error
+   |         ^^^^^^^^^^^^^^^^^^^^ PT009
+92 | 
+93 |     def test_fail_if_equal(self):
+   |
+   = help: Replace `failUnlessEqual(...)` with `assert ...`
+
+ℹ Suggested fix
+88 88 |         self.failUnless("abc")  # Error
+89 89 | 
+90 90 |     def test_fail_unless_equal(self):
+91    |-        self.failUnlessEqual(1, 2)  # Error
+   91 |+        assert 1 == 2  # Error
+92 92 | 
+93 93 |     def test_fail_if_equal(self):
+94 94 |         self.failIfEqual(1, 2)  # Error
+
+PT009.py:94:9: PT009 [*] Use a regular `assert` instead of unittest-style `failIfEqual`
+   |
+93 |     def test_fail_if_equal(self):
+94 |         self.failIfEqual(1, 2)  # Error
+   |         ^^^^^^^^^^^^^^^^ PT009
+   |
+   = help: Replace `failIfEqual(...)` with `assert ...`
+
+ℹ Suggested fix
+91 91 |         self.failUnlessEqual(1, 2)  # Error
+92 92 | 
+93 93 |     def test_fail_if_equal(self):
+94    |-        self.failIfEqual(1, 2)  # Error
+   94 |+        assert 1 != 2  # Error
 
 
diff --git a/crates/ruff/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs b/crates/ruff/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs
index f716a465bb..a939672f30 100644
--- a/crates/ruff/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs
+++ b/crates/ruff/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs
@@ -59,21 +59,21 @@ impl AlwaysAutofixableViolation for DeprecatedUnittestAlias {
 
 static DEPRECATED_ALIASES: Lazy> = Lazy::new(|| {
     FxHashMap::from_iter([
-        ("failUnlessEqual", "assertEqual"),
-        ("assertEquals", "assertEqual"),
-        ("failIfEqual", "assertNotEqual"),
-        ("assertNotEquals", "assertNotEqual"),
-        ("failUnless", "assertTrue"),
-        ("assert_", "assertTrue"),
-        ("failIf", "assertFalse"),
-        ("failUnlessRaises", "assertRaises"),
-        ("failUnlessAlmostEqual", "assertAlmostEqual"),
         ("assertAlmostEquals", "assertAlmostEqual"),
-        ("failIfAlmostEqual", "assertNotAlmostEqual"),
+        ("assertEquals", "assertEqual"),
         ("assertNotAlmostEquals", "assertNotAlmostEqual"),
-        ("assertRegexpMatches", "assertRegex"),
+        ("assertNotEquals", "assertNotEqual"),
         ("assertNotRegexpMatches", "assertNotRegex"),
         ("assertRaisesRegexp", "assertRaisesRegex"),
+        ("assertRegexpMatches", "assertRegex"),
+        ("assert_", "assertTrue"),
+        ("failIf", "assertFalse"),
+        ("failIfAlmostEqual", "assertNotAlmostEqual"),
+        ("failIfEqual", "assertNotEqual"),
+        ("failUnless", "assertTrue"),
+        ("failUnlessAlmostEqual", "assertAlmostEqual"),
+        ("failUnlessEqual", "assertEqual"),
+        ("failUnlessRaises", "assertRaises"),
     ])
 });
 

From ebda5fcd99f444a9f821bc67ef5efd842f977144 Mon Sep 17 00:00:00 2001
From: Harutaka Kawamura 
Date: Tue, 15 Aug 2023 06:29:03 +0900
Subject: [PATCH 124/155] Add PT002 ~ PT005 docs (#6521)

---
 .../flake8_pytest_style/rules/fixture.rs      | 123 ++++++++++++++++++
 1 file changed, 123 insertions(+)

diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
index 0a95d0cb60..8651368dd2 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
@@ -74,6 +74,29 @@ impl AlwaysAutofixableViolation for PytestFixtureIncorrectParenthesesStyle {
     }
 }
 
+/// ## What it does
+/// Checks for `pytest.fixture` calls with positional arguments.
+///
+/// ## Why is this bad?
+/// For clarity and consistency, prefer using keyword arguments to specify
+/// fixture configuration.
+///
+/// ## Example
+/// ```python
+/// @pytest.fixture("module")
+/// def my_fixture():
+///     ...
+/// ```
+///
+/// Use instead:
+/// ```python
+/// @pytest.fixture(scope="module")
+/// def my_fixture():
+///     ...
+/// ```
+///
+/// ## References
+/// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture)
 #[violation]
 pub struct PytestFixturePositionalArgs {
     function: String,
@@ -87,6 +110,28 @@ impl Violation for PytestFixturePositionalArgs {
     }
 }
 
+/// ## What it does
+/// Checks for `pytest.fixture` calls with `scope="function"`.
+///
+/// ## Why is this bad?
+/// `scope="function"` can be omitted, as it is the default.
+///
+/// ## Example
+/// ```python
+/// @pytest.fixture(scope="function")
+/// def my_fixture():
+///     ...
+/// ```
+///
+/// Use instead:
+/// ```python
+/// @pytest.fixture()
+/// def my_fixture():
+///     ...
+/// ```
+///
+/// ## References
+/// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture)
 #[violation]
 pub struct PytestExtraneousScopeFunction;
 
@@ -101,11 +146,89 @@ impl AlwaysAutofixableViolation for PytestExtraneousScopeFunction {
     }
 }
 
+/// ## What it does
+/// Checks for `pytest` fixtures that do not return a value, but are not named
+/// with a leading underscore.
+///
+/// ## Why is this bad?
+/// By convention, fixtures that don't return a value should be named with a
+/// leading underscore, while fixtures that do return a value should not.
+///
+/// This rule ignores abstract fixtures and generators.
+///
+/// ## Example
+/// ```python
+/// @pytest.fixture()
+/// def patch_something(mocker):
+///     mocker.patch("module.object")
+///
+///
+/// @pytest.fixture()
+/// def use_context():
+///     with create_context():
+///         yield
+/// ```
+///
+/// Use instead:
+/// ```python
+/// @pytest.fixture()
+/// def _patch_something(mocker):
+///     mocker.patch("module.object")
+///
+///
+/// @pytest.fixture()
+/// def _use_context():
+///     with create_context():
+///         yield
+/// ```
+///
+/// ## References
+/// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture)
 #[violation]
 pub struct PytestMissingFixtureNameUnderscore {
     function: String,
 }
 
+/// ## What it does
+/// Checks for `pytest` fixtures that return a value, but are named with a
+/// leading underscore.
+///
+/// ## Why is this bad?
+/// By convention, fixtures that don't return a value should be named with a
+/// leading underscore, while fixtures that do return a value should not.
+///
+/// This rule ignores abstract fixtures.
+///
+/// ## Example
+/// ```python
+/// @pytest.fixture()
+/// def _some_object():
+///     return SomeClass()
+///
+///
+/// @pytest.fixture()
+/// def _some_object_with_cleanup():
+///     obj = SomeClass()
+///     yield obj
+///     obj.cleanup()
+/// ```
+///
+/// Use instead:
+/// ```python
+/// @pytest.fixture()
+/// def some_object():
+///     return SomeClass()
+///
+///
+/// @pytest.fixture()
+/// def some_object_with_cleanup():
+///     obj = SomeClass()
+///     yield obj
+///     obj.cleanup()
+/// ```
+///
+/// ## References
+/// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture)
 impl Violation for PytestMissingFixtureNameUnderscore {
     #[derive_message_formats]
     fn message(&self) -> String {

From 9a0d2f5afdd4dfd11af48e790fc5fee1f1866acd Mon Sep 17 00:00:00 2001
From: Nok Lam Chan 
Date: Mon, 14 Aug 2023 23:02:40 +0100
Subject: [PATCH 125/155] Add regular expression example for `per-file-ignores`
 (#6573)

## Summary
Hi! This is my first PR to `ruff` and thanks for this amazing project.
While I am working on my project, I need to set different rules for my
`test/` folder and the main `src` package.

It's not immediately obvious that the
[`tool.ruff.per-file-ignores`](https://beta.ruff.rs/docs/settings/#per-file-ignores)
support regular expression. It is useful to set rules on directory
level. The PR add a simple example to make it clear this support regex.
---
 docs/configuration.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/configuration.md b/docs/configuration.md
index c587f5ee07..cbe8c31cde 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -77,6 +77,7 @@ unfixable = ["B"]
 [tool.ruff.per-file-ignores]
 "__init__.py" = ["E402"]
 "path/to/file.py" = ["E402"]
+"**/{tests,docs,tools}/*" = ["E402"]
 ```
 
 Plugin configurations should be expressed as subsections, e.g.:

From 7f7df852e86146842966b1d562cf947731551011 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 19:39:41 -0400
Subject: [PATCH 126/155] Remove some extraneous newlines in Cargo.toml (#6577)

---
 crates/ruff/Cargo.toml               | 2 --
 crates/ruff_benchmark/Cargo.toml     | 1 -
 crates/ruff_cli/Cargo.toml           | 2 --
 crates/ruff_python_ast/Cargo.toml    | 2 --
 crates/ruff_python_index/Cargo.toml  | 1 -
 crates/ruff_python_trivia/Cargo.toml | 1 -
 6 files changed, 9 deletions(-)

diff --git a/crates/ruff/Cargo.toml b/crates/ruff/Cargo.toml
index 89bd53ab00..a65f8ca7f3 100644
--- a/crates/ruff/Cargo.toml
+++ b/crates/ruff/Cargo.toml
@@ -62,8 +62,6 @@ quick-junit = { version = "0.3.2" }
 regex = { workspace = true }
 result-like = { version = "0.4.6" }
 rustc-hash = { workspace = true }
-
-
 schemars = { workspace = true, optional = true }
 semver = { version = "1.0.16" }
 serde = { workspace = true }
diff --git a/crates/ruff_benchmark/Cargo.toml b/crates/ruff_benchmark/Cargo.toml
index f55927fd06..1d2baf66dd 100644
--- a/crates/ruff_benchmark/Cargo.toml
+++ b/crates/ruff_benchmark/Cargo.toml
@@ -46,4 +46,3 @@ mimalloc = "0.1.34"
 
 [target.'cfg(all(not(target_os = "windows"), not(target_os = "openbsd"), any(target_arch = "x86_64", target_arch = "aarch64", target_arch = "powerpc64")))'.dev-dependencies]
 tikv-jemallocator = "0.5.0"
-
diff --git a/crates/ruff_cli/Cargo.toml b/crates/ruff_cli/Cargo.toml
index ae0afe8e09..4db9aeb55e 100644
--- a/crates/ruff_cli/Cargo.toml
+++ b/crates/ruff_cli/Cargo.toml
@@ -11,8 +11,6 @@ repository = { workspace = true }
 license = { workspace = true }
 readme = "../../README.md"
 
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
 [[bin]]
 name = "ruff"
 
diff --git a/crates/ruff_python_ast/Cargo.toml b/crates/ruff_python_ast/Cargo.toml
index b85f740223..ac33034c90 100644
--- a/crates/ruff_python_ast/Cargo.toml
+++ b/crates/ruff_python_ast/Cargo.toml
@@ -10,8 +10,6 @@ documentation = { workspace = true }
 repository = { workspace = true }
 license = { workspace = true }
 
-
-
 [lib]
 
 [dependencies]
diff --git a/crates/ruff_python_index/Cargo.toml b/crates/ruff_python_index/Cargo.toml
index 10d8813ce4..b82aaeeab9 100644
--- a/crates/ruff_python_index/Cargo.toml
+++ b/crates/ruff_python_index/Cargo.toml
@@ -22,5 +22,4 @@ ruff_text_size = { path = "../ruff_text_size" }
 
 itertools = { workspace = true }
 
-
 [dev-dependencies]
diff --git a/crates/ruff_python_trivia/Cargo.toml b/crates/ruff_python_trivia/Cargo.toml
index a9c5d4a44e..f0f9861e5a 100644
--- a/crates/ruff_python_trivia/Cargo.toml
+++ b/crates/ruff_python_trivia/Cargo.toml
@@ -24,4 +24,3 @@ unic-ucd-ident = "0.9.0"
 insta = { workspace = true }
 ruff_python_ast = { path = "../ruff_python_ast" }
 ruff_python_parser = { path = "../ruff_python_parser" }
-

From 17e7eae2f98b2bff9848578549488b51b790fa94 Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 19:48:20 -0400
Subject: [PATCH 127/155] Avoid unused argument rules when functions call
 `locals()` (#6578)

Closes https://github.com/astral-sh/ruff/issues/6576.
---
 .../test/fixtures/flake8_unused_arguments/ARG.py | 11 +++++++++++
 .../rules/unused_arguments.rs                    | 16 ++++++++++------
 2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/crates/ruff/resources/test/fixtures/flake8_unused_arguments/ARG.py b/crates/ruff/resources/test/fixtures/flake8_unused_arguments/ARG.py
index 3aac4018c8..8905fba36a 100644
--- a/crates/ruff/resources/test/fixtures/flake8_unused_arguments/ARG.py
+++ b/crates/ruff/resources/test/fixtures/flake8_unused_arguments/ARG.py
@@ -202,3 +202,14 @@ class C:
 ###
 def f(x: None) -> None:
     _ = cast(Any, _identity)(x=x)
+
+###
+# Unused arguments with `locals`.
+###
+def f(bar: str):
+    print(locals())
+
+
+class C:
+    def __init__(self, x) -> None:
+        print(locals())
diff --git a/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs b/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs
index 5699bf8e01..60be99a590 100644
--- a/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs
+++ b/crates/ruff/src/rules/flake8_unused_arguments/rules/unused_arguments.rs
@@ -216,7 +216,7 @@ impl Argumentable {
 fn function(
     argumentable: Argumentable,
     parameters: &Parameters,
-    values: &Scope,
+    scope: &Scope,
     semantic: &SemanticModel,
     dummy_variable_rgx: &Regex,
     ignore_variadic_names: bool,
@@ -241,7 +241,7 @@ fn function(
     call(
         argumentable,
         args,
-        values,
+        scope,
         semantic,
         dummy_variable_rgx,
         diagnostics,
@@ -252,7 +252,7 @@ fn function(
 fn method(
     argumentable: Argumentable,
     parameters: &Parameters,
-    values: &Scope,
+    scope: &Scope,
     semantic: &SemanticModel,
     dummy_variable_rgx: &Regex,
     ignore_variadic_names: bool,
@@ -278,7 +278,7 @@ fn method(
     call(
         argumentable,
         args,
-        values,
+        scope,
         semantic,
         dummy_variable_rgx,
         diagnostics,
@@ -288,13 +288,13 @@ fn method(
 fn call<'a>(
     argumentable: Argumentable,
     parameters: impl Iterator,
-    values: &Scope,
+    scope: &Scope,
     semantic: &SemanticModel,
     dummy_variable_rgx: &Regex,
     diagnostics: &mut Vec,
 ) {
     diagnostics.extend(parameters.filter_map(|arg| {
-        let binding = values
+        let binding = scope
             .get(arg.name.as_str())
             .map(|binding_id| semantic.binding(binding_id))?;
         if binding.kind.is_argument()
@@ -317,6 +317,10 @@ pub(crate) fn unused_arguments(
     scope: &Scope,
     diagnostics: &mut Vec,
 ) {
+    if scope.uses_locals() {
+        return;
+    }
+
     let Some(parent) = &checker.semantic().first_non_type_parent_scope(scope) else {
         return;
     };

From 5f709cd3e033cb11bdf6ecea57ff23347c24c3ca Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Mon, 14 Aug 2023 20:11:32 -0400
Subject: [PATCH 128/155] Bump rule count to 600+ in the docs (#6579)

My informal count yielded 679 rules as of yesterday.
---
 README.md        | 2 +-
 docs/tutorial.md | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index b7439a603e..7d6250fb6b 100644
--- a/README.md
+++ b/README.md
@@ -233,7 +233,7 @@ linting command.
 
 
 
-**Ruff supports over 500 lint rules**, many of which are inspired by popular tools like Flake8,
+**Ruff supports over 600 lint rules**, many of which are inspired by popular tools like Flake8,
 isort, pyupgrade, and others. Regardless of the rule's origin, Ruff re-implements every rule in
 Rust as a first-party feature.
 
diff --git a/docs/tutorial.md b/docs/tutorial.md
index 15abe9b339..272a89f9d4 100644
--- a/docs/tutorial.md
+++ b/docs/tutorial.md
@@ -105,7 +105,7 @@ src = ["src"]
 
 ### Rule Selection
 
-Ruff supports [over 500 lint rules](rules.md) split across over 40 built-in plugins, but
+Ruff supports [over 600 lint rules](rules.md) split across over 40 built-in plugins, but
 determining the right set of rules will depend on your project's needs: some rules may be too
 strict, some are framework-specific, and so on.
 

From e1e213decf4192527a2fceec62f24b405074d065 Mon Sep 17 00:00:00 2001
From: Harutaka Kawamura 
Date: Tue, 15 Aug 2023 12:08:15 +0900
Subject: [PATCH 129/155] Import `pytest` in `flake8-pytest-style` docs (#6580)

---
 .../flake8_pytest_style/rules/assertion.rs    | 12 ++++
 .../flake8_pytest_style/rules/fixture.rs      | 60 +++++++++++++++++++
 .../rules/flake8_pytest_style/rules/marks.rs  |  9 +++
 .../flake8_pytest_style/rules/parametrize.rs  | 12 ++++
 .../rules/flake8_pytest_style/rules/raises.rs | 12 ++++
 5 files changed, 105 insertions(+)

diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs
index 5514cd8744..7b7407889e 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/assertion.rs
@@ -92,6 +92,9 @@ impl Violation for PytestCompositeAssertion {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// def test_foo():
 ///     with pytest.raises(ZeroDivisionError) as exc_info:
 ///         1 / 0
@@ -130,6 +133,9 @@ impl Violation for PytestAssertInExcept {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// def test_foo():
 ///     if some_condition:
 ///         pytest.fail("some_condition was True")
@@ -157,6 +163,9 @@ impl Violation for PytestAssertAlwaysFalse {
 ///
 /// ## Example
 /// ```python
+/// import unittest
+///
+///
 /// class TestFoo(unittest.TestCase):
 ///     def test_foo(self):
 ///         self.assertEqual(a, b)
@@ -164,6 +173,9 @@ impl Violation for PytestAssertAlwaysFalse {
 ///
 /// Use instead:
 /// ```python
+/// import unittest
+///
+///
 /// class TestFoo(unittest.TestCase):
 ///     def test_foo(self):
 ///         assert a == b
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
index 8651368dd2..771140db95 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
@@ -35,6 +35,9 @@ use super::helpers::{
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture
 /// def my_fixture():
 ///     ...
@@ -42,6 +45,9 @@ use super::helpers::{
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def my_fixture():
 ///     ...
@@ -83,6 +89,9 @@ impl AlwaysAutofixableViolation for PytestFixtureIncorrectParenthesesStyle {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture("module")
 /// def my_fixture():
 ///     ...
@@ -90,6 +99,9 @@ impl AlwaysAutofixableViolation for PytestFixtureIncorrectParenthesesStyle {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture(scope="module")
 /// def my_fixture():
 ///     ...
@@ -118,6 +130,9 @@ impl Violation for PytestFixturePositionalArgs {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture(scope="function")
 /// def my_fixture():
 ///     ...
@@ -125,6 +140,9 @@ impl Violation for PytestFixturePositionalArgs {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def my_fixture():
 ///     ...
@@ -158,6 +176,9 @@ impl AlwaysAutofixableViolation for PytestExtraneousScopeFunction {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def patch_something(mocker):
 ///     mocker.patch("module.object")
@@ -171,6 +192,9 @@ impl AlwaysAutofixableViolation for PytestExtraneousScopeFunction {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def _patch_something(mocker):
 ///     mocker.patch("module.object")
@@ -201,6 +225,9 @@ pub struct PytestMissingFixtureNameUnderscore {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def _some_object():
 ///     return SomeClass()
@@ -215,6 +242,9 @@ pub struct PytestMissingFixtureNameUnderscore {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def some_object():
 ///     return SomeClass()
@@ -268,6 +298,9 @@ impl Violation for PytestIncorrectFixtureNameUnderscore {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture
 /// def _patch_something():
 ///     ...
@@ -279,6 +312,9 @@ impl Violation for PytestIncorrectFixtureNameUnderscore {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture
 /// def _patch_something():
 ///     ...
@@ -362,6 +398,9 @@ impl Violation for PytestDeprecatedYieldFixture {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def my_fixture(request):
 ///     resource = acquire_resource()
@@ -371,6 +410,9 @@ impl Violation for PytestDeprecatedYieldFixture {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def my_fixture():
 ///     resource = acquire_resource()
@@ -411,6 +453,9 @@ impl Violation for PytestFixtureFinalizerCallback {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def my_fixture():
 ///     resource = acquire_resource()
@@ -419,6 +464,9 @@ impl Violation for PytestFixtureFinalizerCallback {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def my_fixture_with_teardown():
 ///     resource = acquire_resource()
@@ -460,6 +508,9 @@ impl AlwaysAutofixableViolation for PytestUselessYieldFixture {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def a():
 ///     pass
@@ -473,6 +524,9 @@ impl AlwaysAutofixableViolation for PytestUselessYieldFixture {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// def a():
 ///     pass
@@ -507,6 +561,9 @@ impl AlwaysAutofixableViolation for PytestErroneousUseFixturesOnFixture {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.mark.asyncio()
 /// @pytest.fixture()
 /// async def my_fixture():
@@ -515,6 +572,9 @@ impl AlwaysAutofixableViolation for PytestErroneousUseFixturesOnFixture {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.fixture()
 /// async def my_fixture():
 ///     return 0
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/marks.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/marks.rs
index 88f49d1702..7a26b7ff2a 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/marks.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/marks.rs
@@ -23,6 +23,9 @@ use super::helpers::get_mark_decorators;
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.mark.foo
 /// def test_something():
 ///     ...
@@ -30,6 +33,9 @@ use super::helpers::get_mark_decorators;
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.mark.foo()
 /// def test_something():
 ///     ...
@@ -76,6 +82,9 @@ impl AlwaysAutofixableViolation for PytestIncorrectMarkParenthesesStyle {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.mark.usefixtures()
 /// def test_something():
 ///     ...
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
index 383bd3840e..931e8e6107 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs
@@ -26,6 +26,9 @@ use super::helpers::{is_pytest_parametrize, split_names};
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// # single parameter, always expecting string
 /// @pytest.mark.parametrize(("param",), [1, 2, 3])
 /// def test_foo(param):
@@ -46,6 +49,9 @@ use super::helpers::{is_pytest_parametrize, split_names};
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.mark.parametrize("param", [1, 2, 3])
 /// def test_foo(param):
 ///     ...
@@ -93,6 +99,9 @@ impl Violation for PytestParametrizeNamesWrongType {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// # expected list, got tuple
 /// @pytest.mark.parametrize("param", (1, 2))
 /// def test_foo(param):
@@ -125,6 +134,9 @@ impl Violation for PytestParametrizeNamesWrongType {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// @pytest.mark.parametrize("param", [1, 2, 3])
 /// def test_foo(param):
 ///     ...
diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs
index f44ad46824..759cba2659 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/raises.rs
@@ -22,6 +22,9 @@ use super::helpers::is_empty_or_null_string;
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// def test_foo():
 ///     with pytest.raises(MyError):
 ///         setup()  # may raise `MyError`
@@ -31,6 +34,9 @@ use super::helpers::is_empty_or_null_string;
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// def test_foo():
 ///     setup()
 ///     with pytest.raises(MyException):
@@ -63,6 +69,9 @@ impl Violation for PytestRaisesWithMultipleStatements {
 ///
 /// ## Example
 /// ```python
+/// import pytest
+///
+///
 /// def test_foo():
 ///     with pytest.raises(ValueError):
 ///         ...
@@ -74,6 +83,9 @@ impl Violation for PytestRaisesWithMultipleStatements {
 ///
 /// Use instead:
 /// ```python
+/// import pytest
+///
+///
 /// def test_foo():
 ///     with pytest.raises(ValueError, match="expected message"):
 ///         ...

From 232b44a8cad3a73ddf17bd6a1047ccaadbdc0f1f Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Tue, 15 Aug 2023 08:00:35 +0200
Subject: [PATCH 130/155] Indent statements in suppressed ranges (#6507)

---
 Cargo.lock                                    |   1 +
 Cargo.toml                                    |   1 +
 crates/ruff/Cargo.toml                        |   2 +-
 crates/ruff_formatter/Cargo.toml              |   4 +-
 crates/ruff_python_formatter/Cargo.toml       |   1 +
 .../test/fixtures/ruff/.editorconfig          |   3 +
 .../test/fixtures/ruff/fmt_on_off/comments.py |   7 +-
 .../fmt_on_off/fmt_off_docstring.options.json |   8 +
 .../ruff/fmt_on_off/indent.options.json       |  11 +
 .../test/fixtures/ruff/fmt_on_off/indent.py   |  55 +++
 .../mixed_space_and_tab.options.json          |  11 +
 .../ruff/fmt_on_off/mixed_space_and_tab.py    |  15 +
 crates/ruff_python_formatter/src/lib.rs       |  37 +-
 crates/ruff_python_formatter/src/verbatim.rs  | 325 ++++++++++++++++--
 .../format@fmt_on_off__comments.py.snap       |  14 +-
 ...rmat@fmt_on_off__fmt_off_docstring.py.snap |  41 ++-
 .../format@fmt_on_off__indent.py.snap         | 272 +++++++++++++++
 ...at@fmt_on_off__mixed_space_and_tab.py.snap | 103 ++++++
 18 files changed, 852 insertions(+), 59 deletions(-)
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/.editorconfig
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.options.json
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.options.json
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.options.json
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.py
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__indent.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__mixed_space_and_tab.py.snap

diff --git a/Cargo.lock b/Cargo.lock
index 8043bb4875..6221b28476 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2354,6 +2354,7 @@ dependencies = [
  "similar",
  "smallvec",
  "thiserror",
+ "unicode-width",
 ]
 
 [[package]]
diff --git a/Cargo.toml b/Cargo.toml
index f8c0a066de..7100aeec35 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -49,6 +49,7 @@ toml = { version = "0.7.2" }
 tracing = "0.1.37"
 tracing-indicatif = "0.3.4"
 tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
+unicode-width = "0.1.10"
 wsl = { version = "0.1.0" }
 
 # v1.0.1
diff --git a/crates/ruff/Cargo.toml b/crates/ruff/Cargo.toml
index a65f8ca7f3..dd8f42778b 100644
--- a/crates/ruff/Cargo.toml
+++ b/crates/ruff/Cargo.toml
@@ -75,7 +75,7 @@ strum_macros = { workspace = true }
 thiserror = { version = "1.0.43" }
 toml = { workspace = true }
 typed-arena = { version = "2.0.2" }
-unicode-width = { version = "0.1.10" }
+unicode-width = { workspace = true }
 unicode_names2 = { version = "0.6.0", git = "https://github.com/youknowone/unicode_names2.git", rev = "4ce16aa85cbcdd9cc830410f1a72ef9a235f2fde" }
 wsl = { version = "0.1.0" }
 
diff --git a/crates/ruff_formatter/Cargo.toml b/crates/ruff_formatter/Cargo.toml
index 2f9c52ee06..a4cf178196 100644
--- a/crates/ruff_formatter/Cargo.toml
+++ b/crates/ruff_formatter/Cargo.toml
@@ -17,9 +17,9 @@ drop_bomb = { version = "0.1.5" }
 rustc-hash = { workspace = true }
 schemars = { workspace = true, optional = true }
 serde = { workspace = true, optional = true }
-tracing = { version = "0.1.37", default-features = false, features = ["std"] }
-unicode-width = { version = "0.1.10" }
 static_assertions = "1.1.0"
+tracing = { version = "0.1.37", default-features = false, features = ["std"] }
+unicode-width = { workspace = true }
 
 [dev-dependencies]
 insta = { workspace = true }
diff --git a/crates/ruff_python_formatter/Cargo.toml b/crates/ruff_python_formatter/Cargo.toml
index b57a90faed..637276bab1 100644
--- a/crates/ruff_python_formatter/Cargo.toml
+++ b/crates/ruff_python_formatter/Cargo.toml
@@ -30,6 +30,7 @@ rustc-hash = { workspace = true }
 serde = { workspace = true, optional = true }
 smallvec = { workspace = true }
 thiserror = { workspace = true }
+unicode-width = { workspace = true }
 
 [dev-dependencies]
 ruff_formatter = { path = "../ruff_formatter", features = ["serde"] }
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/.editorconfig b/crates/ruff_python_formatter/resources/test/fixtures/ruff/.editorconfig
new file mode 100644
index 0000000000..ddc5dc593f
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/.editorconfig
@@ -0,0 +1,3 @@
+[mixed_space_and_tab.py]
+generated_code = true
+ij_formatter_enabled = false
\ No newline at end of file
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py
index 0a8118079f..ede6493669 100644
--- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/comments.py
@@ -10,8 +10,13 @@ a +   b # a trailing comment
 def test():
     pass
 
-    # trailing comment that falls into the verbatim range
+  # under indent
 
+    def nested():
+        ...
+
+        # trailing comment that falls into the verbatim range
+      # trailing outer comment
   # fmt: on
 
 a +   b
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.options.json b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.options.json
new file mode 100644
index 0000000000..e662f72879
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_docstring.options.json
@@ -0,0 +1,8 @@
+[
+  {
+    "indent_style": { "Space": 4 }
+  },
+  {
+    "indent_style": { "Space": 2 }
+  }
+]
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.options.json b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.options.json
new file mode 100644
index 0000000000..8f229d10a5
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.options.json
@@ -0,0 +1,11 @@
+[
+  {
+    "indent_style": { "Space": 4 }
+  },
+  {
+    "indent_style": { "Space": 1 }
+  },
+  {
+    "indent_style": "Tab"
+  }
+]
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.py
new file mode 100644
index 0000000000..c0cb6c1849
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.py
@@ -0,0 +1,55 @@
+def test():
+ # fmt: off
+ a_very_small_indent
+ (
+not_fixed
+ )
+
+ if True:
+  pass
+  more
+ # fmt: on
+
+ formatted
+
+ def test():
+  a_small_indent
+  # fmt: off
+# fix under-indented comments
+  (or_the_inner_expression +
+expressions
+   )
+
+  if True:
+   pass
+  # fmt: on
+
+
+# fmt: off
+def test():
+  pass
+
+  # It is necessary to indent comments because the following fmt: on comment because it otherwise becomes a trailing comment
+  # of the `test` function if the "proper" indentation is larger than 2 spaces.
+  # fmt: on
+
+disabled +  formatting;
+
+# fmt: on
+
+formatted;
+
+def test():
+  pass
+  # fmt: off
+  """A multiline strings
+      that should not get formatted"""
+
+  "A single quoted multiline \
+       string"
+
+  disabled +  formatting;
+
+# fmt: on
+
+formatted;
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.options.json b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.options.json
new file mode 100644
index 0000000000..e40788162c
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.options.json
@@ -0,0 +1,11 @@
+[
+  {
+    "indent_style": { "Space": 4 }
+  },
+  {
+    "indent_style": { "Space": 2 }
+  },
+  {
+    "indent_style": "Tab"
+  }
+]
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.py
new file mode 100644
index 0000000000..0cf93824c1
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.py
@@ -0,0 +1,15 @@
+def test():
+ # fmt: off
+ 	a_very_small_indent
+ 	(
+not_fixed
+ )
+
+ 	if True:
+# Fun tab, space, tab, space. Followed by space, tab, tab, space
+	 	 pass
+ 		 more
+ 	else:
+  	   other
+ # fmt: on
+
diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs
index 2a704ae242..6c124f7d90 100644
--- a/crates/ruff_python_formatter/src/lib.rs
+++ b/crates/ruff_python_formatter/src/lib.rs
@@ -255,31 +255,16 @@ if True:
     #[ignore]
     #[test]
     fn quick_test() {
-        let src = r#"
-with (
-    [
-        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-        "bbbbbbbbbb",
-        "cccccccccccccccccccccccccccccccccccccccccc",
-        dddddddddddddddddddddddddddddddd,
-    ] as example1,
-    aaaaaaaaaaaaaaaaaaaaaaaaaa
-    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-    + cccccccccccccccccccccccccccc
-    + ddddddddddddddddd as example2,
-    CtxManager2() as example2,
-    CtxManager2() as example2,
-    CtxManager2() as example2,
-):
-    ...
+        let src = r#"def test():
+    # fmt: off
 
-with [
-    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-    "bbbbbbbbbb",
-    "cccccccccccccccccccccccccccccccccccccccccc",
-    dddddddddddddddddddddddddddddddd,
-] as example1, aaaaaaaaaaaaaaaaaaaaaaaaaa * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * cccccccccccccccccccccccccccc + ddddddddddddddddd as example2, CtxManager222222222222222() as example2:
-    ...
+    a  + b
+
+
+
+        # suppressed comments
+
+a   + b # formatted
 
 "#;
         // Tokenize once
@@ -304,9 +289,9 @@ with [
         // Use `dbg_write!(f, []) instead of `write!(f, [])` in your formatting code to print some IR
         // inside of a `Format` implementation
         // use ruff_formatter::FormatContext;
-        // dbg!(formatted
+        // formatted
         //     .document()
-        //     .display(formatted.context().source_code()));
+        //     .display(formatted.context().source_code());
         //
         // dbg!(formatted
         //     .context()
diff --git a/crates/ruff_python_formatter/src/verbatim.rs b/crates/ruff_python_formatter/src/verbatim.rs
index c96a35c59c..825ff63aca 100644
--- a/crates/ruff_python_formatter/src/verbatim.rs
+++ b/crates/ruff_python_formatter/src/verbatim.rs
@@ -1,11 +1,16 @@
 use std::borrow::Cow;
 use std::iter::FusedIterator;
 
-use ruff_formatter::write;
+use unicode_width::UnicodeWidthStr;
+
+use ruff_formatter::{write, FormatError};
 use ruff_python_ast::node::AnyNodeRef;
 use ruff_python_ast::{Ranged, Stmt};
+use ruff_python_parser::lexer::{lex_starts_at, LexResult};
+use ruff_python_parser::{Mode, Tok};
 use ruff_python_trivia::lines_before;
-use ruff_text_size::TextRange;
+use ruff_source_file::Locator;
+use ruff_text_size::{TextRange, TextSize};
 
 use crate::comments::format::{empty_lines, format_comment};
 use crate::comments::{leading_comments, trailing_comments, SourceComment};
@@ -80,6 +85,7 @@ pub(crate) fn write_suppressed_statements_starting_with_trailing_comment<'a>(
 ) -> FormatResult<&'a Stmt> {
     let comments = f.context().comments().clone();
     let source = f.context().source();
+    let indentation = Indentation::from_stmt(last_formatted.statement(), source);
 
     let trailing_node_comments = comments.trailing_comments(last_formatted);
     let mut trailing_comment_ranges =
@@ -131,10 +137,13 @@ pub(crate) fn write_suppressed_statements_starting_with_trailing_comment<'a>(
                 write!(
                     f,
                     [
-                        verbatim_text(TextRange::new(
-                            format_off_comment.end(),
-                            format_on_comment.start(),
-                        )),
+                        FormatVerbatimStatementRange {
+                            verbatim_range: TextRange::new(
+                                format_off_comment.end(),
+                                format_on_comment.start(),
+                            ),
+                            indentation
+                        },
                         trailing_comments(std::slice::from_ref(format_on_comment)),
                         trailing_comments(formatted_comments),
                     ]
@@ -163,7 +172,7 @@ pub(crate) fn write_suppressed_statements_starting_with_trailing_comment<'a>(
 
             // All comments in this range are suppressed
             SuppressionComments::Suppressed { comments: _ } => {}
-            // SAFETY: Unreachable because the function returns as soon as we reach the end of the suppressed range
+            // SAFETY: Unreachable because the function returns as soon as it reaches the end of the suppressed range
             SuppressionComments::SuppressionStarts { .. }
             | SuppressionComments::Formatted { .. } => unreachable!(),
         }
@@ -195,7 +204,11 @@ pub(crate) fn write_suppressed_statements_starting_with_trailing_comment<'a>(
     //      # a trailing comment
     // ```
     else if let Some(last_comment) = trailing_node_comments.last() {
-        verbatim_text(TextRange::new(format_off_comment.end(), last_comment.end())).fmt(f)?;
+        FormatVerbatimStatementRange {
+            verbatim_range: TextRange::new(format_off_comment.end(), last_comment.end()),
+            indentation,
+        }
+        .fmt(f)?;
         Ok(last_formatted.statement())
     }
     // The suppression comment is the very last code in the block. There's nothing more to format.
@@ -226,10 +239,10 @@ fn write_suppressed_statements<'a>(
     let comments = f.context().comments().clone();
     let source = f.context().source();
 
-    // TODO(micha) Fixup indent
     let mut statement = first_suppressed;
     let mut leading_node_comments = first_suppressed_leading_comments;
     let mut format_off_comment = format_off_comment;
+    let indentation = Indentation::from_stmt(first_suppressed.statement(), source);
 
     loop {
         for range in CommentRangeIter::in_suppression(leading_node_comments, source) {
@@ -266,10 +279,13 @@ fn write_suppressed_statements<'a>(
                     write!(
                         f,
                         [
-                            verbatim_text(TextRange::new(
-                                format_off_comment.end(),
-                                format_on_comment.start(),
-                            )),
+                            FormatVerbatimStatementRange {
+                                verbatim_range: TextRange::new(
+                                    format_off_comment.end(),
+                                    format_on_comment.start(),
+                                ),
+                                indentation
+                            },
                             leading_comments(std::slice::from_ref(format_on_comment)),
                             leading_comments(formatted_comments),
                         ]
@@ -343,10 +359,13 @@ fn write_suppressed_statements<'a>(
                     write!(
                         f,
                         [
-                            verbatim_text(TextRange::new(
-                                format_off_comment.end(),
-                                format_on_comment.start()
-                            )),
+                            FormatVerbatimStatementRange {
+                                verbatim_range: TextRange::new(
+                                    format_off_comment.end(),
+                                    format_on_comment.start()
+                                ),
+                                indentation
+                            },
                             format_comment(format_on_comment),
                             hard_line_break(),
                             trailing_comments(formatted_comments),
@@ -380,7 +399,11 @@ fn write_suppressed_statements<'a>(
                 .last()
                 .map_or(statement.end(), Ranged::end);
 
-            verbatim_text(TextRange::new(format_off_comment.end(), end)).fmt(f)?;
+            FormatVerbatimStatementRange {
+                verbatim_range: TextRange::new(format_off_comment.end(), end),
+                indentation,
+            }
+            .fmt(f)?;
 
             return Ok(statement.statement());
         }
@@ -573,33 +596,283 @@ impl Format> for TrailingFormatOffComment<'_> {
     }
 }
 
-struct VerbatimText(TextRange);
+/// Stores the indentation of a statement by storing the number of indentation characters.
+/// Storing the number of indentation characters is sufficient because:
+/// * Two indentations are equal if they result in the same column, regardless of the used tab size.
+///   This implementation makes use of this fact and assumes a tab size of 1.
+/// * The source document is correctly indented because it is valid Python code (or the formatter would have failed parsing the code).
+#[derive(Copy, Clone)]
+struct Indentation(u32);
 
-fn verbatim_text(item: T) -> VerbatimText
+impl Indentation {
+    fn from_stmt(stmt: &Stmt, source: &str) -> Indentation {
+        let line_start = Locator::new(source).line_start(stmt.start());
+
+        let mut indentation = 0u32;
+        for c in source[TextRange::new(line_start, stmt.start())].chars() {
+            if is_indent_whitespace(c) {
+                indentation += 1;
+            } else {
+                break;
+            }
+        }
+
+        Indentation(indentation)
+    }
+
+    fn trim_indent(self, ranged: impl Ranged, source: &str) -> TextRange {
+        let range = ranged.range();
+        let mut start_offset = TextSize::default();
+
+        for c in source[range].chars().take(self.0 as usize) {
+            if is_indent_whitespace(c) {
+                start_offset += TextSize::new(1);
+            } else {
+                break;
+            }
+        }
+
+        TextRange::new(range.start() + start_offset, range.end())
+    }
+}
+
+/// Returns `true` for a space or tab character.
+///
+/// This is different than [`is_python_whitespace`] in that it returns `false` for a form feed character.
+/// Form feed characters are excluded because they should be preserved in the suppressed output.
+const fn is_indent_whitespace(c: char) -> bool {
+    matches!(c, ' ' | '\t')
+}
+
+/// Formats a verbatim range where the top-level nodes are statements (or statement-level comments).
+///
+/// Formats each statement as written in the source code, but adds the right indentation to match
+/// the indentation of formatted statements:
+///
+/// ```python
+/// def test():
+///   print("formatted")
+///   # fmt: off
+///   (
+///     not_formatted + b
+///   )
+///   # fmt: on
+/// ```
+///
+/// Gets formatted as
+///
+/// ```python
+/// def test():
+///     print("formatted")
+///     # fmt: off
+///     (
+///     not_formatted + b
+///     )
+///     # fmt: on
+/// ```
+///
+/// Notice how the `not_formatted + b` expression statement gets the same indentation as the `print` statement above,
+/// but the indentation of the expression remains unchanged. It changes the indentation to:
+/// * Prevent syntax errors because of different indentation levels between formatted and suppressed statements.
+/// * Align with the `fmt: skip` where statements are indented as well, but inner expressions are formatted as is.
+struct FormatVerbatimStatementRange {
+    verbatim_range: TextRange,
+    indentation: Indentation,
+}
+
+impl Format> for FormatVerbatimStatementRange {
+    fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> {
+        let lexer = lex_starts_at(
+            &f.context().source()[self.verbatim_range],
+            Mode::Module,
+            self.verbatim_range.start(),
+        );
+
+        let logical_lines = LogicalLinesIter::new(lexer, self.verbatim_range);
+        let mut first = true;
+
+        for logical_line in logical_lines {
+            let logical_line = logical_line?;
+
+            let trimmed_line_range = self
+                .indentation
+                .trim_indent(&logical_line, f.context().source());
+
+            // A line without any content, write an empty line, except for the first or last (indent only) line.
+            if trimmed_line_range.is_empty() {
+                if logical_line.has_trailing_newline {
+                    if first {
+                        hard_line_break().fmt(f)?;
+                    } else {
+                        empty_line().fmt(f)?;
+                    }
+                }
+            } else {
+                // Non empty line, write the text of the line
+                verbatim_text(trimmed_line_range, logical_line.contains_newlines).fmt(f)?;
+
+                // Write the line separator that terminates the line, except if it is the last line (that isn't separated by a hard line break).
+                if logical_line.has_trailing_newline {
+                    // Insert an empty line if the text is non-empty but all characters have a width of zero.
+                    // This is necessary to work around the fact that the Printer omits hard line breaks if the line width is 0.
+                    // The alternative is to "fix" the printer and explicitly track the width and whether the line is empty.
+                    // There's currently no use case for zero-width content outside of the verbatim context (and, form feeds are a Python specific speciality).
+                    // It, therefore, feels wrong to add additional complexity to the very hot `Printer::print_char` function,
+                    // to work around this special case. Therefore, work around the Printer behavior here, in the cold verbatim-formatting.
+                    if f.context().source()[trimmed_line_range].width() == 0 {
+                        empty_line().fmt(f)?;
+                    } else {
+                        hard_line_break().fmt(f)?;
+                    }
+                }
+            }
+
+            first = false;
+        }
+
+        Ok(())
+    }
+}
+
+struct LogicalLinesIter {
+    lexer: I,
+    // The end of the last logical line
+    last_line_end: TextSize,
+    // The position where the content to lex ends.
+    content_end: TextSize,
+}
+
+impl LogicalLinesIter {
+    fn new(lexer: I, verbatim_range: TextRange) -> Self {
+        Self {
+            lexer,
+            last_line_end: verbatim_range.start(),
+            content_end: verbatim_range.end(),
+        }
+    }
+}
+
+impl Iterator for LogicalLinesIter
+where
+    I: Iterator,
+{
+    type Item = FormatResult;
+
+    fn next(&mut self) -> Option {
+        let mut parens = 0u32;
+        let mut contains_newlines = ContainsNewlines::No;
+
+        let (content_end, full_end) = loop {
+            match self.lexer.next() {
+                Some(Ok((token, range))) => match token {
+                    Tok::Newline => break (range.start(), range.end()),
+                    // Ignore if inside an expression
+                    Tok::NonLogicalNewline if parens == 0 => break (range.start(), range.end()),
+                    Tok::NonLogicalNewline => {
+                        contains_newlines = ContainsNewlines::Yes;
+                    }
+                    Tok::Lbrace | Tok::Lpar | Tok::Lsqb => {
+                        parens = parens.saturating_add(1);
+                    }
+                    Tok::Rbrace | Tok::Rpar | Tok::Rsqb => {
+                        parens = parens.saturating_sub(1);
+                    }
+                    Tok::String { value, .. } if value.contains(['\n', '\r']) => {
+                        contains_newlines = ContainsNewlines::Yes;
+                    }
+                    _ => {}
+                },
+                None => {
+                    // Returns any content that comes after the last newline. This is mainly whitespace
+                    // or characters that the `Lexer` skips, like a form-feed character.
+                    return if self.last_line_end < self.content_end {
+                        let content_start = self.last_line_end;
+                        self.last_line_end = self.content_end;
+                        Some(Ok(LogicalLine {
+                            content_range: TextRange::new(content_start, self.content_end),
+                            contains_newlines: ContainsNewlines::No,
+                            has_trailing_newline: false,
+                        }))
+                    } else {
+                        None
+                    };
+                }
+                Some(Err(_)) => {
+                    return Some(Err(FormatError::syntax_error(
+                        "Unexpected token when lexing verbatim statement range.",
+                    )))
+                }
+            }
+        };
+
+        let line_start = self.last_line_end;
+        self.last_line_end = full_end;
+
+        Some(Ok(LogicalLine {
+            content_range: TextRange::new(line_start, content_end),
+            contains_newlines,
+            has_trailing_newline: true,
+        }))
+    }
+}
+
+impl FusedIterator for LogicalLinesIter where I: Iterator {}
+
+/// A logical line or a comment (or form feed only) line
+struct LogicalLine {
+    /// The range of this lines content (excluding the trailing newline)
+    content_range: TextRange,
+    /// Whether the content in `content_range` contains any newlines.
+    contains_newlines: ContainsNewlines,
+    /// Does this logical line have a trailing newline or does it just happen to be the last line.
+    has_trailing_newline: bool,
+}
+
+impl Ranged for LogicalLine {
+    fn range(&self) -> TextRange {
+        self.content_range
+    }
+}
+
+struct VerbatimText {
+    verbatim_range: TextRange,
+    contains_newlines: ContainsNewlines,
+}
+
+fn verbatim_text(item: T, contains_newlines: ContainsNewlines) -> VerbatimText
 where
     T: Ranged,
 {
-    VerbatimText(item.range())
+    VerbatimText {
+        verbatim_range: item.range(),
+        contains_newlines,
+    }
 }
 
 impl Format> for VerbatimText {
     fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
         f.write_element(FormatElement::Tag(Tag::StartVerbatim(
             tag::VerbatimKind::Verbatim {
-                length: self.0.len(),
+                length: self.verbatim_range.len(),
             },
         )))?;
 
-        match normalize_newlines(f.context().locator().slice(self.0), ['\r']) {
+        match normalize_newlines(f.context().locator().slice(self.verbatim_range), ['\r']) {
             Cow::Borrowed(_) => {
-                write!(f, [source_text_slice(self.0, ContainsNewlines::Detect)])?;
+                write!(
+                    f,
+                    [source_text_slice(
+                        self.verbatim_range,
+                        self.contains_newlines
+                    )]
+                )?;
             }
             Cow::Owned(cleaned) => {
                 write!(
                     f,
                     [
-                        dynamic_text(&cleaned, Some(self.0.start())),
-                        source_position(self.0.end())
+                        dynamic_text(&cleaned, Some(self.verbatim_range.start())),
+                        source_position(self.verbatim_range.end())
                     ]
                 )?;
             }
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap
index f961fc36e8..ad353b6d2f 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__comments.py.snap
@@ -16,8 +16,13 @@ a +   b # a trailing comment
 def test():
     pass
 
-    # trailing comment that falls into the verbatim range
+  # under indent
 
+    def nested():
+        ...
+
+        # trailing comment that falls into the verbatim range
+      # trailing outer comment
   # fmt: on
 
 a +   b
@@ -43,8 +48,13 @@ a +   b # a trailing comment
 def test():
     pass
 
-    # trailing comment that falls into the verbatim range
+  # under indent
 
+    def nested():
+        ...
+
+        # trailing comment that falls into the verbatim range
+      # trailing outer comment
   # fmt: on
 
 a + b
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap
index 396dd028e3..dd1d9c6714 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__fmt_off_docstring.py.snap
@@ -25,7 +25,15 @@ def test():
     and_this +  gets + formatted + too
 ```
 
-## Output
+## Outputs
+### Output 1
+```
+indent-style            = Spaces, size: 4
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
 ```py
 def test():
     # fmt: off
@@ -49,4 +57,35 @@ def test():
 ```
 
 
+### Output 2
+```
+indent-style            = Spaces, size: 2
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def test():
+  # fmt: off
+  """ This docstring does not
+        get formatted
+    """
+
+  # fmt: on
+
+  but + this + does
+
+
+def test():
+  # fmt: off
+      # just for fun
+  # fmt: on
+  # leading comment
+  """This docstring gets formatted"""  # trailing comment
+
+  and_this + gets + formatted + too
+```
+
+
 
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__indent.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__indent.py.snap
new file mode 100644
index 0000000000..37ea15222f
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__indent.py.snap
@@ -0,0 +1,272 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/indent.py
+---
+## Input
+```py
+def test():
+ # fmt: off
+ a_very_small_indent
+ (
+not_fixed
+ )
+
+ if True:
+  pass
+  more
+ # fmt: on
+
+ formatted
+
+ def test():
+  a_small_indent
+  # fmt: off
+# fix under-indented comments
+  (or_the_inner_expression +
+expressions
+   )
+
+  if True:
+   pass
+  # fmt: on
+
+
+# fmt: off
+def test():
+  pass
+
+  # It is necessary to indent comments because the following fmt: on comment because it otherwise becomes a trailing comment
+  # of the `test` function if the "proper" indentation is larger than 2 spaces.
+  # fmt: on
+
+disabled +  formatting;
+
+# fmt: on
+
+formatted;
+
+def test():
+  pass
+  # fmt: off
+  """A multiline strings
+      that should not get formatted"""
+
+  "A single quoted multiline \
+       string"
+
+  disabled +  formatting;
+
+# fmt: on
+
+formatted;
+```
+
+## Outputs
+### Output 1
+```
+indent-style            = Spaces, size: 4
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def test():
+    # fmt: off
+    a_very_small_indent
+    (
+not_fixed
+ )
+
+    if True:
+     pass
+     more
+    # fmt: on
+
+    formatted
+
+    def test():
+        a_small_indent
+        # fmt: off
+        # fix under-indented comments
+        (or_the_inner_expression +
+expressions
+   )
+
+        if True:
+         pass
+        # fmt: on
+
+
+# fmt: off
+def test():
+  pass
+
+  # It is necessary to indent comments because the following fmt: on comment because it otherwise becomes a trailing comment
+  # of the `test` function if the "proper" indentation is larger than 2 spaces.
+  # fmt: on
+
+disabled +  formatting;
+
+# fmt: on
+
+formatted
+
+
+def test():
+    pass
+    # fmt: off
+    """A multiline strings
+      that should not get formatted"""
+
+    "A single quoted multiline \
+       string"
+
+    disabled +  formatting
+
+
+# fmt: on
+
+formatted
+```
+
+
+### Output 2
+```
+indent-style            = Spaces, size: 1
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def test():
+ # fmt: off
+ a_very_small_indent
+ (
+not_fixed
+ )
+
+ if True:
+  pass
+  more
+ # fmt: on
+
+ formatted
+
+ def test():
+  a_small_indent
+  # fmt: off
+  # fix under-indented comments
+  (or_the_inner_expression +
+expressions
+   )
+
+  if True:
+   pass
+  # fmt: on
+
+
+# fmt: off
+def test():
+  pass
+
+  # It is necessary to indent comments because the following fmt: on comment because it otherwise becomes a trailing comment
+  # of the `test` function if the "proper" indentation is larger than 2 spaces.
+  # fmt: on
+
+disabled +  formatting;
+
+# fmt: on
+
+formatted
+
+
+def test():
+ pass
+ # fmt: off
+ """A multiline strings
+      that should not get formatted"""
+
+ "A single quoted multiline \
+       string"
+
+ disabled +  formatting
+
+
+# fmt: on
+
+formatted
+```
+
+
+### Output 3
+```
+indent-style            = Tab
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def test():
+	# fmt: off
+	a_very_small_indent
+	(
+not_fixed
+ )
+
+	if True:
+	 pass
+	 more
+	# fmt: on
+
+	formatted
+
+	def test():
+		a_small_indent
+		# fmt: off
+		# fix under-indented comments
+		(or_the_inner_expression +
+expressions
+   )
+
+		if True:
+		 pass
+		# fmt: on
+
+
+# fmt: off
+def test():
+  pass
+
+  # It is necessary to indent comments because the following fmt: on comment because it otherwise becomes a trailing comment
+  # of the `test` function if the "proper" indentation is larger than 2 spaces.
+  # fmt: on
+
+disabled +  formatting;
+
+# fmt: on
+
+formatted
+
+
+def test():
+	pass
+	# fmt: off
+	"""A multiline strings
+      that should not get formatted"""
+
+	"A single quoted multiline \
+       string"
+
+	disabled +  formatting
+
+
+# fmt: on
+
+formatted
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__mixed_space_and_tab.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__mixed_space_and_tab.py.snap
new file mode 100644
index 0000000000..1027b24e41
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@fmt_on_off__mixed_space_and_tab.py.snap
@@ -0,0 +1,103 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/mixed_space_and_tab.py
+---
+## Input
+```py
+def test():
+ # fmt: off
+ 	a_very_small_indent
+ 	(
+not_fixed
+ )
+
+ 	if True:
+# Fun tab, space, tab, space. Followed by space, tab, tab, space
+	 	 pass
+ 		 more
+ 	else:
+  	   other
+ # fmt: on
+
+```
+
+## Outputs
+### Output 1
+```
+indent-style            = Spaces, size: 4
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def test():
+    # fmt: off
+    a_very_small_indent
+    (
+not_fixed
+ )
+
+    if True:
+    # Fun tab, space, tab, space. Followed by space, tab, tab, space
+    	 pass
+    	 more
+    else:
+    	   other
+# fmt: on
+```
+
+
+### Output 2
+```
+indent-style            = Spaces, size: 2
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def test():
+  # fmt: off
+  a_very_small_indent
+  (
+not_fixed
+ )
+
+  if True:
+  # Fun tab, space, tab, space. Followed by space, tab, tab, space
+  	 pass
+  	 more
+  else:
+  	   other
+# fmt: on
+```
+
+
+### Output 3
+```
+indent-style            = Tab
+line-width              = 88
+quote-style             = Double
+magic-trailing-comma    = Respect
+```
+
+```py
+def test():
+	# fmt: off
+	a_very_small_indent
+	(
+not_fixed
+ )
+
+	if True:
+	# Fun tab, space, tab, space. Followed by space, tab, tab, space
+		 pass
+		 more
+	else:
+		   other
+# fmt: on
+```
+
+
+

From 455db84a591e89bce8d44eb316455ba7203ff36f Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Tue, 15 Aug 2023 08:58:11 +0200
Subject: [PATCH 131/155] Replace `inline(always)` with `inline` (#6590)

---
 crates/ruff_formatter/src/arguments.rs           | 12 ++++--------
 crates/ruff_python_ast/src/visitor/preorder.rs   |  3 +--
 crates/ruff_python_formatter/src/comments/mod.rs |  2 +-
 3 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/crates/ruff_formatter/src/arguments.rs b/crates/ruff_formatter/src/arguments.rs
index dae1a2df3e..36b37e64b3 100644
--- a/crates/ruff_formatter/src/arguments.rs
+++ b/crates/ruff_formatter/src/arguments.rs
@@ -33,8 +33,7 @@ impl<'fmt, Context> Argument<'fmt, Context> {
     #[doc(hidden)]
     #[inline]
     pub fn new>(value: &'fmt F) -> Self {
-        #[allow(clippy::inline_always)]
-        #[inline(always)]
+        #[inline]
         fn formatter, Context>(
             ptr: *const c_void,
             fmt: &mut Formatter,
@@ -52,8 +51,7 @@ impl<'fmt, Context> Argument<'fmt, Context> {
     }
 
     /// Formats the value stored by this argument using the given formatter.
-    #[allow(clippy::inline_always)]
-    #[inline(always)]
+    #[inline]
     pub(super) fn format(&self, f: &mut Formatter) -> FormatResult<()> {
         (self.formatter)(self.value, f)
     }
@@ -82,9 +80,8 @@ impl<'fmt, Context> Argument<'fmt, Context> {
 pub struct Arguments<'fmt, Context>(pub &'fmt [Argument<'fmt, Context>]);
 
 impl<'fmt, Context> Arguments<'fmt, Context> {
-    #[allow(clippy::inline_always)]
     #[doc(hidden)]
-    #[inline(always)]
+    #[inline]
     pub fn new(arguments: &'fmt [Argument<'fmt, Context>]) -> Self {
         Self(arguments)
     }
@@ -106,8 +103,7 @@ impl Clone for Arguments<'_, Context> {
 }
 
 impl Format for Arguments<'_, Context> {
-    #[allow(clippy::inline_always)]
-    #[inline(always)]
+    #[inline]
     fn fmt(&self, formatter: &mut Formatter) -> FormatResult<()> {
         formatter.write_fmt(*self)
     }
diff --git a/crates/ruff_python_ast/src/visitor/preorder.rs b/crates/ruff_python_ast/src/visitor/preorder.rs
index 59e8100590..dc171765b5 100644
--- a/crates/ruff_python_ast/src/visitor/preorder.rs
+++ b/crates/ruff_python_ast/src/visitor/preorder.rs
@@ -7,8 +7,7 @@ use crate::{
 
 /// Visitor that traverses all nodes recursively in pre-order.
 pub trait PreorderVisitor<'a> {
-    #[allow(clippy::inline_always)]
-    #[inline(always)]
+    #[inline]
     fn enter_node(&mut self, _node: AnyNodeRef<'a>) -> TraversalSignal {
         TraversalSignal::Traverse
     }
diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs
index ee9ba687d0..8b1a108f7a 100644
--- a/crates/ruff_python_formatter/src/comments/mod.rs
+++ b/crates/ruff_python_formatter/src/comments/mod.rs
@@ -442,7 +442,7 @@ impl<'a> Comments<'a> {
 
     #[inline(always)]
     #[cfg(not(debug_assertions))]
-    pub(crate) fn mark_verbatim_node_comments_formatted(&self, node: AnyNodeRef) {}
+    pub(crate) fn mark_verbatim_node_comments_formatted(&self, _node: AnyNodeRef) {}
 
     /// Marks the comments of a node printed in verbatim (suppressed) as formatted.
     ///

From 84d178a219715336227582a3852ec2bc9025b38b Mon Sep 17 00:00:00 2001
From: Tom Kuson 
Date: Tue, 15 Aug 2023 08:33:57 +0100
Subject: [PATCH 132/155] Use one line between top-level items if formatting a
 stub file (#6501)

Co-authored-by: Micha Reiser 
---
 .../test/fixtures/ruff/statement/top_level.py |  39 +++++
 .../fixtures/ruff/statement/top_level.pyi     |  78 +++++++++
 crates/ruff_python_formatter/src/options.rs   |   4 +
 .../src/statement/suite.rs                    |  55 ++++++-
 .../ruff_python_formatter/tests/fixtures.rs   |   6 +-
 .../format@statement__top_level.py.snap       | 118 ++++++++++++++
 .../format@statement__top_level.pyi.snap      | 153 ++++++++++++++++++
 7 files changed, 451 insertions(+), 2 deletions(-)
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.py
 create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.pyi
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.py.snap
 create mode 100644 crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.pyi.snap

diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.py
new file mode 100644
index 0000000000..85210a209e
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.py
@@ -0,0 +1,39 @@
+class A:
+    def __init__(self):
+        pass
+
+class B:
+    def __init__(self):
+        pass
+
+def foo():
+    pass
+
+class Del(expr_context): ...
+class Load(expr_context): ...
+
+# Some comment.
+class Other(expr_context): ...
+class Store(expr_context): ...
+class Foo(Bar): ...
+
+class Baz(Qux):
+    def __init__(self):
+        pass
+
+class Quux(Qux):
+    def __init__(self):
+        pass
+
+# Some comment.
+class Quuz(Qux):
+    def __init__(self):
+        pass
+
+def bar(): ...
+def baz(): ...
+def quux():
+    """Some docstring."""
+
+def quuz():
+    """Some docstring."""
diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.pyi b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.pyi
new file mode 100644
index 0000000000..4c5a03d386
--- /dev/null
+++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.pyi
@@ -0,0 +1,78 @@
+class A:
+    def __init__(self):
+        pass
+
+
+class B:
+    def __init__(self):
+        pass
+
+
+def foo():
+    pass
+
+
+class Del(expr_context):
+    ...
+
+
+class Load(expr_context):
+    ...
+
+
+# Some comment.
+class Other(expr_context):
+    ...
+
+
+class Store(expr_context):
+    ...
+
+
+class Foo(Bar):
+    ...
+
+
+class Baz(Qux):
+    def __init__(self):
+        pass
+
+
+class Quux(Qux):
+    def __init__(self):
+        pass
+
+
+# Some comment.
+class Quuz(Qux):
+    def __init__(self):
+        pass
+
+
+def bar():
+    ...
+
+
+def baz():
+    ...
+
+
+def quux():
+    """Some docstring."""
+
+
+def quuz():
+    """Some docstring."""
+
+def a():
+  ...
+
+class Test:
+  ...
+
+class Test2(A):
+  ...
+
+def b(): ...
+# comment
+def c(): ...
diff --git a/crates/ruff_python_formatter/src/options.rs b/crates/ruff_python_formatter/src/options.rs
index ef2d84ca79..0a5693e83c 100644
--- a/crates/ruff_python_formatter/src/options.rs
+++ b/crates/ruff_python_formatter/src/options.rs
@@ -72,6 +72,10 @@ impl PyFormatOptions {
         self.quote_style
     }
 
+    pub fn source_type(&self) -> PySourceType {
+        self.source_type
+    }
+
     #[must_use]
     pub fn with_quote_style(mut self, style: QuoteStyle) -> Self {
         self.quote_style = style;
diff --git a/crates/ruff_python_formatter/src/statement/suite.rs b/crates/ruff_python_formatter/src/statement/suite.rs
index a18760117c..0890e028f5 100644
--- a/crates/ruff_python_formatter/src/statement/suite.rs
+++ b/crates/ruff_python_formatter/src/statement/suite.rs
@@ -2,7 +2,7 @@ use crate::comments::{leading_comments, trailing_comments};
 use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions};
 use ruff_python_ast::helpers::is_compound_statement;
 use ruff_python_ast::node::AnyNodeRef;
-use ruff_python_ast::{self as ast, Expr, ExprConstant, Ranged, Stmt, Suite};
+use ruff_python_ast::{self as ast, Constant, Expr, ExprConstant, Ranged, Stmt, Suite};
 use ruff_python_trivia::{lines_after_ignoring_trivia, lines_before};
 use ruff_text_size::TextRange;
 
@@ -55,6 +55,7 @@ impl FormatRule> for FormatSuite {
 
         let comments = f.context().comments().clone();
         let source = f.context().source();
+        let source_type = f.options().source_type();
 
         let mut f = WithNodeLevel::new(node_level, f);
         write!(
@@ -152,6 +153,44 @@ impl FormatRule> for FormatSuite {
                         || is_class_or_function_definition(following)
                     {
                         match self.kind {
+                            SuiteKind::TopLevel if source_type.is_stub() => {
+                                // Preserve the empty line if the definitions are separated by a comment
+                                if comments.has_trailing_comments(preceding)
+                                    || comments.has_leading_comments(following)
+                                {
+                                    empty_line().fmt(f)?;
+                                } else {
+                                    // Two subsequent classes that both have an ellipsis only body
+                                    // ```python
+                                    // class A: ...
+                                    // class B: ...
+                                    // ```
+                                    let class_sequences_with_ellipsis_only =
+                                        preceding.as_class_def_stmt().is_some_and(|class| {
+                                            contains_only_an_ellipsis(&class.body)
+                                        }) && following.as_class_def_stmt().is_some_and(|class| {
+                                            contains_only_an_ellipsis(&class.body)
+                                        });
+
+                                    // Two subsequent functions where the preceding has an ellipsis only body
+                                    // ```python
+                                    // def test(): ...
+                                    // def b(): a
+                                    // ```
+                                    let function_with_ellipsis =
+                                        preceding.as_function_def_stmt().is_some_and(|function| {
+                                            contains_only_an_ellipsis(&function.body)
+                                        }) && following.is_function_def_stmt();
+
+                                    // Don't add an empty line between two classes that have an `...` body only or after
+                                    // a function with an `...` body. Otherwise add an empty line.
+                                    if !class_sequences_with_ellipsis_only
+                                        && !function_with_ellipsis
+                                    {
+                                        empty_line().fmt(f)?;
+                                    }
+                                }
+                            }
                             SuiteKind::TopLevel => {
                                 write!(f, [empty_line(), empty_line()])?;
                             }
@@ -284,6 +323,20 @@ impl FormatRule> for FormatSuite {
     }
 }
 
+/// Returns `true` if a function or class body contains only an ellipsis.
+fn contains_only_an_ellipsis(body: &[Stmt]) -> bool {
+    match body {
+        [Stmt::Expr(ast::StmtExpr { value, .. })] => matches!(
+            value.as_ref(),
+            Expr::Constant(ast::ExprConstant {
+                value: Constant::Ellipsis,
+                ..
+            })
+        ),
+        _ => false,
+    }
+}
+
 /// Returns `true` if a [`Stmt`] is a class or function definition.
 const fn is_class_or_function_definition(stmt: &Stmt) -> bool {
     matches!(stmt, Stmt::FunctionDef(_) | Stmt::ClassDef(_))
diff --git a/crates/ruff_python_formatter/tests/fixtures.rs b/crates/ruff_python_formatter/tests/fixtures.rs
index 2ea1be0828..1991b838f4 100644
--- a/crates/ruff_python_formatter/tests/fixtures.rs
+++ b/crates/ruff_python_formatter/tests/fixtures.rs
@@ -161,7 +161,11 @@ fn format() {
         });
     };
 
-    insta::glob!("../resources", "test/fixtures/ruff/**/*.py", test_file);
+    insta::glob!(
+        "../resources",
+        "test/fixtures/ruff/**/*.{py,pyi}",
+        test_file
+    );
 }
 
 /// Format another time and make sure that there are no changes anymore
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.py.snap
new file mode 100644
index 0000000000..735d40d806
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.py.snap
@@ -0,0 +1,118 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.py
+---
+## Input
+```py
+class A:
+    def __init__(self):
+        pass
+
+class B:
+    def __init__(self):
+        pass
+
+def foo():
+    pass
+
+class Del(expr_context): ...
+class Load(expr_context): ...
+
+# Some comment.
+class Other(expr_context): ...
+class Store(expr_context): ...
+class Foo(Bar): ...
+
+class Baz(Qux):
+    def __init__(self):
+        pass
+
+class Quux(Qux):
+    def __init__(self):
+        pass
+
+# Some comment.
+class Quuz(Qux):
+    def __init__(self):
+        pass
+
+def bar(): ...
+def baz(): ...
+def quux():
+    """Some docstring."""
+
+def quuz():
+    """Some docstring."""
+```
+
+## Output
+```py
+class A:
+    def __init__(self):
+        pass
+
+
+class B:
+    def __init__(self):
+        pass
+
+
+def foo():
+    pass
+
+
+class Del(expr_context):
+    ...
+
+
+class Load(expr_context):
+    ...
+
+
+# Some comment.
+class Other(expr_context):
+    ...
+
+
+class Store(expr_context):
+    ...
+
+
+class Foo(Bar):
+    ...
+
+
+class Baz(Qux):
+    def __init__(self):
+        pass
+
+
+class Quux(Qux):
+    def __init__(self):
+        pass
+
+
+# Some comment.
+class Quuz(Qux):
+    def __init__(self):
+        pass
+
+
+def bar():
+    ...
+
+
+def baz():
+    ...
+
+
+def quux():
+    """Some docstring."""
+
+
+def quuz():
+    """Some docstring."""
+```
+
+
+
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.pyi.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.pyi.snap
new file mode 100644
index 0000000000..35fced5adf
--- /dev/null
+++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__top_level.pyi.snap
@@ -0,0 +1,153 @@
+---
+source: crates/ruff_python_formatter/tests/fixtures.rs
+input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/top_level.pyi
+---
+## Input
+```py
+class A:
+    def __init__(self):
+        pass
+
+
+class B:
+    def __init__(self):
+        pass
+
+
+def foo():
+    pass
+
+
+class Del(expr_context):
+    ...
+
+
+class Load(expr_context):
+    ...
+
+
+# Some comment.
+class Other(expr_context):
+    ...
+
+
+class Store(expr_context):
+    ...
+
+
+class Foo(Bar):
+    ...
+
+
+class Baz(Qux):
+    def __init__(self):
+        pass
+
+
+class Quux(Qux):
+    def __init__(self):
+        pass
+
+
+# Some comment.
+class Quuz(Qux):
+    def __init__(self):
+        pass
+
+
+def bar():
+    ...
+
+
+def baz():
+    ...
+
+
+def quux():
+    """Some docstring."""
+
+
+def quuz():
+    """Some docstring."""
+
+def a():
+  ...
+
+class Test:
+  ...
+
+class Test2(A):
+  ...
+
+def b(): ...
+# comment
+def c(): ...
+```
+
+## Output
+```py
+class A:
+    def __init__(self):
+        pass
+
+class B:
+    def __init__(self):
+        pass
+
+def foo():
+    pass
+
+class Del(expr_context):
+    ...
+class Load(expr_context):
+    ...
+
+# Some comment.
+class Other(expr_context):
+    ...
+class Store(expr_context):
+    ...
+class Foo(Bar):
+    ...
+
+class Baz(Qux):
+    def __init__(self):
+        pass
+
+class Quux(Qux):
+    def __init__(self):
+        pass
+
+# Some comment.
+class Quuz(Qux):
+    def __init__(self):
+        pass
+
+def bar():
+    ...
+def baz():
+    ...
+def quux():
+    """Some docstring."""
+
+def quuz():
+    """Some docstring."""
+
+def a():
+    ...
+
+class Test:
+    ...
+class Test2(A):
+    ...
+
+def b():
+    ...
+
+# comment
+def c():
+    ...
+```
+
+
+

From b1c4c7be69d796186e0a75e0e88955b489343d9a Mon Sep 17 00:00:00 2001
From: Charlie Marsh 
Date: Tue, 15 Aug 2023 07:15:33 -0400
Subject: [PATCH 133/155] Add trailing comma for single-element import-from
 groups (#6583)

## Summary

Unlike other statements, Black always adds a trailing comma if an
import-from statement breaks with a single import member. I believe this
is for compatibility with isort -- see
https://github.com/psf/black/commit/09f5ee3a19f4274bb848324867bd8e68724cf851,
https://github.com/psf/black/issues/127, or
https://github.com/psf/black/blob/66648c528a95553c1f822ece394ac98784baee47/src/black/linegen.py#L1452
for the current version.

## Test Plan

`cargo test`, notice that a big chunk of the compatibility suite is
removed.

Before:

| project      | similarity index |
|--------------|------------------|
| cpython      | 0.75472          |
| django       | 0.99804          |
| transformers | 0.99618          |
| twine        | 0.99876          |
| typeshed     | 0.74233          |
| warehouse    | 0.99601          |
| zulip        | 0.99727          |

After:

| project      | similarity index |
|--------------|------------------|
| cpython      | 0.75472          |
| django       | 0.99804          |
| transformers | 0.99618          |
| twine        | 0.99876          |
| typeshed     | 0.74260          |
| warehouse    | 0.99601          |
| zulip        | 0.99727          |
---
 crates/ruff_python_formatter/src/builders.rs  |  29 ++-
 .../src/statement/stmt_import_from.rs         |   3 +-
 ...patibility@simple_cases__comments2.py.snap |  15 +-
 ...ility@simple_cases__import_spacing.py.snap | 213 ------------------
 .../format@statement__import.py.snap          |   2 +-
 .../format@statement__import_from.py.snap     |   2 +-
 6 files changed, 33 insertions(+), 231 deletions(-)
 delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__import_spacing.py.snap

diff --git a/crates/ruff_python_formatter/src/builders.rs b/crates/ruff_python_formatter/src/builders.rs
index 95a2a76ace..943b06efd8 100644
--- a/crates/ruff_python_formatter/src/builders.rs
+++ b/crates/ruff_python_formatter/src/builders.rs
@@ -92,11 +92,23 @@ impl Entries {
     }
 }
 
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
+pub(crate) enum TrailingComma {
+    /// Add a trailing comma if the group breaks and there's more than one element (or if the last
+    /// element has a trailing comma and the magical trailing comma option is enabled).
+    #[default]
+    MoreThanOne,
+    /// Add a trailing comma if the group breaks (or if the last element has a trailing comma and
+    /// the magical trailing comma option is enabled).
+    OneOrMore,
+}
+
 pub(crate) struct JoinCommaSeparatedBuilder<'fmt, 'ast, 'buf> {
     result: FormatResult<()>,
     fmt: &'fmt mut PyFormatter<'ast, 'buf>,
     entries: Entries,
     sequence_end: TextSize,
+    trailing_comma: TrailingComma,
 }
 
 impl<'fmt, 'ast, 'buf> JoinCommaSeparatedBuilder<'fmt, 'ast, 'buf> {
@@ -106,9 +118,19 @@ impl<'fmt, 'ast, 'buf> JoinCommaSeparatedBuilder<'fmt, 'ast, 'buf> {
             result: Ok(()),
             entries: Entries::None,
             sequence_end,
+            trailing_comma: TrailingComma::default(),
         }
     }
 
+    /// Set the trailing comma behavior for the builder. Trailing commas will only be inserted if
+    /// the group breaks, and will _always_ be inserted if the last element has a trailing comma
+    /// (and the magical trailing comma option is enabled). However, this setting dictates whether
+    /// trailing commas are inserted for single element groups.
+    pub(crate) fn with_trailing_comma(mut self, trailing_comma: TrailingComma) -> Self {
+        self.trailing_comma = trailing_comma;
+        self
+    }
+
     pub(crate) fn entry(
         &mut self,
         node: &T,
@@ -194,8 +216,11 @@ impl<'fmt, 'ast, 'buf> JoinCommaSeparatedBuilder<'fmt, 'ast, 'buf> {
                 };
 
                 // If there is a single entry, only keep the magic trailing comma, don't add it if
-                // it wasn't there. If there is more than one entry, always add it.
-                if magic_trailing_comma || self.entries.is_more_than_one() {
+                // it wasn't there -- unless the trailing comma behavior is set to one-or-more.
+                if magic_trailing_comma
+                    || self.trailing_comma == TrailingComma::OneOrMore
+                    || self.entries.is_more_than_one()
+                {
                     if_group_breaks(&text(",")).fmt(self.fmt)?;
                 }
 
diff --git a/crates/ruff_python_formatter/src/statement/stmt_import_from.rs b/crates/ruff_python_formatter/src/statement/stmt_import_from.rs
index 3249dd7a79..433293cfa9 100644
--- a/crates/ruff_python_formatter/src/statement/stmt_import_from.rs
+++ b/crates/ruff_python_formatter/src/statement/stmt_import_from.rs
@@ -3,7 +3,7 @@ use ruff_formatter::{write, Buffer, Format, FormatResult};
 use ruff_python_ast::node::AstNode;
 use ruff_python_ast::{Ranged, StmtImportFrom};
 
-use crate::builders::{parenthesize_if_expands, PyFormatterExtensions};
+use crate::builders::{parenthesize_if_expands, PyFormatterExtensions, TrailingComma};
 use crate::expression::parentheses::parenthesized;
 use crate::{AsFormat, FormatNodeRule, PyFormatter};
 
@@ -45,6 +45,7 @@ impl FormatNodeRule for FormatStmtImportFrom {
 
         let names = format_with(|f| {
             f.join_comma_separated(item.end())
+                .with_trailing_comma(TrailingComma::OneOrMore)
                 .entries(names.iter().map(|name| (name, name.format())))
                 .finish()
         });
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments2.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments2.py.snap
index 9628978a2c..0e98a11642 100644
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments2.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments2.py.snap
@@ -180,17 +180,6 @@ instruction()#comment with bad spacing
 ```diff
 --- Black
 +++ Ruff
-@@ -1,8 +1,8 @@
- from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
--    MyLovelyCompanyTeamProjectComponent,  # NOT DRY
-+    MyLovelyCompanyTeamProjectComponent  # NOT DRY
- )
- from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
--    MyLovelyCompanyTeamProjectComponent as component,  # DRY
-+    MyLovelyCompanyTeamProjectComponent as component  # DRY
- )
- 
- # Please keep __all__ alphabetized within each category.
 @@ -60,8 +60,12 @@
  # Comment before function.
  def inline_comments_in_brackets_ruin_everything():
@@ -259,10 +248,10 @@ instruction()#comment with bad spacing
 
 ```py
 from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
-    MyLovelyCompanyTeamProjectComponent  # NOT DRY
+    MyLovelyCompanyTeamProjectComponent,  # NOT DRY
 )
 from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
-    MyLovelyCompanyTeamProjectComponent as component  # DRY
+    MyLovelyCompanyTeamProjectComponent as component,  # DRY
 )
 
 # Please keep __all__ alphabetized within each category.
diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__import_spacing.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__import_spacing.py.snap
deleted file mode 100644
index f08a097d01..0000000000
--- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__import_spacing.py.snap
+++ /dev/null
@@ -1,213 +0,0 @@
----
-source: crates/ruff_python_formatter/tests/fixtures.rs
-input_file: crates/ruff_python_formatter/resources/test/fixtures/black/simple_cases/import_spacing.py
----
-## Input
-
-```py
-"""The asyncio package, tracking PEP 3156."""
-
-# flake8: noqa
-
-from logging import (
-    WARNING
-)
-from logging import (
-    ERROR,
-)
-import sys
-
-# This relies on each of the submodules having an __all__ variable.
-from .base_events import *
-from .coroutines import *
-from .events import *  # comment here
-
-from .futures import *
-from .locks import *  # comment here
-from .protocols import *
-
-from ..runners import *  # comment here
-from ..queues import *
-from ..streams import *
-
-from some_library import (
-    Just, Enough, Libraries, To, Fit, In, This, Nice, Split, Which, We, No, Longer, Use
-)
-from name_of_a_company.extremely_long_project_name.component.ttypes import CuteLittleServiceHandlerFactoryyy
-from name_of_a_company.extremely_long_project_name.extremely_long_component_name.ttypes import *
-
-from .a.b.c.subprocess import *
-from . import (tasks)
-from . import (A, B, C)
-from . import SomeVeryLongNameAndAllOfItsAdditionalLetters1, \
-              SomeVeryLongNameAndAllOfItsAdditionalLetters2
-
-__all__ = (
-    base_events.__all__
-    + coroutines.__all__
-    + events.__all__
-    + futures.__all__
-    + locks.__all__
-    + protocols.__all__
-    + runners.__all__
-    + queues.__all__
-    + streams.__all__
-    + tasks.__all__
-)
-```
-
-## Black Differences
-
-```diff
---- Black
-+++ Ruff
-@@ -38,7 +38,7 @@
-     Use,
- )
- from name_of_a_company.extremely_long_project_name.component.ttypes import (
--    CuteLittleServiceHandlerFactoryyy,
-+    CuteLittleServiceHandlerFactoryyy
- )
- from name_of_a_company.extremely_long_project_name.extremely_long_component_name.ttypes import *
- 
-```
-
-## Ruff Output
-
-```py
-"""The asyncio package, tracking PEP 3156."""
-
-# flake8: noqa
-
-from logging import WARNING
-from logging import (
-    ERROR,
-)
-import sys
-
-# This relies on each of the submodules having an __all__ variable.
-from .base_events import *
-from .coroutines import *
-from .events import *  # comment here
-
-from .futures import *
-from .locks import *  # comment here
-from .protocols import *
-
-from ..runners import *  # comment here
-from ..queues import *
-from ..streams import *
-
-from some_library import (
-    Just,
-    Enough,
-    Libraries,
-    To,
-    Fit,
-    In,
-    This,
-    Nice,
-    Split,
-    Which,
-    We,
-    No,
-    Longer,
-    Use,
-)
-from name_of_a_company.extremely_long_project_name.component.ttypes import (
-    CuteLittleServiceHandlerFactoryyy
-)
-from name_of_a_company.extremely_long_project_name.extremely_long_component_name.ttypes import *
-
-from .a.b.c.subprocess import *
-from . import tasks
-from . import A, B, C
-from . import (
-    SomeVeryLongNameAndAllOfItsAdditionalLetters1,
-    SomeVeryLongNameAndAllOfItsAdditionalLetters2,
-)
-
-__all__ = (
-    base_events.__all__
-    + coroutines.__all__
-    + events.__all__
-    + futures.__all__
-    + locks.__all__
-    + protocols.__all__
-    + runners.__all__
-    + queues.__all__
-    + streams.__all__
-    + tasks.__all__
-)
-```
-
-## Black Output
-
-```py
-"""The asyncio package, tracking PEP 3156."""
-
-# flake8: noqa
-
-from logging import WARNING
-from logging import (
-    ERROR,
-)
-import sys
-
-# This relies on each of the submodules having an __all__ variable.
-from .base_events import *
-from .coroutines import *
-from .events import *  # comment here
-
-from .futures import *
-from .locks import *  # comment here
-from .protocols import *
-
-from ..runners import *  # comment here
-from ..queues import *
-from ..streams import *
-
-from some_library import (
-    Just,
-    Enough,
-    Libraries,
-    To,
-    Fit,
-    In,
-    This,
-    Nice,
-    Split,
-    Which,
-    We,
-    No,
-    Longer,
-    Use,
-)
-from name_of_a_company.extremely_long_project_name.component.ttypes import (
-    CuteLittleServiceHandlerFactoryyy,
-)
-from name_of_a_company.extremely_long_project_name.extremely_long_component_name.ttypes import *
-
-from .a.b.c.subprocess import *
-from . import tasks
-from . import A, B, C
-from . import (
-    SomeVeryLongNameAndAllOfItsAdditionalLetters1,
-    SomeVeryLongNameAndAllOfItsAdditionalLetters2,
-)
-
-__all__ = (
-    base_events.__all__
-    + coroutines.__all__
-    + events.__all__
-    + futures.__all__
-    + locks.__all__
-    + protocols.__all__
-    + runners.__all__
-    + queues.__all__
-    + streams.__all__
-    + tasks.__all__
-)
-```
-
-
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__import.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__import.py.snap
index 0208606383..4c76352286 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@statement__import.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__import.py.snap
@@ -12,7 +12,7 @@ from a import aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjf
 ## Output
 ```py
 from a import (
-    aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa
+    aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa,
 )
 from a import (
     aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa,
diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap
index 433e893297..6b3942ea0c 100644
--- a/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap
+++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__import_from.py.snap
@@ -89,7 +89,7 @@ from a import (  # comment
 )
 
 from a import (  # comment
-    bar
+    bar,
 )
 
 from a import (

From 81b1176f9928ca146f4f6a3ab32804e5fcc00c75 Mon Sep 17 00:00:00 2001
From: Harutaka Kawamura 
Date: Tue, 15 Aug 2023 21:48:44 +0900
Subject: [PATCH 134/155] Fix PT005 doc (#6596)

---
 .../rules/flake8_pytest_style/rules/fixture.rs   | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
index 771140db95..ddcd51b388 100644
--- a/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
+++ b/crates/ruff/src/rules/flake8_pytest_style/rules/fixture.rs
@@ -213,6 +213,14 @@ pub struct PytestMissingFixtureNameUnderscore {
     function: String,
 }
 
+impl Violation for PytestMissingFixtureNameUnderscore {
+    #[derive_message_formats]
+    fn message(&self) -> String {
+        let PytestMissingFixtureNameUnderscore { function } = self;
+        format!("Fixture `{function}` does not return anything, add leading underscore")
+    }
+}
+
 /// ## What it does
 /// Checks for `pytest` fixtures that return a value, but are named with a
 /// leading underscore.
@@ -259,14 +267,6 @@ pub struct PytestMissingFixtureNameUnderscore {
 ///
 /// ## References
 /// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture)
-impl Violation for PytestMissingFixtureNameUnderscore {
-    #[derive_message_formats]
-    fn message(&self) -> String {
-        let PytestMissingFixtureNameUnderscore { function } = self;
-        format!("Fixture `{function}` does not return anything, add leading underscore")
-    }
-}
-
 #[violation]
 pub struct PytestIncorrectFixtureNameUnderscore {
     function: String,

From 29c0b9f91cf3041d42269cf803836833bd539977 Mon Sep 17 00:00:00 2001
From: Micha Reiser 
Date: Tue, 15 Aug 2023 17:39:45 +0200
Subject: [PATCH 135/155] Use single lookup for leading, dangling, and trailing
 comments (#6589)

---
 .../ruff_python_formatter/src/comments/map.rs | 398 ++++++------------
 .../ruff_python_formatter/src/comments/mod.rs |   8 +-
 .../src/expression/expr_attribute.rs          |   4 +-
 .../src/expression/expr_bin_op.rs             |   8 +-
 .../src/expression/expr_bool_op.rs            |  26 +-
 .../src/expression/expr_compare.rs            |  25 +-
 .../src/expression/expr_constant.rs           |   3 +-
 .../src/expression/expr_dict.rs               |   8 +-
 .../src/expression/expr_generator_exp.rs      |   4 +-
 .../src/expression/expr_lambda.rs             |   8 +-
 .../src/expression/expr_list.rs               |   7 +-
 .../src/expression/expr_list_comp.rs          |   3 +-
 .../src/expression/expr_name.rs               |   7 +-
 .../src/expression/expr_set.rs                |   7 +-
 .../src/expression/expr_set_comp.rs           |   7 +-
 .../src/expression/expr_starred.rs            |   9 +-
 .../src/expression/expr_subscript.rs          |   4 +-
 .../src/expression/expr_tuple.rs              |   7 +-
 .../src/expression/mod.rs                     |  12 +-
 crates/ruff_python_formatter/src/lib.rs       |  20 +-
 .../src/other/arguments.rs                    |   7 +-
 .../src/other/comprehension.rs                |   4 +-
 .../other/except_handler_except_handler.rs    |   4 +-
 .../src/other/match_case.rs                   |   8 +-
 .../src/other/parameters.rs                   |   6 +-
 .../src/other/with_item.rs                    |   8 +-
 .../src/statement/stmt_class_def.rs           |   4 +-
 .../src/statement/stmt_delete.rs              |   8 +-
 .../src/statement/stmt_for.rs                 |   8 +-
 .../src/statement/stmt_function_def.rs        |   4 +-
 .../src/statement/stmt_if.rs                  |   8 +-
 .../src/statement/stmt_import_from.rs         |   3 +-
 .../src/statement/stmt_match.rs               |   8 +-
 .../src/statement/stmt_try.rs                 |   6 +-
 .../src/statement/stmt_try_star.rs            |   1 +
 .../src/statement/stmt_while.rs               |   8 +-
 .../src/statement/stmt_with.rs                |   8 +-
 .../src/statement/suite.rs                    |  20 +-
 .../src/type_param/type_params.rs             |   8 +-
 39 files changed, 319 insertions(+), 387 deletions(-)
 create mode 100644 crates/ruff_python_formatter/src/statement/stmt_try_star.rs

diff --git a/crates/ruff_python_formatter/src/comments/map.rs b/crates/ruff_python_formatter/src/comments/map.rs
index 4b303caa05..7ef01dc736 100644
--- a/crates/ruff_python_formatter/src/comments/map.rs
+++ b/crates/ruff_python_formatter/src/comments/map.rs
@@ -249,11 +249,24 @@ impl MultiMap {
         self.index.get(key).is_some()
     }
 
-    /// Returns an iterator over the *leading*, *dangling*, and *trailing* parts of `key`.
-    pub(super) fn parts(&self, key: &K) -> PartsIterator {
+    /// Returns the *leading*, *dangling*, and *trailing* parts of `key`.
+    pub(super) fn leading_dangling_trailing(&self, key: &K) -> LeadingDanglingTrailing {
         match self.index.get(key) {
-            None => PartsIterator::Slice([].iter()),
-            Some(entry) => PartsIterator::from_entry(entry, self),
+            None => LeadingDanglingTrailing {
+                leading: &[],
+                dangling: &[],
+                trailing: &[],
+            },
+            Some(Entry::InOrder(entry)) => LeadingDanglingTrailing {
+                leading: &self.parts[entry.leading_range()],
+                dangling: &self.parts[entry.dangling_range()],
+                trailing: &self.parts[entry.trailing_range()],
+            },
+            Some(Entry::OutOfOrder(entry)) => LeadingDanglingTrailing {
+                leading: &self.out_of_order_parts[entry.leading_index()],
+                dangling: &self.out_of_order_parts[entry.dangling_index()],
+                trailing: &self.out_of_order_parts[entry.trailing_index()],
+            },
         }
     }
 
@@ -262,7 +275,7 @@ impl MultiMap {
     pub(super) fn all_parts(&self) -> impl Iterator {
         self.index
             .values()
-            .flat_map(|entry| PartsIterator::from_entry(entry, self))
+            .flat_map(|entry| LeadingDanglingTrailing::from_entry(entry, self))
     }
 }
 
@@ -281,41 +294,30 @@ where
         let mut builder = f.debug_map();
 
         for (key, entry) in &self.index {
-            builder.entry(&key, &DebugEntry { entry, map: self });
+            builder.entry(&key, &LeadingDanglingTrailing::from_entry(entry, self));
         }
 
         builder.finish()
     }
 }
 
-/// Iterates over all *leading*, *dangling*, and *trailing* parts of a key.
-pub(super) enum PartsIterator<'a, V> {
-    /// The slice into the [CommentsMap::parts] [Vec] if this is an in-order entry or the *trailing* parts
-    /// of an out-of-order entry.
-    Slice(std::slice::Iter<'a, V>),
-
-    /// Iterator over the *leading* parts of an out-of-order entry. Returns the *dangling* parts, and then the
-    /// *trailing* parts once the *leading* iterator is fully consumed.
-    Leading {
-        leading: std::slice::Iter<'a, V>,
-        dangling: &'a [V],
-        trailing: &'a [V],
-    },
-
-    /// Iterator over the *dangling* parts of an out-of-order entry. Returns the *trailing* parts
-    /// once the *leading* iterator is fully consumed.
-    Dangling {
-        dangling: std::slice::Iter<'a, V>,
-        trailing: &'a [V],
-    },
+#[derive(Clone)]
+pub(crate) struct LeadingDanglingTrailing<'a, T> {
+    pub(crate) leading: &'a [T],
+    pub(crate) dangling: &'a [T],
+    pub(crate) trailing: &'a [T],
 }
 
-impl<'a, V> PartsIterator<'a, V> {
-    fn from_entry(entry: &Entry, map: &'a MultiMap) -> Self {
+impl<'a, T> LeadingDanglingTrailing<'a, T> {
+    fn from_entry(entry: &Entry, map: &'a MultiMap) -> Self {
         match entry {
-            Entry::InOrder(entry) => PartsIterator::Slice(map.parts[entry.range()].iter()),
-            Entry::OutOfOrder(entry) => PartsIterator::Leading {
-                leading: map.out_of_order_parts[entry.leading_index()].iter(),
+            Entry::InOrder(entry) => LeadingDanglingTrailing {
+                leading: &map.parts[entry.leading_range()],
+                dangling: &map.parts[entry.dangling_range()],
+                trailing: &map.parts[entry.trailing_range()],
+            },
+            Entry::OutOfOrder(entry) => LeadingDanglingTrailing {
+                leading: &map.out_of_order_parts[entry.leading_index()],
                 dangling: &map.out_of_order_parts[entry.dangling_index()],
                 trailing: &map.out_of_order_parts[entry.trailing_index()],
             },
@@ -323,203 +325,35 @@ impl<'a, V> PartsIterator<'a, V> {
     }
 }
 
-impl<'a, V> Iterator for PartsIterator<'a, V> {
-    type Item = &'a V;
+impl<'a, T> IntoIterator for LeadingDanglingTrailing<'a, T> {
+    type Item = &'a T;
+    type IntoIter = std::iter::Chain<
+        std::iter::Chain, std::slice::Iter<'a, T>>,
+        std::slice::Iter<'a, T>,
+    >;
 
-    fn next(&mut self) -> Option {
-        match self {
-            PartsIterator::Slice(inner) => inner.next(),
-
-            PartsIterator::Leading {
-                leading,
-                dangling,
-                trailing,
-            } => match leading.next() {
-                Some(next) => Some(next),
-                None if !dangling.is_empty() => {
-                    let mut dangling_iterator = dangling.iter();
-                    let next = dangling_iterator.next().unwrap();
-                    *self = PartsIterator::Dangling {
-                        dangling: dangling_iterator,
-                        trailing,
-                    };
-                    Some(next)
-                }
-                None => {
-                    let mut trailing_iterator = trailing.iter();
-                    let next = trailing_iterator.next();
-                    *self = PartsIterator::Slice(trailing_iterator);
-                    next
-                }
-            },
-
-            PartsIterator::Dangling { dangling, trailing } => dangling.next().or_else(|| {
-                let mut trailing_iterator = trailing.iter();
-                let next = trailing_iterator.next();
-                *self = PartsIterator::Slice(trailing_iterator);
-                next
-            }),
-        }
-    }
-
-    fn fold(self, init: B, f: F) -> B
-    where
-        F: FnMut(B, Self::Item) -> B,
-    {
-        match self {
-            PartsIterator::Slice(slice) => slice.fold(init, f),
-            PartsIterator::Leading {
-                leading,
-                dangling,
-                trailing,
-            } => leading
-                .chain(dangling.iter())
-                .chain(trailing.iter())
-                .fold(init, f),
-            PartsIterator::Dangling { dangling, trailing } => {
-                dangling.chain(trailing.iter()).fold(init, f)
-            }
-        }
-    }
-
-    fn all(&mut self, f: F) -> bool
-    where
-        F: FnMut(Self::Item) -> bool,
-    {
-        match self {
-            PartsIterator::Slice(slice) => slice.all(f),
-            PartsIterator::Leading {
-                leading,
-                dangling,
-                trailing,
-            } => leading.chain(dangling.iter()).chain(trailing.iter()).all(f),
-            PartsIterator::Dangling { dangling, trailing } => {
-                dangling.chain(trailing.iter()).all(f)
-            }
-        }
-    }
-
-    fn any(&mut self, f: F) -> bool
-    where
-        F: FnMut(Self::Item) -> bool,
-    {
-        match self {
-            PartsIterator::Slice(slice) => slice.any(f),
-            PartsIterator::Leading {
-                leading,
-                dangling,
-                trailing,
-            } => leading.chain(dangling.iter()).chain(trailing.iter()).any(f),
-            PartsIterator::Dangling { dangling, trailing } => {
-                dangling.chain(trailing.iter()).any(f)
-            }
-        }
-    }
-
-    fn find

(&mut self, predicate: P) -> Option - where - P: FnMut(&Self::Item) -> bool, - { - match self { - PartsIterator::Slice(slice) => slice.find(predicate), - PartsIterator::Leading { - leading, - dangling, - trailing, - } => leading - .chain(dangling.iter()) - .chain(trailing.iter()) - .find(predicate), - PartsIterator::Dangling { dangling, trailing } => { - dangling.chain(trailing.iter()).find(predicate) - } - } - } - - fn find_map(&mut self, f: F) -> Option - where - F: FnMut(Self::Item) -> Option, - { - match self { - PartsIterator::Slice(slice) => slice.find_map(f), - PartsIterator::Leading { - leading, - dangling, - trailing, - } => leading - .chain(dangling.iter()) - .chain(trailing.iter()) - .find_map(f), - PartsIterator::Dangling { dangling, trailing } => { - dangling.chain(trailing.iter()).find_map(f) - } - } - } - - fn position

(&mut self, predicate: P) -> Option - where - P: FnMut(Self::Item) -> bool, - { - match self { - PartsIterator::Slice(slice) => slice.position(predicate), - PartsIterator::Leading { - leading, - dangling, - trailing, - } => leading - .chain(dangling.iter()) - .chain(trailing.iter()) - .position(predicate), - PartsIterator::Dangling { dangling, trailing } => { - dangling.chain(trailing.iter()).position(predicate) - } - } - } - - fn size_hint(&self) -> (usize, Option) { - match self { - PartsIterator::Slice(slice) => slice.size_hint(), - PartsIterator::Leading { - leading, - dangling, - trailing, - } => { - let len = leading.len() + dangling.len() + trailing.len(); - - (len, Some(len)) - } - PartsIterator::Dangling { dangling, trailing } => { - let len = dangling.len() + trailing.len(); - (len, Some(len)) - } - } - } - - fn count(self) -> usize { - self.size_hint().0 - } - - fn last(self) -> Option { - match self { - PartsIterator::Slice(slice) => slice.last(), - PartsIterator::Leading { - leading, - dangling, - trailing, - } => trailing - .last() - .or_else(|| dangling.last()) - .or_else(|| leading.last()), - PartsIterator::Dangling { dangling, trailing } => { - trailing.last().or_else(|| dangling.last()) - } - } + fn into_iter(self) -> Self::IntoIter { + self.leading + .iter() + .chain(self.dangling) + .chain(self.trailing) } } -impl ExactSizeIterator for PartsIterator<'_, V> {} +impl<'a, T> Debug for LeadingDanglingTrailing<'a, T> +where + T: Debug, +{ + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let mut list = f.debug_list(); -impl FusedIterator for PartsIterator<'_, V> {} + list.entries(self.leading.iter().map(DebugValue::Leading)); + list.entries(self.dangling.iter().map(DebugValue::Dangling)); + list.entries(self.trailing.iter().map(DebugValue::Trailing)); + + list.finish() + } +} #[derive(Clone, Debug)] enum Entry { @@ -527,48 +361,6 @@ enum Entry { OutOfOrder(OutOfOrderEntry), } -struct DebugEntry<'a, K, V> { - entry: &'a Entry, - map: &'a MultiMap, -} - -impl Debug for DebugEntry<'_, K, V> -where - K: Debug, - V: Debug, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - let leading = match self.entry { - Entry::OutOfOrder(entry) => { - self.map.out_of_order_parts[entry.leading_index()].as_slice() - } - Entry::InOrder(entry) => &self.map.parts[entry.leading_range()], - }; - - let dangling = match self.entry { - Entry::OutOfOrder(entry) => { - self.map.out_of_order_parts[entry.dangling_index()].as_slice() - } - Entry::InOrder(entry) => &self.map.parts[entry.dangling_range()], - }; - - let trailing = match self.entry { - Entry::OutOfOrder(entry) => { - self.map.out_of_order_parts[entry.trailing_index()].as_slice() - } - Entry::InOrder(entry) => &self.map.parts[entry.trailing_range()], - }; - - let mut list = f.debug_list(); - - list.entries(leading.iter().map(DebugValue::Leading)); - list.entries(dangling.iter().map(DebugValue::Dangling)); - list.entries(trailing.iter().map(DebugValue::Trailing)); - - list.finish() - } -} - enum DebugValue<'a, V> { Leading(&'a V), Dangling(&'a V), @@ -811,7 +603,10 @@ mod tests { assert!(map.has(&"a")); assert_eq!( - map.parts(&"a").copied().collect::>(), + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), vec![1, 2, 3, 4] ); } @@ -832,7 +627,13 @@ mod tests { assert!(map.has(&"a")); - assert_eq!(map.parts(&"a").copied().collect::>(), vec![1, 2, 3]); + assert_eq!( + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), + vec![1, 2, 3] + ); } #[test] @@ -850,7 +651,13 @@ mod tests { assert!(map.has(&"a")); - assert_eq!(map.parts(&"a").copied().collect::>(), vec![1, 2]); + assert_eq!( + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), + vec![1, 2] + ); } #[test] @@ -866,7 +673,10 @@ mod tests { assert!(!map.has(&"a")); assert_eq!( - map.parts(&"a").copied().collect::>(), + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), Vec::::new() ); } @@ -887,22 +697,46 @@ mod tests { assert_eq!(map.leading(&"a"), &[1]); assert_eq!(map.dangling(&"a"), &EMPTY); assert_eq!(map.trailing(&"a"), &EMPTY); - assert_eq!(map.parts(&"a").copied().collect::>(), vec![1]); + assert_eq!( + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), + vec![1] + ); assert_eq!(map.leading(&"b"), &EMPTY); assert_eq!(map.dangling(&"b"), &[2]); assert_eq!(map.trailing(&"b"), &EMPTY); - assert_eq!(map.parts(&"b").copied().collect::>(), vec![2]); + assert_eq!( + map.leading_dangling_trailing(&"b") + .into_iter() + .copied() + .collect::>(), + vec![2] + ); assert_eq!(map.leading(&"c"), &EMPTY); assert_eq!(map.dangling(&"c"), &EMPTY); assert_eq!(map.trailing(&"c"), &[3]); - assert_eq!(map.parts(&"c").copied().collect::>(), vec![3]); + assert_eq!( + map.leading_dangling_trailing(&"c") + .into_iter() + .copied() + .collect::>(), + vec![3] + ); assert_eq!(map.leading(&"d"), &[4]); assert_eq!(map.dangling(&"d"), &[5]); assert_eq!(map.trailing(&"d"), &[6]); - assert_eq!(map.parts(&"d").copied().collect::>(), vec![4, 5, 6]); + assert_eq!( + map.leading_dangling_trailing(&"d") + .into_iter() + .copied() + .collect::>(), + vec![4, 5, 6] + ); } #[test] @@ -919,7 +753,10 @@ mod tests { assert_eq!(map.trailing(&"a"), [4]); assert_eq!( - map.parts(&"a").copied().collect::>(), + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), vec![2, 1, 3, 4] ); @@ -940,7 +777,10 @@ mod tests { assert_eq!(map.trailing(&"a"), [1, 4]); assert_eq!( - map.parts(&"a").copied().collect::>(), + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), vec![2, 3, 1, 4] ); @@ -959,7 +799,13 @@ mod tests { assert_eq!(map.dangling(&"a"), &[2]); assert_eq!(map.trailing(&"a"), &[1, 3]); - assert_eq!(map.parts(&"a").copied().collect::>(), vec![2, 1, 3]); + assert_eq!( + map.leading_dangling_trailing(&"a") + .into_iter() + .copied() + .collect::>(), + vec![2, 1, 3] + ); assert!(map.has(&"a")); } diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs index 8b1a108f7a..e1b144b151 100644 --- a/crates/ruff_python_formatter/src/comments/mod.rs +++ b/crates/ruff_python_formatter/src/comments/mod.rs @@ -106,7 +106,7 @@ use ruff_python_index::CommentRanges; use ruff_python_trivia::PythonWhitespace; use crate::comments::debug::{DebugComment, DebugComments}; -use crate::comments::map::MultiMap; +use crate::comments::map::{LeadingDanglingTrailing, MultiMap}; use crate::comments::node_key::NodeRefEqualityKey; use crate::comments::visitor::CommentsVisitor; @@ -405,13 +405,13 @@ impl<'a> Comments<'a> { pub(crate) fn leading_dangling_trailing_comments( &self, node: T, - ) -> impl Iterator + ) -> LeadingDanglingTrailingComments where T: Into>, { self.data .comments - .parts(&NodeRefEqualityKey::from_ref(node.into())) + .leading_dangling_trailing(&NodeRefEqualityKey::from_ref(node.into())) } #[inline(always)] @@ -464,6 +464,8 @@ impl<'a> Comments<'a> { } } +pub(crate) type LeadingDanglingTrailingComments<'a> = LeadingDanglingTrailing<'a, SourceComment>; + #[derive(Debug, Default)] struct CommentsData<'a> { comments: CommentsMap<'a>, diff --git a/crates/ruff_python_formatter/src/expression/expr_attribute.rs b/crates/ruff_python_formatter/src/expression/expr_attribute.rs index aef904218d..a0a66494a1 100644 --- a/crates/ruff_python_formatter/src/expression/expr_attribute.rs +++ b/crates/ruff_python_formatter/src/expression/expr_attribute.rs @@ -2,7 +2,7 @@ use ruff_formatter::{write, FormatRuleWithOptions}; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{Constant, Expr, ExprAttribute, ExprConstant}; -use crate::comments::{leading_comments, trailing_comments}; +use crate::comments::{leading_comments, trailing_comments, SourceComment}; use crate::expression::parentheses::{ is_expression_parenthesized, NeedsParentheses, OptionalParentheses, Parentheses, }; @@ -150,7 +150,7 @@ impl FormatNodeRule for FormatExprAttribute { fn fmt_dangling_comments( &self, - _node: &ExprAttribute, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // handle in `fmt_fields` diff --git a/crates/ruff_python_formatter/src/expression/expr_bin_op.rs b/crates/ruff_python_formatter/src/expression/expr_bin_op.rs index 175db909ca..26071e293d 100644 --- a/crates/ruff_python_formatter/src/expression/expr_bin_op.rs +++ b/crates/ruff_python_formatter/src/expression/expr_bin_op.rs @@ -9,7 +9,7 @@ use smallvec::SmallVec; use ruff_formatter::{format_args, write, FormatOwnedWithRule, FormatRefWithRule}; use ruff_python_ast::node::{AnyNodeRef, AstNode}; -use crate::comments::{trailing_comments, trailing_node_comments}; +use crate::comments::{trailing_comments, trailing_node_comments, SourceComment}; use crate::expression::expr_constant::ExprConstantLayout; use crate::expression::parentheses::{ in_parentheses_only_group, in_parentheses_only_soft_line_break, @@ -147,7 +147,11 @@ impl FormatNodeRule for FormatExprBinOp { } } - fn fmt_dangling_comments(&self, _node: &ExprBinOp, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled inside of `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_bool_op.rs b/crates/ruff_python_formatter/src/expression/expr_bool_op.rs index 1717bdc262..9449c6662a 100644 --- a/crates/ruff_python_formatter/src/expression/expr_bool_op.rs +++ b/crates/ruff_python_formatter/src/expression/expr_bool_op.rs @@ -1,7 +1,7 @@ use crate::comments::leading_comments; use crate::expression::parentheses::{ in_parentheses_only_group, in_parentheses_only_soft_line_break_or_space, NeedsParentheses, - OptionalParentheses, Parentheses, + OptionalParentheses, }; use crate::prelude::*; use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions}; @@ -12,20 +12,20 @@ use super::parentheses::is_expression_parenthesized; #[derive(Default)] pub struct FormatExprBoolOp { - parentheses: Option, - chained: bool, + layout: BoolOpLayout, } -pub struct BoolOpLayout { - pub(crate) parentheses: Option, - pub(crate) chained: bool, +#[derive(Default, Copy, Clone)] +pub enum BoolOpLayout { + #[default] + Default, + Chained, } impl FormatRuleWithOptions> for FormatExprBoolOp { type Options = BoolOpLayout; fn with_options(mut self, options: Self::Options) -> Self { - self.parentheses = options.parentheses; - self.chained = options.chained; + self.layout = options; self } } @@ -68,7 +68,7 @@ impl FormatNodeRule for FormatExprBoolOp { Ok(()) }); - if self.chained { + if matches!(self.layout, BoolOpLayout::Chained) { // Chained boolean operations should not be given a new group inner.fmt(f) } else { @@ -101,13 +101,7 @@ impl Format> for FormatValue<'_> { ) => { // Mark chained boolean operations e.g. `x and y or z` and avoid creating a new group - write!( - f, - [bool_op.format().with_options(BoolOpLayout { - parentheses: None, - chained: true, - })] - ) + write!(f, [bool_op.format().with_options(BoolOpLayout::Chained)]) } _ => write!(f, [in_parentheses_only_group(&self.value.format())]), } diff --git a/crates/ruff_python_formatter/src/expression/expr_compare.rs b/crates/ruff_python_formatter/src/expression/expr_compare.rs index 07c85526cf..9e7bf38978 100644 --- a/crates/ruff_python_formatter/src/expression/expr_compare.rs +++ b/crates/ruff_python_formatter/src/expression/expr_compare.rs @@ -1,27 +1,16 @@ -use crate::comments::leading_comments; +use crate::comments::{leading_comments, SourceComment}; use crate::expression::parentheses::{ in_parentheses_only_group, in_parentheses_only_soft_line_break_or_space, NeedsParentheses, - OptionalParentheses, Parentheses, + OptionalParentheses, }; use crate::prelude::*; use crate::FormatNodeRule; -use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule, FormatRuleWithOptions}; +use ruff_formatter::{write, FormatOwnedWithRule, FormatRefWithRule}; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{CmpOp, ExprCompare}; #[derive(Default)] -pub struct FormatExprCompare { - parentheses: Option, -} - -impl FormatRuleWithOptions> for FormatExprCompare { - type Options = Option; - - fn with_options(mut self, options: Self::Options) -> Self { - self.parentheses = options; - self - } -} +pub struct FormatExprCompare; impl FormatNodeRule for FormatExprCompare { fn fmt_fields(&self, item: &ExprCompare, f: &mut PyFormatter) -> FormatResult<()> { @@ -70,7 +59,11 @@ impl FormatNodeRule for FormatExprCompare { in_parentheses_only_group(&inner).fmt(f) } - fn fmt_dangling_comments(&self, _node: &ExprCompare, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Node can not have dangling comments Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_constant.rs b/crates/ruff_python_formatter/src/expression/expr_constant.rs index 58e8b48e58..64cfb8cd4c 100644 --- a/crates/ruff_python_formatter/src/expression/expr_constant.rs +++ b/crates/ruff_python_formatter/src/expression/expr_constant.rs @@ -1,3 +1,4 @@ +use crate::comments::SourceComment; use ruff_formatter::FormatRuleWithOptions; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{Constant, ExprConstant, Ranged}; @@ -65,7 +66,7 @@ impl FormatNodeRule for FormatExprConstant { fn fmt_dangling_comments( &self, - _node: &ExprConstant, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { Ok(()) diff --git a/crates/ruff_python_formatter/src/expression/expr_dict.rs b/crates/ruff_python_formatter/src/expression/expr_dict.rs index 39fae66527..659354cddd 100644 --- a/crates/ruff_python_formatter/src/expression/expr_dict.rs +++ b/crates/ruff_python_formatter/src/expression/expr_dict.rs @@ -4,7 +4,7 @@ use ruff_python_ast::Ranged; use ruff_python_ast::{Expr, ExprDict}; use ruff_text_size::TextRange; -use crate::comments::leading_comments; +use crate::comments::{leading_comments, SourceComment}; use crate::expression::parentheses::{ empty_parenthesized, parenthesized, NeedsParentheses, OptionalParentheses, }; @@ -89,7 +89,11 @@ impl FormatNodeRule for FormatExprDict { .fmt(f) } - fn fmt_dangling_comments(&self, _node: &ExprDict, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled by `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs b/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs index f99773fabc..5181ce090f 100644 --- a/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs @@ -2,7 +2,7 @@ use ruff_formatter::{format_args, write, Buffer, FormatResult, FormatRuleWithOpt use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprGeneratorExp; -use crate::comments::leading_comments; +use crate::comments::{leading_comments, SourceComment}; use crate::context::PyFormatContext; use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; @@ -81,7 +81,7 @@ impl FormatNodeRule for FormatExprGeneratorExp { fn fmt_dangling_comments( &self, - _node: &ExprGeneratorExp, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // Handled as part of `fmt_fields` diff --git a/crates/ruff_python_formatter/src/expression/expr_lambda.rs b/crates/ruff_python_formatter/src/expression/expr_lambda.rs index c8a23a18f0..d663084f39 100644 --- a/crates/ruff_python_formatter/src/expression/expr_lambda.rs +++ b/crates/ruff_python_formatter/src/expression/expr_lambda.rs @@ -1,4 +1,4 @@ -use crate::comments::dangling_node_comments; +use crate::comments::{dangling_node_comments, SourceComment}; use crate::context::PyFormatContext; use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses}; use crate::other::parameters::ParametersParentheses; @@ -55,7 +55,11 @@ impl FormatNodeRule for FormatExprLambda { ) } - fn fmt_dangling_comments(&self, _node: &ExprLambda, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Override. Dangling comments are handled in `fmt_fields`. Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_list.rs b/crates/ruff_python_formatter/src/expression/expr_list.rs index 7c91b4ef36..1b5a93b7c4 100644 --- a/crates/ruff_python_formatter/src/expression/expr_list.rs +++ b/crates/ruff_python_formatter/src/expression/expr_list.rs @@ -1,3 +1,4 @@ +use crate::comments::SourceComment; use ruff_formatter::prelude::format_with; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{ExprList, Ranged}; @@ -37,7 +38,11 @@ impl FormatNodeRule for FormatExprList { .fmt(f) } - fn fmt_dangling_comments(&self, _node: &ExprList, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled as part of `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_list_comp.rs b/crates/ruff_python_formatter/src/expression/expr_list_comp.rs index a5476e4b82..54db366d12 100644 --- a/crates/ruff_python_formatter/src/expression/expr_list_comp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_list_comp.rs @@ -2,6 +2,7 @@ use ruff_formatter::{format_args, write, FormatResult}; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprListComp; +use crate::comments::SourceComment; use crate::context::PyFormatContext; use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; @@ -45,7 +46,7 @@ impl FormatNodeRule for FormatExprListComp { fn fmt_dangling_comments( &self, - _node: &ExprListComp, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // Handled as part of `fmt_fields` diff --git a/crates/ruff_python_formatter/src/expression/expr_name.rs b/crates/ruff_python_formatter/src/expression/expr_name.rs index 99d5374498..a2aef80593 100644 --- a/crates/ruff_python_formatter/src/expression/expr_name.rs +++ b/crates/ruff_python_formatter/src/expression/expr_name.rs @@ -1,3 +1,4 @@ +use crate::comments::SourceComment; use crate::expression::parentheses::{NeedsParentheses, OptionalParentheses}; use crate::prelude::*; use crate::FormatNodeRule; @@ -23,7 +24,11 @@ impl FormatNodeRule for FormatExprName { write!(f, [source_text_slice(*range, ContainsNewlines::No)]) } - fn fmt_dangling_comments(&self, _node: &ExprName, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Node cannot have dangling comments Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_set.rs b/crates/ruff_python_formatter/src/expression/expr_set.rs index 4259be8049..cccb7ea0e6 100644 --- a/crates/ruff_python_formatter/src/expression/expr_set.rs +++ b/crates/ruff_python_formatter/src/expression/expr_set.rs @@ -1,3 +1,4 @@ +use crate::comments::SourceComment; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::{ExprSet, Ranged}; @@ -28,7 +29,11 @@ impl FormatNodeRule for FormatExprSet { .fmt(f) } - fn fmt_dangling_comments(&self, _node: &ExprSet, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled as part of `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_set_comp.rs b/crates/ruff_python_formatter/src/expression/expr_set_comp.rs index 5e3247a249..126b0a7038 100644 --- a/crates/ruff_python_formatter/src/expression/expr_set_comp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_set_comp.rs @@ -2,6 +2,7 @@ use ruff_formatter::{format_args, write, Buffer, FormatResult}; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprSetComp; +use crate::comments::SourceComment; use crate::context::PyFormatContext; use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; @@ -43,7 +44,11 @@ impl FormatNodeRule for FormatExprSetComp { ) } - fn fmt_dangling_comments(&self, _node: &ExprSetComp, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled as part of `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/expr_starred.rs b/crates/ruff_python_formatter/src/expression/expr_starred.rs index 6f3e7723f3..1f63e00f52 100644 --- a/crates/ruff_python_formatter/src/expression/expr_starred.rs +++ b/crates/ruff_python_formatter/src/expression/expr_starred.rs @@ -1,5 +1,6 @@ use ruff_python_ast::ExprStarred; +use crate::comments::SourceComment; use ruff_formatter::write; use ruff_python_ast::node::AnyNodeRef; @@ -22,9 +23,11 @@ impl FormatNodeRule for FormatExprStarred { write!(f, [text("*"), value.format()]) } - fn fmt_dangling_comments(&self, node: &ExprStarred, f: &mut PyFormatter) -> FormatResult<()> { - debug_assert_eq!(f.context().comments().dangling_comments(node), []); - + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { Ok(()) } } diff --git a/crates/ruff_python_formatter/src/expression/expr_subscript.rs b/crates/ruff_python_formatter/src/expression/expr_subscript.rs index 1a2304801d..fbee7bd7f5 100644 --- a/crates/ruff_python_formatter/src/expression/expr_subscript.rs +++ b/crates/ruff_python_formatter/src/expression/expr_subscript.rs @@ -2,7 +2,7 @@ use ruff_formatter::{format_args, write, FormatRuleWithOptions}; use ruff_python_ast::node::{AnyNodeRef, AstNode}; use ruff_python_ast::{Expr, ExprSubscript}; -use crate::comments::trailing_comments; +use crate::comments::{trailing_comments, SourceComment}; use crate::context::PyFormatContext; use crate::context::{NodeLevel, WithNodeLevel}; use crate::expression::expr_tuple::TupleParentheses; @@ -81,7 +81,7 @@ impl FormatNodeRule for FormatExprSubscript { fn fmt_dangling_comments( &self, - _node: &ExprSubscript, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // Handled inside of `fmt_fields` diff --git a/crates/ruff_python_formatter/src/expression/expr_tuple.rs b/crates/ruff_python_formatter/src/expression/expr_tuple.rs index df1d2db7ce..b062261762 100644 --- a/crates/ruff_python_formatter/src/expression/expr_tuple.rs +++ b/crates/ruff_python_formatter/src/expression/expr_tuple.rs @@ -5,6 +5,7 @@ use ruff_python_ast::{Expr, Ranged}; use ruff_text_size::TextRange; use crate::builders::parenthesize_if_expands; +use crate::comments::SourceComment; use crate::expression::parentheses::{ empty_parenthesized, parenthesized, NeedsParentheses, OptionalParentheses, }; @@ -162,7 +163,11 @@ impl FormatNodeRule for FormatExprTuple { } } - fn fmt_dangling_comments(&self, _node: &ExprTuple, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index d5f867f8fc..97c5535985 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -16,8 +16,6 @@ use crate::expression::parentheses::{ }; use crate::prelude::*; -use self::expr_bool_op::BoolOpLayout; - pub(crate) mod expr_attribute; pub(crate) mod expr_await; pub(crate) mod expr_bin_op; @@ -69,13 +67,7 @@ impl FormatRule> for FormatExpr { let parentheses = self.parentheses; let format_expr = format_with(|f| match expression { - Expr::BoolOp(expr) => expr - .format() - .with_options(BoolOpLayout { - parentheses: Some(parentheses), - chained: false, - }) - .fmt(f), + Expr::BoolOp(expr) => expr.format().fmt(f), Expr::NamedExpr(expr) => expr.format().fmt(f), Expr::BinOp(expr) => expr.format().fmt(f), Expr::UnaryOp(expr) => expr.format().fmt(f), @@ -90,7 +82,7 @@ impl FormatRule> for FormatExpr { Expr::Await(expr) => expr.format().fmt(f), Expr::Yield(expr) => expr.format().fmt(f), Expr::YieldFrom(expr) => expr.format().fmt(f), - Expr::Compare(expr) => expr.format().with_options(Some(parentheses)).fmt(f), + Expr::Compare(expr) => expr.format().fmt(f), Expr::Call(expr) => expr.format().fmt(f), Expr::FormattedValue(expr) => expr.format().fmt(f), Expr::FString(expr) => expr.format().fmt(f), diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs index 6c124f7d90..68f26b1d7b 100644 --- a/crates/ruff_python_formatter/src/lib.rs +++ b/crates/ruff_python_formatter/src/lib.rs @@ -15,7 +15,7 @@ use ruff_source_file::Locator; use ruff_text_size::TextLen; use crate::comments::{ - dangling_node_comments, leading_node_comments, trailing_node_comments, Comments, + dangling_comments, leading_comments, trailing_comments, Comments, SourceComment, }; use crate::context::PyFormatContext; pub use crate::options::{MagicTrailingComma, PyFormatOptions, QuoteStyle}; @@ -46,10 +46,14 @@ where N: AstNode, { fn fmt(&self, node: &N, f: &mut PyFormatter) -> FormatResult<()> { - leading_node_comments(node).fmt(f)?; + let comments = f.context().comments().clone(); + + let node_comments = comments.leading_dangling_trailing_comments(node.as_any_node_ref()); + + leading_comments(node_comments.leading).fmt(f)?; self.fmt_node(node, f)?; - self.fmt_dangling_comments(node, f)?; - trailing_node_comments(node).fmt(f) + self.fmt_dangling_comments(node_comments.dangling, f)?; + trailing_comments(node_comments.trailing).fmt(f) } /// Formats the node without comments. Ignores any suppression comments. @@ -69,8 +73,12 @@ where /// no comments are dropped. /// /// A node can have dangling comments if all its children are tokens or if all node children are optional. - fn fmt_dangling_comments(&self, node: &N, f: &mut PyFormatter) -> FormatResult<()> { - dangling_node_comments(node).fmt(f) + fn fmt_dangling_comments( + &self, + dangling_node_comments: &[SourceComment], + f: &mut PyFormatter, + ) -> FormatResult<()> { + dangling_comments(dangling_node_comments).fmt(f) } } diff --git a/crates/ruff_python_formatter/src/other/arguments.rs b/crates/ruff_python_formatter/src/other/arguments.rs index 6810397b65..40cece7d9e 100644 --- a/crates/ruff_python_formatter/src/other/arguments.rs +++ b/crates/ruff_python_formatter/src/other/arguments.rs @@ -1,3 +1,4 @@ +use crate::comments::SourceComment; use ruff_formatter::write; use ruff_python_ast::node::AstNode; use ruff_python_ast::{Arguments, Expr, Ranged}; @@ -99,7 +100,11 @@ impl FormatNodeRule for FormatArguments { ) } - fn fmt_dangling_comments(&self, _node: &Arguments, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/other/comprehension.rs b/crates/ruff_python_formatter/src/other/comprehension.rs index 8654a67f87..951e6f71cb 100644 --- a/crates/ruff_python_formatter/src/other/comprehension.rs +++ b/crates/ruff_python_formatter/src/other/comprehension.rs @@ -1,4 +1,4 @@ -use crate::comments::{leading_comments, trailing_comments}; +use crate::comments::{leading_comments, trailing_comments, SourceComment}; use crate::expression::expr_tuple::TupleParentheses; use crate::prelude::*; use crate::AsFormat; @@ -98,7 +98,7 @@ impl FormatNodeRule for FormatComprehension { fn fmt_dangling_comments( &self, - _node: &Comprehension, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // dangling comments are formatted as part of fmt_fields diff --git a/crates/ruff_python_formatter/src/other/except_handler_except_handler.rs b/crates/ruff_python_formatter/src/other/except_handler_except_handler.rs index 052710e7c2..2f3524ba23 100644 --- a/crates/ruff_python_formatter/src/other/except_handler_except_handler.rs +++ b/crates/ruff_python_formatter/src/other/except_handler_except_handler.rs @@ -1,4 +1,4 @@ -use crate::comments::trailing_comments; +use crate::comments::{trailing_comments, SourceComment}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; use crate::prelude::*; @@ -81,7 +81,7 @@ impl FormatNodeRule for FormatExceptHandlerExceptHan fn fmt_dangling_comments( &self, - _node: &ExceptHandlerExceptHandler, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // dangling comments are formatted as part of fmt_fields diff --git a/crates/ruff_python_formatter/src/other/match_case.rs b/crates/ruff_python_formatter/src/other/match_case.rs index bd3050af0e..dcbcbcce87 100644 --- a/crates/ruff_python_formatter/src/other/match_case.rs +++ b/crates/ruff_python_formatter/src/other/match_case.rs @@ -1,7 +1,7 @@ use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::MatchCase; -use crate::comments::trailing_comments; +use crate::comments::{trailing_comments, SourceComment}; use crate::not_yet_implemented_custom_text; use crate::prelude::*; use crate::{FormatNodeRule, PyFormatter}; @@ -54,7 +54,11 @@ impl FormatNodeRule for FormatMatchCase { ) } - fn fmt_dangling_comments(&self, _node: &MatchCase, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled as part of `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/other/parameters.rs b/crates/ruff_python_formatter/src/other/parameters.rs index 34696fbe52..3c10c8049f 100644 --- a/crates/ruff_python_formatter/src/other/parameters.rs +++ b/crates/ruff_python_formatter/src/other/parameters.rs @@ -262,7 +262,11 @@ impl FormatNodeRule for FormatParameters { } } - fn fmt_dangling_comments(&self, _node: &Parameters, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/other/with_item.rs b/crates/ruff_python_formatter/src/other/with_item.rs index 49fd36393a..2bd2d90ba8 100644 --- a/crates/ruff_python_formatter/src/other/with_item.rs +++ b/crates/ruff_python_formatter/src/other/with_item.rs @@ -2,7 +2,7 @@ use ruff_python_ast::WithItem; use ruff_formatter::{write, Buffer, FormatResult}; -use crate::comments::{leading_comments, trailing_comments}; +use crate::comments::{leading_comments, trailing_comments, SourceComment}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; use crate::prelude::*; @@ -47,7 +47,11 @@ impl FormatNodeRule for FormatWithItem { Ok(()) } - fn fmt_dangling_comments(&self, _node: &WithItem, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { Ok(()) } } diff --git a/crates/ruff_python_formatter/src/statement/stmt_class_def.rs b/crates/ruff_python_formatter/src/statement/stmt_class_def.rs index 56dce4a0c6..9a908b9593 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_class_def.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_class_def.rs @@ -2,7 +2,7 @@ use ruff_formatter::{write, Buffer}; use ruff_python_ast::{Ranged, StmtClassDef}; use ruff_python_trivia::lines_after_ignoring_trivia; -use crate::comments::{leading_comments, trailing_comments}; +use crate::comments::{leading_comments, trailing_comments, SourceComment}; use crate::prelude::*; use crate::statement::suite::SuiteKind; use crate::FormatNodeRule; @@ -129,7 +129,7 @@ impl FormatNodeRule for FormatStmtClassDef { fn fmt_dangling_comments( &self, - _node: &StmtClassDef, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // handled in fmt_fields diff --git a/crates/ruff_python_formatter/src/statement/stmt_delete.rs b/crates/ruff_python_formatter/src/statement/stmt_delete.rs index 02dd1f97b1..77592c732e 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_delete.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_delete.rs @@ -1,5 +1,5 @@ use crate::builders::{parenthesize_if_expands, PyFormatterExtensions}; -use crate::comments::dangling_node_comments; +use crate::comments::{dangling_node_comments, SourceComment}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; use crate::{FormatNodeRule, PyFormatter}; @@ -53,7 +53,11 @@ impl FormatNodeRule for FormatStmtDelete { } } - fn fmt_dangling_comments(&self, _node: &StmtDelete, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/statement/stmt_for.rs b/crates/ruff_python_formatter/src/statement/stmt_for.rs index e9cac17d23..bc2bbf3a67 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_for.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_for.rs @@ -1,7 +1,7 @@ use ruff_formatter::{format_args, write, Buffer, FormatResult}; use ruff_python_ast::{Expr, Ranged, Stmt, StmtFor}; -use crate::comments::{leading_alternate_branch_comments, trailing_comments}; +use crate::comments::{leading_alternate_branch_comments, trailing_comments, SourceComment}; use crate::expression::expr_tuple::TupleParentheses; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; @@ -86,7 +86,11 @@ impl FormatNodeRule for FormatStmtFor { Ok(()) } - fn fmt_dangling_comments(&self, _node: &StmtFor, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs index fcf4a0f603..b5ce2e4d45 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs @@ -2,7 +2,7 @@ use ruff_formatter::write; use ruff_python_ast::{Parameters, Ranged, StmtFunctionDef}; use ruff_python_trivia::{lines_after_ignoring_trivia, SimpleTokenKind, SimpleTokenizer}; -use crate::comments::{leading_comments, trailing_comments}; +use crate::comments::{leading_comments, trailing_comments, SourceComment}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::{Parentheses, Parenthesize}; use crate::prelude::*; @@ -147,7 +147,7 @@ impl FormatNodeRule for FormatStmtFunctionDef { fn fmt_dangling_comments( &self, - _node: &StmtFunctionDef, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // Handled in `fmt_fields` diff --git a/crates/ruff_python_formatter/src/statement/stmt_if.rs b/crates/ruff_python_formatter/src/statement/stmt_if.rs index 7eb8652fc0..35596b3c32 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_if.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_if.rs @@ -1,4 +1,4 @@ -use crate::comments::{leading_alternate_branch_comments, trailing_comments}; +use crate::comments::{leading_alternate_branch_comments, trailing_comments, SourceComment}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; use crate::prelude::*; @@ -43,7 +43,11 @@ impl FormatNodeRule for FormatStmtIf { Ok(()) } - fn fmt_dangling_comments(&self, _node: &StmtIf, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled by `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/statement/stmt_import_from.rs b/crates/ruff_python_formatter/src/statement/stmt_import_from.rs index 433293cfa9..ab7ffd9b9a 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_import_from.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_import_from.rs @@ -4,6 +4,7 @@ use ruff_python_ast::node::AstNode; use ruff_python_ast::{Ranged, StmtImportFrom}; use crate::builders::{parenthesize_if_expands, PyFormatterExtensions, TrailingComma}; +use crate::comments::SourceComment; use crate::expression::parentheses::parenthesized; use crate::{AsFormat, FormatNodeRule, PyFormatter}; @@ -71,7 +72,7 @@ impl FormatNodeRule for FormatStmtImportFrom { fn fmt_dangling_comments( &self, - _node: &StmtImportFrom, + _dangling_comments: &[SourceComment], _f: &mut PyFormatter, ) -> FormatResult<()> { // Handled in `fmt_fields` diff --git a/crates/ruff_python_formatter/src/statement/stmt_match.rs b/crates/ruff_python_formatter/src/statement/stmt_match.rs index d56b739590..643204fafd 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_match.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_match.rs @@ -1,7 +1,7 @@ use ruff_formatter::{format_args, write, Buffer, FormatResult}; use ruff_python_ast::StmtMatch; -use crate::comments::{leading_alternate_branch_comments, trailing_comments}; +use crate::comments::{leading_alternate_branch_comments, trailing_comments, SourceComment}; use crate::context::{NodeLevel, WithNodeLevel}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; @@ -64,7 +64,11 @@ impl FormatNodeRule for FormatStmtMatch { Ok(()) } - fn fmt_dangling_comments(&self, _node: &StmtMatch, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled as part of `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/statement/stmt_try.rs b/crates/ruff_python_formatter/src/statement/stmt_try.rs index f869fdf3bf..be5e108088 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_try.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_try.rs @@ -93,7 +93,11 @@ impl FormatNodeRule for FormatStmtTry { write!(f, [comments::dangling_comments(dangling_comments)]) } - fn fmt_dangling_comments(&self, _node: &StmtTry, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // dangling comments are formatted as part of AnyStatementTry::fmt Ok(()) } diff --git a/crates/ruff_python_formatter/src/statement/stmt_try_star.rs b/crates/ruff_python_formatter/src/statement/stmt_try_star.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/crates/ruff_python_formatter/src/statement/stmt_try_star.rs @@ -0,0 +1 @@ + diff --git a/crates/ruff_python_formatter/src/statement/stmt_while.rs b/crates/ruff_python_formatter/src/statement/stmt_while.rs index 3ee9e1a7a3..504c6f8489 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_while.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_while.rs @@ -1,4 +1,4 @@ -use crate::comments::{leading_alternate_branch_comments, trailing_comments}; +use crate::comments::{leading_alternate_branch_comments, trailing_comments, SourceComment}; use crate::expression::maybe_parenthesize_expression; use crate::expression::parentheses::Parenthesize; use crate::prelude::*; @@ -62,7 +62,11 @@ impl FormatNodeRule for FormatStmtWhile { Ok(()) } - fn fmt_dangling_comments(&self, _node: &StmtWhile, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/statement/stmt_with.rs b/crates/ruff_python_formatter/src/statement/stmt_with.rs index cb7493dbdd..fb08c27f76 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_with.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_with.rs @@ -4,7 +4,7 @@ use ruff_python_ast::{Ranged, StmtWith}; use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer}; use ruff_text_size::TextRange; -use crate::comments::trailing_comments; +use crate::comments::{trailing_comments, SourceComment}; use crate::expression::parentheses::{ in_parentheses_only_soft_line_break_or_space, optional_parentheses, parenthesized, }; @@ -88,7 +88,11 @@ impl FormatNodeRule for FormatStmtWith { ) } - fn fmt_dangling_comments(&self, _node: &StmtWith, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } diff --git a/crates/ruff_python_formatter/src/statement/suite.rs b/crates/ruff_python_formatter/src/statement/suite.rs index 0890e028f5..383589dde5 100644 --- a/crates/ruff_python_formatter/src/statement/suite.rs +++ b/crates/ruff_python_formatter/src/statement/suite.rs @@ -117,8 +117,10 @@ impl FormatRule> for FormatSuite { SuiteKind::TopLevel => SuiteChildStatement::Other(first), }; - let (mut preceding, mut after_class_docstring) = if comments - .leading_comments(first) + let first_comments = comments.leading_dangling_trailing_comments(first); + + let (mut preceding, mut after_class_docstring) = if first_comments + .leading .iter() .any(|comment| comment.is_suppression_off_comment(source)) { @@ -128,8 +130,8 @@ impl FormatRule> for FormatSuite { )?, false, ) - } else if comments - .trailing_comments(first) + } else if first_comments + .trailing .iter() .any(|comment| comment.is_suppression_off_comment(source)) { @@ -291,8 +293,10 @@ impl FormatRule> for FormatSuite { } } - if comments - .leading_comments(following) + let following_comments = comments.leading_dangling_trailing_comments(following); + + if following_comments + .leading .iter() .any(|comment| comment.is_suppression_off_comment(source)) { @@ -301,8 +305,8 @@ impl FormatRule> for FormatSuite { &mut iter, f, )?; - } else if comments - .trailing_comments(following) + } else if following_comments + .trailing .iter() .any(|comment| comment.is_suppression_off_comment(source)) { diff --git a/crates/ruff_python_formatter/src/type_param/type_params.rs b/crates/ruff_python_formatter/src/type_param/type_params.rs index 8c82caec1e..0c48581530 100644 --- a/crates/ruff_python_formatter/src/type_param/type_params.rs +++ b/crates/ruff_python_formatter/src/type_param/type_params.rs @@ -1,5 +1,5 @@ use crate::builders::PyFormatterExtensions; -use crate::comments::trailing_comments; +use crate::comments::{trailing_comments, SourceComment}; use crate::expression::parentheses::parenthesized; use crate::prelude::*; use ruff_formatter::write; @@ -34,7 +34,11 @@ impl FormatNodeRule for FormatTypeParams { parenthesized("[", &items, "]").fmt(f) } - fn fmt_dangling_comments(&self, _node: &TypeParams, _f: &mut PyFormatter) -> FormatResult<()> { + fn fmt_dangling_comments( + &self, + _dangling_comments: &[SourceComment], + _f: &mut PyFormatter, + ) -> FormatResult<()> { // Handled in `fmt_fields` Ok(()) } From a3d4f08f29eb97ce730e29e5ec186e12c82ced80 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 15 Aug 2023 14:59:18 -0400 Subject: [PATCH 136/155] Add general support for parenthesized comments on expressions (#6485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR adds support for parenthesized comments. A parenthesized comment is a comment that appears within a parenthesis, but not within the range of the expression enclosed by the parenthesis. For example, the comment here is a parenthesized comment: ```python if ( # comment True ): ... ``` The parentheses enclose the `True`, but the range of `True` doesn’t include the `# comment`. There are at least two problems associated with parenthesized comments: (1) associating the comment with the correct (i.e., enclosed) node; and (2) formatting the comment correctly, once it has been associated with the enclosed node. The solution proposed here for (1) is to search for parentheses between preceding and following node, and use open and close parentheses to break ties, rather than always assigning to the preceding node. For (2), we handle these special parenthesized comments in `FormatExpr`. The biggest risk with this approach is that we forget some codepath that force-disables parenthesization (by passing in `Parentheses::Never`). I've audited all usages of that enum and added additional handling + test coverage for such cases. Closes https://github.com/astral-sh/ruff/issues/6390. ## Test Plan `cargo test` with new cases. Before: | project | similarity index | |--------------|------------------| | build | 0.75623 | | cpython | 0.75472 | | django | 0.99804 | | transformers | 0.99618 | | typeshed | 0.74233 | | warehouse | 0.99601 | | zulip | 0.99727 | After: | project | similarity index | |--------------|------------------| | build | 0.75623 | | cpython | 0.75472 | | django | 0.99804 | | transformers | 0.99618 | | typeshed | 0.74237 | | warehouse | 0.99601 | | zulip | 0.99727 | --- .../test/fixtures/ruff/expression/call.py | 47 +++- .../test/fixtures/ruff/expression/starred.py | 10 + .../opening_parentheses_comment_value.py | 44 ++- .../test/fixtures/ruff/statement/assign.py | 27 ++ .../test/fixtures/ruff/statement/with.py | 28 +- .../ruff_python_formatter/src/comments/mod.rs | 18 ++ .../src/comments/placement.rs | 253 +++++++++++------- ...ents__tests__parenthesized_expression.snap | 12 +- .../src/expression/expr_generator_exp.rs | 22 +- .../src/expression/mod.rs | 13 +- .../src/other/arguments.rs | 3 + .../src/statement/stmt_assign.rs | 48 +++- .../src/statement/stmt_function_def.rs | 10 +- ...patibility@simple_cases__comments6.py.snap | 13 +- ...onsecutive_open_parentheses_ignore.py.snap | 17 +- ...@simple_cases__remove_await_parens.py.snap | 8 +- ..._cases__return_annotation_brackets.py.snap | 17 +- .../format@expression__attribute.py.snap | 3 +- .../snapshots/format@expression__call.py.snap | 93 ++++++- .../format@expression__generator_exp.py.snap | 9 +- .../format@expression__starred.py.snap | 28 ++ .../format@parentheses__nested.py.snap | 7 +- ..._opening_parentheses_comment_value.py.snap | 158 ++++++++--- .../format@statement__assert.py.snap | 8 +- .../format@statement__assign.py.snap | 52 ++++ .../snapshots/format@statement__match.py.snap | 9 +- .../snapshots/format@statement__raise.py.snap | 6 +- ...ormat@statement__return_annotation.py.snap | 14 +- .../snapshots/format@statement__with.py.snap | 59 +++- crates/ruff_python_trivia/src/tokenizer.rs | 6 + 30 files changed, 806 insertions(+), 236 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py index 03502701ec..6569ec3571 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/call.py @@ -116,8 +116,51 @@ threshold_date = datetime.datetime.now() - datetime.timedelta( # comment days=threshold_days_threshold_days ) -f( - ( # comment +# Parenthesized and opening-parenthesis comments +func( + (x for x in y) +) + +func( # outer comment + (x for x in y) +) + +func( + ( # inner comment + x for x in y + ) +) + +func( + ( + # inner comment + x for x in y + ) +) + +func( # outer comment + ( # inner comment 1 ) ) + +func( + # outer comment + ( # inner comment + x for x in y + ) +) + + +func( + ( # inner comment + [] + ) +) + +func( + # outer comment + ( # inner comment + [] + ) +) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py index 437b011b71..0167d0ee3a 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py @@ -13,3 +13,13 @@ call( [What, i, this, s, very, long, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] ) # trailing value comment ) + +call( + x, + # Leading starred comment + * # Trailing star comment + [ + # Leading value comment + [What, i, this, s, very, long, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] + ] # trailing value comment +) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py index c0117cbbbe..2774504d6a 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/parentheses/opening_parentheses_comment_value.py @@ -73,7 +73,49 @@ def e2() -> ( # e 2 x): pass -class E3( # e 3 +def e3() -> ( + # e 2 +x): pass + + +def e4() -> ( + x +# e 4 +): pass + + +def e5() -> ( # e 5 + ( # e 5 + x + ) +): pass + + +def e6() -> ( + ( + # e 6 + x + ) +): pass + + +def e7() -> ( + ( + x + # e 7 + ) +): pass + + +def e8() -> ( + ( + x + ) + # e 8 +): pass + + +class E9( # e 9 x): pass diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py index 7d098301a4..8ccd5b008d 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/assign.py @@ -27,3 +27,30 @@ aa = ([ aaaa = ( # trailing # comment bbbbb) = cccccccccccccccc = 3 + +x = ( # comment + [ # comment + a, + b, + c, + ] +) = 1 + + +x = ( + # comment + [ + a, + b, + c, + ] +) = 1 + + +x = ( + [ # comment + a, + b, + c, + ] +) = 1 diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py index 8a231ed788..fb213a6c21 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/with.py @@ -108,7 +108,6 @@ with ( ): ... - with [ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbb", @@ -125,7 +124,6 @@ with ( # comment ): ... - with ( # outer comment ( # inner comment CtxManager1() @@ -134,3 +132,29 @@ with ( # outer comment CtxManager3() as example3, ): ... + +with ( # outer comment + CtxManager() +) as example: + ... + +with ( # outer comment + CtxManager() +) as example, ( # inner comment + CtxManager2() +) as example2: + ... + +with ( # outer comment + CtxManager1(), + CtxManager2(), +) as example: + ... + +with ( # outer comment + ( # inner comment + CtxManager1() + ), + CtxManager2(), +) as example: + ... diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs index e1b144b151..3058673466 100644 --- a/crates/ruff_python_formatter/src/comments/mod.rs +++ b/crates/ruff_python_formatter/src/comments/mod.rs @@ -414,6 +414,24 @@ impl<'a> Comments<'a> { .leading_dangling_trailing(&NodeRefEqualityKey::from_ref(node.into())) } + /// Returns any comments on the open parenthesis of a `node`. + /// + /// For example, `# comment` in: + /// ```python + /// ( # comment + /// foo.bar + /// ) + /// ``` + #[inline] + pub(crate) fn open_parenthesis_comment(&self, node: T) -> Option<&SourceComment> + where + T: Into>, + { + self.leading_comments(node) + .first() + .filter(|comment| comment.line_position.is_end_of_line()) + } + #[inline(always)] #[cfg(not(debug_assertions))] pub(crate) fn assert_formatted_all_comments(&self, _source_code: SourceCode) {} diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 1ad9ffd046..cc8dc569b5 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -18,16 +18,149 @@ pub(super) fn place_comment<'a>( comment: DecoratedComment<'a>, locator: &Locator, ) -> CommentPlacement<'a> { - // Handle comments before and after bodies such as the different branches of an if statement. - let comment = if comment.line_position().is_own_line() { - handle_own_line_comment_around_body(comment, locator) - } else { - handle_end_of_line_comment_around_body(comment, locator) + handle_parenthesized_comment(comment, locator) + .or_else(|comment| handle_end_of_line_comment_around_body(comment, locator)) + .or_else(|comment| handle_own_line_comment_around_body(comment, locator)) + .or_else(|comment| handle_enclosed_comment(comment, locator)) +} + +/// Handle parenthesized comments. A parenthesized comment is a comment that appears within a +/// parenthesis, but not within the range of the expression enclosed by the parenthesis. +/// For example, the comment here is a parenthesized comment: +/// ```python +/// if ( +/// # comment +/// True +/// ): +/// ... +/// ``` +/// The parentheses enclose `True`, but the range of `True`doesn't include the `# comment`. +/// +/// Default handling can get parenthesized comments wrong in a number of ways. For example, the +/// comment here is marked (by default) as a trailing comment of `x`, when it should be a leading +/// comment of `y`: +/// ```python +/// assert ( +/// x +/// ), ( # comment +/// y +/// ) +/// ``` +/// +/// Similarly, this is marked as a leading comment of `y`, when it should be a trailing comment of +/// `x`: +/// ```python +/// if ( +/// x +/// # comment +/// ): +/// y +/// ``` +/// +/// As a generalized solution, if a comment has a preceding node and a following node, we search for +/// opening and closing parentheses between the two nodes. If we find a closing parenthesis between +/// the preceding node and the comment, then the comment is a trailing comment of the preceding +/// node. If we find an opening parenthesis between the comment and the following node, then the +/// comment is a leading comment of the following node. +fn handle_parenthesized_comment<'a>( + comment: DecoratedComment<'a>, + locator: &Locator, +) -> CommentPlacement<'a> { + let Some(preceding) = comment.preceding_node() else { + return CommentPlacement::Default(comment); }; - // Change comment placement depending on the node type. These can be seen as node-specific - // fixups. - comment.or_else(|comment| match comment.enclosing_node() { + let Some(following) = comment.following_node() else { + return CommentPlacement::Default(comment); + }; + + // TODO(charlie): Assert that there are no bogus tokens in these ranges. There are a few cases + // where we _can_ hit bogus tokens, but the parentheses need to come before them. For example: + // ```python + // try: + // some_call() + // except ( + // UnformattedError + // # trailing comment + // ) as err: + // handle_exception() + // ``` + // Here, we lex from the end of `UnformattedError` to the start of `handle_exception()`, which + // means we hit an "other" token at `err`. We know the parentheses must precede the `err`, but + // this could be fixed by including `as err` in the node range. + // + // Another example: + // ```python + // @deco + // # comment + // def decorated(): + // pass + // ``` + // Here, we lex from the end of `deco` to the start of the arguments of `decorated`. We hit an + // "other" token at `decorated`, but any parentheses must precede that. + // + // For now, we _can_ assert, but to do so, we stop lexing when we hit a token that precedes an + // identifier. + if comment.line_position().is_end_of_line() { + let tokenizer = SimpleTokenizer::new( + locator.contents(), + TextRange::new(preceding.end(), comment.start()), + ); + if tokenizer + .skip_trivia() + .take_while(|token| { + !matches!( + token.kind, + SimpleTokenKind::As | SimpleTokenKind::Def | SimpleTokenKind::Class + ) + }) + .any(|token| { + debug_assert!( + !matches!(token.kind, SimpleTokenKind::Bogus), + "Unexpected token between nodes: `{:?}`", + locator.slice(TextRange::new(preceding.end(), comment.start()),) + ); + + token.kind() == SimpleTokenKind::LParen + }) + { + return CommentPlacement::leading(following, comment); + } + } else { + let tokenizer = SimpleTokenizer::new( + locator.contents(), + TextRange::new(comment.end(), following.start()), + ); + if tokenizer + .skip_trivia() + .take_while(|token| { + !matches!( + token.kind, + SimpleTokenKind::As | SimpleTokenKind::Def | SimpleTokenKind::Class + ) + }) + .any(|token| { + debug_assert!( + !matches!(token.kind, SimpleTokenKind::Bogus), + "Unexpected token between nodes: `{:?}`", + locator.slice(TextRange::new(comment.end(), following.start())) + ); + token.kind() == SimpleTokenKind::RParen + }) + { + return CommentPlacement::trailing(preceding, comment); + } + } + + CommentPlacement::Default(comment) +} + +/// Handle a comment that is enclosed by a node. +fn handle_enclosed_comment<'a>( + comment: DecoratedComment<'a>, + locator: &Locator, +) -> CommentPlacement<'a> { + match comment.enclosing_node() { AnyNodeRef::Parameters(arguments) => { handle_parameters_separator_comment(comment, arguments, locator) .or_else(|comment| handle_bracketed_end_of_line_comment(comment, locator)) @@ -65,10 +198,7 @@ pub(super) fn place_comment<'a>( handle_module_level_own_line_comment_before_class_or_function_comment(comment, locator) } AnyNodeRef::WithItem(_) => handle_with_item_comment(comment, locator), - AnyNodeRef::StmtFunctionDef(function_def) => { - handle_leading_function_with_decorators_comment(comment) - .or_else(|comment| handle_leading_returns_comment(comment, function_def)) - } + AnyNodeRef::StmtFunctionDef(_) => handle_leading_function_with_decorators_comment(comment), AnyNodeRef::StmtClassDef(class_def) => { handle_leading_class_with_decorators_comment(comment, class_def) } @@ -90,13 +220,17 @@ pub(super) fn place_comment<'a>( | AnyNodeRef::ExprDictComp(_) | AnyNodeRef::ExprTuple(_) => handle_bracketed_end_of_line_comment(comment, locator), _ => CommentPlacement::Default(comment), - }) + } } fn handle_end_of_line_comment_around_body<'a>( comment: DecoratedComment<'a>, locator: &Locator, ) -> CommentPlacement<'a> { + if comment.line_position().is_own_line() { + return CommentPlacement::Default(comment); + } + // Handle comments before the first statement in a body // ```python // for x in range(10): # in the main body ... @@ -245,7 +379,9 @@ fn handle_own_line_comment_around_body<'a>( comment: DecoratedComment<'a>, locator: &Locator, ) -> CommentPlacement<'a> { - debug_assert!(comment.line_position().is_own_line()); + if comment.line_position().is_end_of_line() { + return CommentPlacement::Default(comment); + } // If the following is the first child in an alternative body, this must be the last child in // the previous one @@ -274,18 +410,11 @@ fn handle_own_line_comment_around_body<'a>( } // Check if we're between bodies and should attach to the following body. - handle_own_line_comment_between_branches(comment, preceding, locator) - .or_else(|comment| { - // Otherwise, there's no following branch or the indentation is too deep, so attach to the - // recursively last statement in the preceding body with the matching indentation. - handle_own_line_comment_after_branch(comment, preceding, locator) - }) - .or_else(|comment| { - // If the following node is the first in its body, and there's a non-trivia token between the - // comment and the following node (like a parenthesis), then it means the comment is trailing - // the preceding node, not leading the following one. - handle_own_line_comment_in_clause(comment, preceding, locator) - }) + handle_own_line_comment_between_branches(comment, preceding, locator).or_else(|comment| { + // Otherwise, there's no following branch or the indentation is too deep, so attach to the + // recursively last statement in the preceding body with the matching indentation. + handle_own_line_comment_after_branch(comment, preceding, locator) + }) } /// Handles own line comments between two branches of a node. @@ -385,36 +514,6 @@ fn handle_own_line_comment_between_branches<'a>( } } -/// Handles own-line comments at the end of a clause, immediately preceding a body: -/// ```python -/// if ( -/// True -/// # This should be a trailing comment of `True` and not a leading comment of `pass` -/// ): -/// pass -/// ``` -fn handle_own_line_comment_in_clause<'a>( - comment: DecoratedComment<'a>, - preceding: AnyNodeRef<'a>, - locator: &Locator, -) -> CommentPlacement<'a> { - if let Some(following) = comment.following_node() { - if is_first_statement_in_body(following, comment.enclosing_node()) - && SimpleTokenizer::new( - locator.contents(), - TextRange::new(comment.end(), following.start()), - ) - .skip_trivia() - .next() - .is_some() - { - return CommentPlacement::trailing(preceding, comment); - } - } - - CommentPlacement::Default(comment) -} - /// Determine where to attach an own line comment after a branch depending on its indentation fn handle_own_line_comment_after_branch<'a>( comment: DecoratedComment<'a>, @@ -787,40 +886,6 @@ fn handle_leading_function_with_decorators_comment(comment: DecoratedComment) -> } } -/// Handles end-of-line comments between function parameters and the return type annotation, -/// attaching them as dangling comments to the function instead of making them trailing -/// parameter comments. -/// -/// ```python -/// def double(a: int) -> ( # Hello -/// int -/// ): -/// return 2*a -/// ``` -fn handle_leading_returns_comment<'a>( - comment: DecoratedComment<'a>, - function_def: &'a ast::StmtFunctionDef, -) -> CommentPlacement<'a> { - let parameters = function_def.parameters.as_ref(); - let Some(returns) = function_def.returns.as_deref() else { - return CommentPlacement::Default(comment); - }; - - let is_preceding_parameters = comment - .preceding_node() - .is_some_and(|node| node == parameters.into()); - - let is_following_returns = comment - .following_node() - .is_some_and(|node| node == returns.into()); - - if comment.line_position().is_end_of_line() && is_preceding_parameters && is_following_returns { - CommentPlacement::dangling(comment.enclosing_node(), comment) - } else { - CommentPlacement::Default(comment) - } -} - /// Handle comments between decorators and the decorated node. /// /// For example, given: @@ -1043,14 +1108,6 @@ fn handle_trailing_expression_starred_star_end_of_line_comment<'a>( comment: DecoratedComment<'a>, starred: &'a ast::ExprStarred, ) -> CommentPlacement<'a> { - if comment.line_position().is_own_line() { - return CommentPlacement::Default(comment); - } - - if comment.following_node().is_none() { - return CommentPlacement::Default(comment); - } - CommentPlacement::leading(starred, comment) } diff --git a/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__parenthesized_expression.snap b/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__parenthesized_expression.snap index e9dbfbf221..0c49034c20 100644 --- a/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__parenthesized_expression.snap +++ b/crates/ruff_python_formatter/src/comments/snapshots/ruff_python_formatter__comments__tests__parenthesized_expression.snap @@ -4,19 +4,19 @@ expression: comments.debug(test_case.source_code) --- { Node { - kind: ExprName, - range: 1..2, - source: `a`, + kind: ExprBinOp, + range: 30..57, + source: `10 + # More comments⏎`, }: { - "leading": [], - "dangling": [], - "trailing": [ + "leading": [ SourceComment { text: "# Trailing comment", position: EndOfLine, formatted: false, }, ], + "dangling": [], + "trailing": [], }, Node { kind: ExprConstant, diff --git a/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs b/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs index 5181ce090f..771e0d650c 100644 --- a/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs +++ b/crates/ruff_python_formatter/src/expression/expr_generator_exp.rs @@ -2,7 +2,7 @@ use ruff_formatter::{format_args, write, Buffer, FormatResult, FormatRuleWithOpt use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprGeneratorExp; -use crate::comments::{leading_comments, SourceComment}; +use crate::comments::SourceComment; use crate::context::PyFormatContext; use crate::expression::parentheses::{parenthesized, NeedsParentheses, OptionalParentheses}; use crate::prelude::*; @@ -14,10 +14,11 @@ pub enum GeneratorExpParentheses { #[default] Default, - // skip parens if the generator exp is the only argument to a function, e.g. - // ```python - // all(x for y in z)` - // ``` + /// Skip parens if the generator is the only argument to a function and doesn't contain any + /// dangling comments. For example: + /// ```python + /// all(x for y in z)` + /// ``` StripIfOnlyFunctionArg, } @@ -52,15 +53,12 @@ impl FormatNodeRule for FormatExprGeneratorExp { let comments = f.context().comments().clone(); let dangling = comments.dangling_comments(item); - if self.parentheses == GeneratorExpParentheses::StripIfOnlyFunctionArg { + if self.parentheses == GeneratorExpParentheses::StripIfOnlyFunctionArg + && dangling.is_empty() + { write!( f, - [ - leading_comments(dangling), - group(&elt.format()), - soft_line_break_or_space(), - &joined - ] + [group(&elt.format()), soft_line_break_or_space(), &joined] ) } else { write!( diff --git a/crates/ruff_python_formatter/src/expression/mod.rs b/crates/ruff_python_formatter/src/expression/mod.rs index 97c5535985..a617c91328 100644 --- a/crates/ruff_python_formatter/src/expression/mod.rs +++ b/crates/ruff_python_formatter/src/expression/mod.rs @@ -107,7 +107,15 @@ impl FormatRule> for FormatExpr { }; if parenthesize { - parenthesized("(", &format_expr, ")").fmt(f) + let comments = f.context().comments().clone(); + let open_parenthesis_comment = comments.open_parenthesis_comment(expression); + parenthesized("(", &format_expr, ")") + .with_dangling_comments( + open_parenthesis_comment + .map(std::slice::from_ref) + .unwrap_or_default(), + ) + .fmt(f) } else { let level = match f.context().node_level() { NodeLevel::TopLevel | NodeLevel::CompoundStatement => NodeLevel::Expression(None), @@ -162,6 +170,9 @@ impl Format> for MaybeParenthesizeExpression<'_> { let has_comments = comments.has_leading_comments(*expression) || comments.has_trailing_own_line_comments(*expression); + // If the expression has comments, we always want to preserve the parentheses. This also + // ensures that we correctly handle parenthesized comments, and don't need to worry about + // them in the implementation below. if preserve_parentheses || has_comments { return expression.format().with_options(Parentheses::Always).fmt(f); } diff --git a/crates/ruff_python_formatter/src/other/arguments.rs b/crates/ruff_python_formatter/src/other/arguments.rs index 40cece7d9e..f4d8d1ea27 100644 --- a/crates/ruff_python_formatter/src/other/arguments.rs +++ b/crates/ruff_python_formatter/src/other/arguments.rs @@ -45,6 +45,9 @@ impl FormatNodeRule for FormatArguments { if is_single_argument_parenthesized(arg, item.end(), source) { Parentheses::Always } else { + // Note: no need to handle opening-parenthesis comments, since + // an opening-parenthesis comment implies that the argument is + // parenthesized. Parentheses::Never }; joiner.entry(other, &other.format().with_options(parentheses)) diff --git a/crates/ruff_python_formatter/src/statement/stmt_assign.rs b/crates/ruff_python_formatter/src/statement/stmt_assign.rs index ac93608c2b..d54804939d 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_assign.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_assign.rs @@ -44,6 +44,7 @@ impl FormatNodeRule for FormatStmtAssign { } } +#[derive(Debug)] struct FormatTargets<'a> { targets: &'a [Expr], } @@ -51,9 +52,17 @@ struct FormatTargets<'a> { impl Format> for FormatTargets<'_> { fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { if let Some((first, rest)) = self.targets.split_first() { - let can_omit_parentheses = has_own_parentheses(first, f.context()).is_some(); + let comments = f.context().comments(); - let group_id = if can_omit_parentheses { + let parenthesize = if comments.has_leading_comments(first) { + ParenthesizeTarget::Always + } else if has_own_parentheses(first, f.context()).is_some() { + ParenthesizeTarget::Never + } else { + ParenthesizeTarget::IfBreaks + }; + + let group_id = if parenthesize == ParenthesizeTarget::Never { Some(f.group_id("assignment_parentheses")) } else { None @@ -61,17 +70,23 @@ impl Format> for FormatTargets<'_> { let format_first = format_with(|f: &mut PyFormatter| { let mut f = WithNodeLevel::new(NodeLevel::Expression(group_id), f); - if can_omit_parentheses { - write!(f, [first.format().with_options(Parentheses::Never)]) - } else { - write!( - f, - [ - if_group_breaks(&text("(")), - soft_block_indent(&first.format().with_options(Parentheses::Never)), - if_group_breaks(&text(")")) - ] - ) + match parenthesize { + ParenthesizeTarget::Always => { + write!(f, [first.format().with_options(Parentheses::Always)]) + } + ParenthesizeTarget::Never => { + write!(f, [first.format().with_options(Parentheses::Never)]) + } + ParenthesizeTarget::IfBreaks => { + write!( + f, + [ + if_group_breaks(&text("(")), + soft_block_indent(&first.format().with_options(Parentheses::Never)), + if_group_breaks(&text(")")) + ] + ) + } } }); @@ -91,3 +106,10 @@ impl Format> for FormatTargets<'_> { } } } + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum ParenthesizeTarget { + Always, + Never, + IfBreaks, +} diff --git a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs index b5ce2e4d45..edbfb59879 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_function_def.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_function_def.rs @@ -66,10 +66,12 @@ impl FormatNodeRule for FormatStmtFunctionDef { write!(f, [space(), text("->"), space()])?; if return_annotation.is_tuple_expr() { - write!( - f, - [return_annotation.format().with_options(Parentheses::Never)] - )?; + let parentheses = if comments.has_leading_comments(return_annotation.as_ref()) { + Parentheses::Always + } else { + Parentheses::Never + }; + write!(f, [return_annotation.format().with_options(parentheses)])?; } else if comments.has_trailing_comments(return_annotation.as_ref()) { // Intentionally parenthesize any return annotations with trailing comments. // This avoids an instability in cases like: diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments6.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments6.py.snap index 6be2a77bc1..6725d8d840 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments6.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__comments6.py.snap @@ -141,7 +141,7 @@ aaaaaaaaaaaaa, bbbbbbbbb = map(list, map(itertools.chain.from_iterable, zip(*ite an_element_with_a_long_value = calls() or more_calls() and more() # type: bool tup = ( -@@ -100,19 +98,30 @@ +@@ -100,7 +98,13 @@ ) c = call( @@ -156,10 +156,9 @@ aaaaaaaaaaaaa, bbbbbbbbb = map(list, map(itertools.chain.from_iterable, zip(*ite ) --result = ( # aaa -- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" --) -+result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa +@@ -108,11 +112,18 @@ + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ) -AAAAAAAAAAAAA = [AAAAAAAAAAAAA] + SHARED_AAAAAAAAAAAAA + USER_AAAAAAAAAAAAA + AAAAAAAAAAAAA # type: ignore +AAAAAAAAAAAAA = ( @@ -293,7 +292,9 @@ def func( ) -result = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # aaa +result = ( # aaa + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +) AAAAAAAAAAAAA = ( [AAAAAAAAAAAAA] + SHARED_AAAAAAAAAAAAA + USER_AAAAAAAAAAAAA + AAAAAAAAAAAAA diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap index a99e1bf762..7759ca34bc 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap @@ -33,15 +33,14 @@ print( "111" ) # type: ignore ```diff --- Black +++ Ruff -@@ -1,9 +1,9 @@ - # This is a regression test. Issue #3737 - --a = ( # type: ignore -+a = int( # type: ignore # type: ignore +@@ -3,7 +3,9 @@ + a = ( # type: ignore int( # type: ignore int( # type: ignore - int(6) # type: ignore -+ 6 ++ int( # type: ignore ++ 6 ++ ) ) ) ) @@ -52,10 +51,12 @@ print( "111" ) # type: ignore ```py # This is a regression test. Issue #3737 -a = int( # type: ignore # type: ignore +a = ( # type: ignore int( # type: ignore int( # type: ignore - 6 + int( # type: ignore + 6 + ) ) ) ) diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__remove_await_parens.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__remove_await_parens.py.snap index 26fc695ecb..428ca61376 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__remove_await_parens.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__remove_await_parens.py.snap @@ -93,13 +93,12 @@ async def main(): ```diff --- Black +++ Ruff -@@ -21,7 +21,10 @@ +@@ -21,7 +21,9 @@ # Check comments async def main(): - await asyncio.sleep(1) # Hello -+ await ( -+ # Hello ++ await ( # Hello + asyncio.sleep(1) + ) @@ -133,8 +132,7 @@ async def main(): # Check comments async def main(): - await ( - # Hello + await ( # Hello asyncio.sleep(1) ) diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap index c943a9e048..552ca4576b 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__return_annotation_brackets.py.snap @@ -100,7 +100,16 @@ def foo() -> tuple[int, int, int,]: ```diff --- Black +++ Ruff -@@ -26,7 +26,11 @@ +@@ -22,11 +22,19 @@ + + + # Don't lose the comments +-def double(a: int) -> int: # Hello ++def double( ++ a: int ++) -> ( # Hello ++ int ++): return 2 * a @@ -142,7 +151,11 @@ def double(a: int) -> int: # Don't lose the comments -def double(a: int) -> int: # Hello +def double( + a: int +) -> ( # Hello + int +): return 2 * a diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__attribute.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__attribute.py.snap index ecbc21d1a1..59623f33ac 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__attribute.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__attribute.py.snap @@ -204,8 +204,7 @@ x6 = ( ) # regression: https://github.com/astral-sh/ruff/issues/6181 -( - # +( # () ).a ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap index b6dab5b5df..d597fca638 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap @@ -122,11 +122,54 @@ threshold_date = datetime.datetime.now() - datetime.timedelta( # comment days=threshold_days_threshold_days ) -f( - ( # comment +# Parenthesized and opening-parenthesis comments +func( + (x for x in y) +) + +func( # outer comment + (x for x in y) +) + +func( + ( # inner comment + x for x in y + ) +) + +func( + ( + # inner comment + x for x in y + ) +) + +func( # outer comment + ( # inner comment 1 ) ) + +func( + # outer comment + ( # inner comment + x for x in y + ) +) + + +func( + ( # inner comment + [] + ) +) + +func( + # outer comment + ( # inner comment + [] + ) +) ``` ## Output @@ -248,12 +291,52 @@ threshold_date = datetime.datetime.now() - datetime.timedelta( # comment days=threshold_days_threshold_days ) -f( - ( - # comment +# Parenthesized and opening-parenthesis comments +func(x for x in y) + +func( # outer comment + x for x in y +) + +func( + ( # inner comment + x for x in y + ) +) + +func( + # inner comment + x + for x in y +) + +func( # outer comment + ( # inner comment 1 ) ) + +func( + # outer comment + ( # inner comment + x for x in y + ) +) + + +func( + ( # inner comment + [] + ) +) + +func( + ( + # outer comment + # inner comment + [] + ) +) ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__generator_exp.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__generator_exp.py.snap index b634d6dd46..ed11b4724c 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__generator_exp.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__generator_exp.py.snap @@ -79,10 +79,11 @@ f((1) for _ in (a)) # black keeps these atm, but intends to remove them in the future: # https://github.com/psf/black/issues/2943 len( - # leading - a - for b in c - # trailing + ( # leading + a + for b in c + # trailing + ) ) len( diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap index fcc8712509..c93c51da25 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap @@ -19,6 +19,16 @@ call( [What, i, this, s, very, long, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] ) # trailing value comment ) + +call( + x, + # Leading starred comment + * # Trailing star comment + [ + # Leading value comment + [What, i, this, s, very, long, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] + ] # trailing value comment +) ``` ## Output @@ -55,6 +65,24 @@ call( ] ) # trailing value comment ) + +call( + x, + # Leading starred comment + # Trailing star comment + *[ + # Leading value comment + [ + What, + i, + this, + s, + very, + long, + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, + ] + ], # trailing value comment +) ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap index 872ea15653..2106ed7f65 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__nested.py.snap @@ -89,8 +89,11 @@ a = ( a + b + c - + d # Hello - + (e + f + g) + + d + + + ( # Hello + e + f + g + ) ) a = int( # type: ignore diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap index e4a42c950f..e61a056653 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap @@ -79,7 +79,49 @@ def e2() -> ( # e 2 x): pass -class E3( # e 3 +def e3() -> ( + # e 2 +x): pass + + +def e4() -> ( + x +# e 4 +): pass + + +def e5() -> ( # e 5 + ( # e 5 + x + ) +): pass + + +def e6() -> ( + ( + # e 6 + x + ) +): pass + + +def e7() -> ( + ( + x + # e 7 + ) +): pass + + +def e8() -> ( + ( + x + ) + # e 8 +): pass + + +class E9( # e 9 x): pass @@ -118,54 +160,54 @@ f5 = { # f5 ```py # Opening parentheses end-of-line comment with value in the parentheses -( - # a 1 +( # a 1 + x +) +a2 = ( # a 2 x ) -a2 = x # a 2 a3 = f( # a 3 x ) -a4 = x = a4 # a 4 +a4 = ( # a 4 + x +) = a4 a5: List( # a 5 x ) = 5 -raise ( - # b 1a +raise ( # b 1a x ) -raise b1b from (x) # b 1b -raise ( - # b 1c +raise b1b from ( # b 1b + x +) +raise ( # b 1c x ) from b1c -del ( - # b 2 +del ( # b 2 + x +) +assert ( # b 3 + x +), ( # b 4 x ) -assert ( - # b 3 - x # b 4 -), x def g(): """Statements that are only allowed in function bodies""" - return ( - # c 1 + return ( # c 1 x ) - yield ( - # c 2 + yield ( # c 2 x ) async def h(): """Statements that are only allowed in async function bodies""" - await ( - # c 3 + await ( # c 3 x ) @@ -174,8 +216,7 @@ with ( # d 1 x ): pass -match ( - # d 2 +match ( # d 2 x ): case NOT_YET_IMPLEMENTED_Pattern: @@ -183,30 +224,27 @@ match ( match d3: case NOT_YET_IMPLEMENTED_Pattern: pass -while ( - # d 4 +while ( # d 4 x ): pass -if ( - # d 5 +if ( # d 5 x ): pass -elif ( - # d 6 +elif ( # d 6 y ): pass -for ( - # d 7 - x # d 8 -) in y: +for ( # d 7 + x +) in ( # d 8 + y +): pass try: pass -except ( - # d 9 +except ( # d 9 x ): pass @@ -218,11 +256,55 @@ def e1( # e 1 pass -def e2() -> x: # e 2 +def e2() -> ( # e 2 + x +): pass -class E3( # e 3 +def e3() -> ( + # e 2 + x +): + pass + + +def e4() -> ( + x + # e 4 +): + pass + + +def e5() -> ( # e 5 + # e 5 + x +): + pass + + +def e6() -> ( + # e 6 + x +): + pass + + +def e7() -> ( + x + # e 7 +): + pass + + +def e8() -> ( + x + # e 8 +): + pass + + +class E9( # e 9 x ): pass diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__assert.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__assert.py.snap index 089244c385..78163db003 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__assert.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__assert.py.snap @@ -52,10 +52,8 @@ assert ( # Dangle1 assert ( # Leading test value True # Trailing test value same-line -), ( # Trailing test value own-line - "Some string" -) # Trailing msg same-line +), "Some string" # Trailing msg same-line # Trailing assert # Random dangler @@ -65,11 +63,9 @@ assert ( assert ( # Leading test value True # Trailing test value same-line -), ( # Trailing test value own-line # Test dangler - "Some string" -) # Trailing msg same-line +), "Some string" # Trailing msg same-line # Trailing assert ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap index 61b8c72246..03b8bf6fec 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__assign.py.snap @@ -33,6 +33,33 @@ aa = ([ aaaa = ( # trailing # comment bbbbb) = cccccccccccccccc = 3 + +x = ( # comment + [ # comment + a, + b, + c, + ] +) = 1 + + +x = ( + # comment + [ + a, + b, + c, + ] +) = 1 + + +x = ( + [ # comment + a, + b, + c, + ] +) = 1 ``` ## Output @@ -70,6 +97,31 @@ aaaa = ( # trailing # comment bbbbb ) = cccccccccccccccc = 3 + +x = ( # comment + [ # comment + a, + b, + c, + ] +) = 1 + + +x = ( + # comment + [ + a, + b, + c, + ] +) = 1 + + +x = [ # comment + a, + b, + c, +] = 1 ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap index 55f553ad20..d1f903c8e7 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap @@ -125,8 +125,7 @@ match foo: # dangling match comment # leading match comment -match ( - # leading expr comment +match ( # leading expr comment # another leading expr comment foo # trailing expr comment # another trailing expr comment @@ -151,16 +150,14 @@ match [ # comment case NOT_YET_IMPLEMENTED_Pattern: pass -match ( - # comment +match ( # comment "a b c" ).split(): # another comment case NOT_YET_IMPLEMENTED_Pattern: pass -match ( - # comment +match ( # comment # let's go yield foo ): # another comment diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap index 1c9746b12a..46637a3543 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__raise.py.snap @@ -154,8 +154,7 @@ raise ( ) -raise ( - # hey +raise ( # hey aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # Holala + bbbbbbbbbbbbbbbbbbbbbbbbbb # stay @@ -165,8 +164,7 @@ raise ( ) # whaaaaat # the end -raise ( - # hey 2 +raise ( # hey 2 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" # Holala "bbbbbbbbbbbbbbbbbbbbbbbb" # stay diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap index 44840e33cd..b2fc744894 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__return_annotation.py.snap @@ -223,7 +223,9 @@ def zrevrangebylex( min: _Value, start: int | None = None, num: int | None = None, -) -> 1: # type: ignore[override] +) -> ( # type: ignore[override] + 1 +): ... @@ -248,7 +250,9 @@ def zrevrangebylex( min: _Value, start: int | None = None, num: int | None = None, -) -> (1, 2): # type: ignore[override] +) -> ( # type: ignore[override] + (1, 2) +): ... @@ -264,7 +268,11 @@ def double( return 2 * a -def double(a: int) -> int: # Hello +def double( + a: int +) -> ( # Hello + int +): return 2 * a diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap index 09eb21c805..6e16935581 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__with.py.snap @@ -114,7 +114,6 @@ with ( ): ... - with [ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbb", @@ -131,7 +130,6 @@ with ( # comment ): ... - with ( # outer comment ( # inner comment CtxManager1() @@ -140,6 +138,32 @@ with ( # outer comment CtxManager3() as example3, ): ... + +with ( # outer comment + CtxManager() +) as example: + ... + +with ( # outer comment + CtxManager() +) as example, ( # inner comment + CtxManager2() +) as example2: + ... + +with ( # outer comment + CtxManager1(), + CtxManager2(), +) as example: + ... + +with ( # outer comment + ( # inner comment + CtxManager1() + ), + CtxManager2(), +) as example: + ... ``` ## Output @@ -260,7 +284,6 @@ with ( ): ... - with [ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbb", @@ -277,16 +300,40 @@ with ( # comment ): ... - with ( # outer comment - ( - # inner comment + ( # inner comment CtxManager1() ) as example1, CtxManager2() as example2, CtxManager3() as example3, ): ... + +with ( # outer comment + CtxManager() +) as example: + ... + +with ( # outer comment + CtxManager() +) as example, ( # inner comment + CtxManager2() +) as example2: + ... + +with ( # outer comment + CtxManager1(), + CtxManager2(), +) as example: + ... + +with ( # outer comment + ( # inner comment + CtxManager1() + ), + CtxManager2(), +) as example: + ... ``` diff --git a/crates/ruff_python_trivia/src/tokenizer.rs b/crates/ruff_python_trivia/src/tokenizer.rs index fe812f98f7..7aef8b947d 100644 --- a/crates/ruff_python_trivia/src/tokenizer.rs +++ b/crates/ruff_python_trivia/src/tokenizer.rs @@ -168,6 +168,9 @@ pub enum SimpleTokenKind { /// `:` Colon, + /// `;` + Semi, + /// '/' Slash, @@ -200,6 +203,7 @@ pub enum SimpleTokenKind { /// `^` Circumflex, + /// `|` Vbar, @@ -226,6 +230,7 @@ pub enum SimpleTokenKind { /// `break` Break, + /// `class` Class, @@ -331,6 +336,7 @@ impl SimpleTokenKind { '}' => SimpleTokenKind::RBrace, ',' => SimpleTokenKind::Comma, ':' => SimpleTokenKind::Colon, + ';' => SimpleTokenKind::Semi, '/' => SimpleTokenKind::Slash, '*' => SimpleTokenKind::Star, '.' => SimpleTokenKind::Dot, From 097db2fcce235ced7d5e08134d840c40ed11318d Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 15 Aug 2023 15:29:29 -0500 Subject: [PATCH 137/155] Fix docs for `PLW1508` (#6602) --- .../rules/pylint/rules/invalid_envvar_default.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs b/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs index 549311f8ab..a6972b1d26 100644 --- a/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs +++ b/crates/ruff/src/rules/pylint/rules/invalid_envvar_default.rs @@ -5,25 +5,29 @@ use ruff_python_ast::{self as ast, Constant, Expr, Operator, Ranged}; use crate::checkers::ast::Checker; /// ## What it does -/// Checks for `env.getenv` calls with invalid default values. +/// Checks for `os.getenv` calls with invalid default values. /// /// ## Why is this bad? -/// If an environment variable is set, `env.getenv` will return its value as -/// a string. If the environment variable is _not_ set, `env.getenv` will +/// If an environment variable is set, `os.getenv` will return its value as +/// a string. If the environment variable is _not_ set, `os.getenv` will /// return `None`, or the default value if one is provided. /// /// If the default value is not a string or `None`, then it will be -/// inconsistent with the return type of `env.getenv`, which can lead to +/// inconsistent with the return type of `os.getenv`, which can lead to /// confusing behavior. /// /// ## Example /// ```python -/// int(env.getenv("FOO", 1)) +/// import os +/// +/// int(os.getenv("FOO", 1)) /// ``` /// /// Use instead: /// ```python -/// int(env.getenv("FOO", "1")) +/// import os +/// +/// int(os.getenv("FOO", "1")) /// ``` #[violation] pub struct InvalidEnvvarDefault; From 3f1658a25bccf02b4ac39b622fdf221f1b70c8c4 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 15 Aug 2023 20:10:24 -0400 Subject: [PATCH 138/155] Remove pylint's duplicate_value.rs (#6604) This was moved to bugbear, but we forgot to delete the file. --- .../src/rules/pylint/rules/duplicate_value.rs | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 crates/ruff/src/rules/pylint/rules/duplicate_value.rs diff --git a/crates/ruff/src/rules/pylint/rules/duplicate_value.rs b/crates/ruff/src/rules/pylint/rules/duplicate_value.rs deleted file mode 100644 index 194e0bc55d..0000000000 --- a/crates/ruff/src/rules/pylint/rules/duplicate_value.rs +++ /dev/null @@ -1,57 +0,0 @@ -use ruff_python_ast::{self as ast, Expr, Ranged}; -use rustc_hash::FxHashSet; - -use ruff_diagnostics::{Diagnostic, Violation}; -use ruff_macros::{derive_message_formats, violation}; -use ruff_python_ast::comparable::ComparableExpr; - -use crate::checkers::ast::Checker; - -/// ## What it does -/// Checks for set literals that contain duplicate values. -/// -/// ## Why is this bad? -/// In Python, sets are unordered collections of unique elements. Including a -/// duplicate value in a set literal is redundant, and may be indicative of a -/// mistake. -/// -/// ## Example -/// ```python -/// {1, 2, 3, 1} -/// ``` -/// -/// Use instead: -/// ```python -/// {1, 2, 3} -/// ``` -#[violation] -pub struct DuplicateValue { - value: String, -} - -impl Violation for DuplicateValue { - #[derive_message_formats] - fn message(&self) -> String { - let DuplicateValue { value } = self; - format!("Duplicate value `{value}` in set") - } -} - -/// PLW0130 -pub(crate) fn duplicate_value(checker: &mut Checker, elts: &Vec) { - let mut seen_values: FxHashSet = FxHashSet::default(); - for elt in elts { - if let Expr::Constant(ast::ExprConstant { value, .. }) = elt { - let comparable_value: ComparableExpr = elt.into(); - - if !seen_values.insert(comparable_value) { - checker.diagnostics.push(Diagnostic::new( - DuplicateValue { - value: checker.generator().constant(value), - }, - elt.range(), - )); - } - }; - } -} From 9bf6713b7693bbdfb9f1a10ec4d4fbd9f4d2e263 Mon Sep 17 00:00:00 2001 From: Anton Grouchtchak Date: Tue, 15 Aug 2023 19:17:52 -0500 Subject: [PATCH 139/155] Change rule count from 500 to 600 (#6605) Fixes missing change from PR #6579. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d6250fb6b..84f754de3d 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ An extremely fast Python linter, written in Rust. - 🤝 Python 3.11 compatibility - 📦 Built-in caching, to avoid re-analyzing unchanged files - 🔧 Autofix support, for automatic error correction (e.g., automatically remove unused imports) -- 📏 Over [500 built-in rules](https://beta.ruff.rs/docs/rules/) +- 📏 Over [600 built-in rules](https://beta.ruff.rs/docs/rules/) - ⚖️ [Near-parity](https://beta.ruff.rs/docs/faq/#how-does-ruff-compare-to-flake8) with the built-in Flake8 rule set - 🔌 Native re-implementations of dozens of Flake8 plugins, like flake8-bugbear From 897cce83b3aed5e0d81681c948df379978789397 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Wed, 16 Aug 2023 05:01:25 +0200 Subject: [PATCH 140/155] Call pattern formatting (#6594) --- .../test/fixtures/ruff/statement/match.py | 33 ++++ .../ruff_python_formatter/src/comments/mod.rs | 1 + crates/ruff_python_formatter/src/lib.rs | 34 ---- .../src/other/match_case.rs | 74 +++++--- .../src/pattern/pattern_match_as.rs | 11 +- .../src/pattern/pattern_match_class.rs | 11 +- .../src/pattern/pattern_match_mapping.rs | 11 +- .../src/pattern/pattern_match_or.rs | 11 +- .../src/pattern/pattern_match_sequence.rs | 11 +- .../src/pattern/pattern_match_singleton.rs | 5 +- .../src/pattern/pattern_match_star.rs | 11 +- .../src/pattern/pattern_match_value.rs | 13 +- .../src/statement/stmt_match.rs | 4 +- ...y@py_310__pattern_matching_complex.py.snap | 171 +++++++++--------- ...ty@py_310__pattern_matching_extras.py.snap | 112 ++++++------ ...y@py_310__pattern_matching_generic.py.snap | 20 +- ...ty@py_310__pattern_matching_simple.py.snap | 120 ++++++------ ...ity@py_310__pattern_matching_style.py.snap | 20 +- ...py_310__remove_newline_after_match.py.snap | 16 +- ..._opening_parentheses_comment_empty.py.snap | 4 +- ..._opening_parentheses_comment_value.py.snap | 7 +- .../snapshots/format@statement__match.py.snap | 103 +++++++++-- 22 files changed, 473 insertions(+), 330 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py index 08b0840fd9..48e84e98e3 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/match.py @@ -108,3 +108,36 @@ match long_lines: bbbbbbbbaaaaaahhhh == 2 ): # another comment pass + + +match pattern_comments: + case ( + only_trailing # trailing 1 + # trailing 2 +# trailing 3 + ): + pass + + +match pattern_comments: + case ( # leading + only_leading + ): + pass + + +match pattern_comments: + case ( + # leading + leading_and_trailing # trailing 1 + # trailing 2 +# trailing 3 + ): + pass + + +match pattern_comments: + case ( + no_comments + ): + pass diff --git a/crates/ruff_python_formatter/src/comments/mod.rs b/crates/ruff_python_formatter/src/comments/mod.rs index 3058673466..38d38fdf07 100644 --- a/crates/ruff_python_formatter/src/comments/mod.rs +++ b/crates/ruff_python_formatter/src/comments/mod.rs @@ -388,6 +388,7 @@ impl<'a> Comments<'a> { } /// Returns an iterator over the [leading](self#leading-comments) and [trailing comments](self#trailing-comments) of `node`. + #[allow(unused)] pub(crate) fn leading_trailing_comments( &self, node: T, diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs index 68f26b1d7b..80494d4626 100644 --- a/crates/ruff_python_formatter/src/lib.rs +++ b/crates/ruff_python_formatter/src/lib.rs @@ -152,40 +152,6 @@ pub fn format_node<'a>( Ok(formatted) } -pub(crate) struct NotYetImplemented<'a>(AnyNodeRef<'a>); - -/// Formats a placeholder for nodes that have not yet been implemented -pub(crate) fn not_yet_implemented<'a, T>(node: T) -> NotYetImplemented<'a> -where - T: Into>, -{ - NotYetImplemented(node.into()) -} - -impl Format> for NotYetImplemented<'_> { - fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { - let text = std::format!("NOT_YET_IMPLEMENTED_{:?}", self.0.kind()); - - f.write_element(FormatElement::Tag(Tag::StartVerbatim( - tag::VerbatimKind::Verbatim { - length: text.text_len(), - }, - )))?; - - f.write_element(FormatElement::DynamicText { - text: Box::from(text), - })?; - - f.write_element(FormatElement::Tag(Tag::EndVerbatim))?; - - f.context() - .comments() - .mark_verbatim_node_comments_formatted(self.0); - - Ok(()) - } -} - pub(crate) struct NotYetImplementedCustomText<'a> { text: &'static str, node: AnyNodeRef<'a>, diff --git a/crates/ruff_python_formatter/src/other/match_case.rs b/crates/ruff_python_formatter/src/other/match_case.rs index dcbcbcce87..1f60c163f0 100644 --- a/crates/ruff_python_formatter/src/other/match_case.rs +++ b/crates/ruff_python_formatter/src/other/match_case.rs @@ -1,10 +1,12 @@ -use ruff_formatter::{write, Buffer, FormatResult}; -use ruff_python_ast::MatchCase; +use ruff_formatter::{format_args, write, Buffer, FormatResult}; +use ruff_python_ast::{MatchCase, Pattern, Ranged}; +use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer}; +use ruff_text_size::TextRange; -use crate::comments::{trailing_comments, SourceComment}; -use crate::not_yet_implemented_custom_text; +use crate::comments::{leading_comments, trailing_comments, SourceComment}; +use crate::expression::parentheses::parenthesized; use crate::prelude::*; -use crate::{FormatNodeRule, PyFormatter}; +use crate::{FormatError, FormatNodeRule, PyFormatter}; #[derive(Default)] pub struct FormatMatchCase; @@ -21,24 +23,20 @@ impl FormatNodeRule for FormatMatchCase { let comments = f.context().comments().clone(); let dangling_item_comments = comments.dangling_comments(item); - write!( - f, - [ - text("case"), - space(), - format_with(|f: &mut PyFormatter| { - let comments = f.context().comments(); - - for comment in comments.leading_trailing_comments(pattern) { - // This is a lie, but let's go with it. - comment.mark_formatted(); - } - - // Replace the whole `format_with` with `pattern.format()` once pattern formatting is implemented. - not_yet_implemented_custom_text("NOT_YET_IMPLEMENTED_Pattern", pattern).fmt(f) - }), - ] - )?; + write!(f, [text("case"), space()])?; + let leading_pattern_comments = comments.leading_comments(pattern); + if !leading_pattern_comments.is_empty() { + parenthesized( + "(", + &format_args![leading_comments(leading_pattern_comments), pattern.format()], + ")", + ) + .fmt(f)?; + } else if is_match_case_pattern_parenthesized(item, pattern, f.context())? { + parenthesized("(", &pattern.format(), ")").fmt(f)?; + } else { + pattern.format().fmt(f)?; + } if let Some(guard) = guard { write!(f, [space(), text("if"), space(), guard.format()])?; @@ -63,3 +61,33 @@ impl FormatNodeRule for FormatMatchCase { Ok(()) } } + +fn is_match_case_pattern_parenthesized( + case: &MatchCase, + pattern: &Pattern, + context: &PyFormatContext, +) -> FormatResult { + let mut tokenizer = SimpleTokenizer::new( + context.source(), + TextRange::new(case.range().start(), pattern.range().start()), + ) + .skip_trivia(); + + let case_keyword = tokenizer.next().ok_or(FormatError::syntax_error( + "Expected a `case` keyword, didn't find any token", + ))?; + + debug_assert_eq!( + case_keyword.kind(), + SimpleTokenKind::Case, + "Expected `case` keyword but at {case_keyword:?}" + ); + + match tokenizer.next() { + Some(left_paren) => { + debug_assert_eq!(left_paren.kind(), SimpleTokenKind::LParen); + Ok(true) + } + None => Ok(false), + } +} diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_as.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_as.rs index efe8364e24..74a02a98e1 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_as.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_as.rs @@ -1,12 +1,19 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchAs; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatPatternMatchAs; impl FormatNodeRule for FormatPatternMatchAs { fn fmt_fields(&self, item: &PatternMatchAs, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!( + f, + [not_yet_implemented_custom_text( + "x as NOT_YET_IMPLEMENTED_PatternMatchAs", + item + )] + ) } } diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_class.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_class.rs index 4aeb063da4..6d8601b95e 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_class.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_class.rs @@ -1,12 +1,19 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchClass; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatPatternMatchClass; impl FormatNodeRule for FormatPatternMatchClass { fn fmt_fields(&self, item: &PatternMatchClass, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!( + f, + [not_yet_implemented_custom_text( + "NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0)", + item + )] + ) } } diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_mapping.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_mapping.rs index ea629eb9d9..a98abc4cc8 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_mapping.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_mapping.rs @@ -1,12 +1,19 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchMapping; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatPatternMatchMapping; impl FormatNodeRule for FormatPatternMatchMapping { fn fmt_fields(&self, item: &PatternMatchMapping, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!( + f, + [not_yet_implemented_custom_text( + "{\"NOT_YET_IMPLEMENTED_PatternMatchMapping\": _, 2: _}", + item + )] + ) } } diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_or.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_or.rs index be809d2056..ac19c02128 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_or.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_or.rs @@ -1,12 +1,19 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchOr; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatPatternMatchOr; impl FormatNodeRule for FormatPatternMatchOr { fn fmt_fields(&self, item: &PatternMatchOr, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!( + f, + [not_yet_implemented_custom_text( + "NOT_YET_IMPLEMENTED_PatternMatchOf | (y)", + item + )] + ) } } diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_sequence.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_sequence.rs index 7f5a9390eb..53599d14f8 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_sequence.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_sequence.rs @@ -1,12 +1,19 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchSequence; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatPatternMatchSequence; impl FormatNodeRule for FormatPatternMatchSequence { fn fmt_fields(&self, item: &PatternMatchSequence, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!( + f, + [not_yet_implemented_custom_text( + "[NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]", + item + )] + ) } } diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_singleton.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_singleton.rs index 0b06a2c56c..d3a19a3786 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_singleton.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_singleton.rs @@ -1,12 +1,13 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchSingleton; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatPatternMatchSingleton; impl FormatNodeRule for FormatPatternMatchSingleton { fn fmt_fields(&self, item: &PatternMatchSingleton, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!(f, [not_yet_implemented_custom_text("None", item)]) } } diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_star.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_star.rs index d7b457078d..613586752e 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_star.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_star.rs @@ -1,12 +1,19 @@ -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchStar; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; + #[derive(Default)] pub struct FormatPatternMatchStar; impl FormatNodeRule for FormatPatternMatchStar { fn fmt_fields(&self, item: &PatternMatchStar, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!( + f, + [not_yet_implemented_custom_text( + "*NOT_YET_IMPLEMENTED_PatternMatchStar", + item + )] + ) } } diff --git a/crates/ruff_python_formatter/src/pattern/pattern_match_value.rs b/crates/ruff_python_formatter/src/pattern/pattern_match_value.rs index 09d53faea4..8e824e8fe4 100644 --- a/crates/ruff_python_formatter/src/pattern/pattern_match_value.rs +++ b/crates/ruff_python_formatter/src/pattern/pattern_match_value.rs @@ -1,14 +1,19 @@ +use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::PatternMatchValue; -use ruff_formatter::{write, Buffer, FormatResult}; - -use crate::{not_yet_implemented, FormatNodeRule, PyFormatter}; +use crate::{not_yet_implemented_custom_text, FormatNodeRule, PyFormatter}; #[derive(Default)] pub struct FormatPatternMatchValue; impl FormatNodeRule for FormatPatternMatchValue { fn fmt_fields(&self, item: &PatternMatchValue, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [not_yet_implemented(item)]) + write!( + f, + [not_yet_implemented_custom_text( + "\"NOT_YET_IMPLEMENTED_PatternMatchValue\"", + item + )] + ) } } diff --git a/crates/ruff_python_formatter/src/statement/stmt_match.rs b/crates/ruff_python_formatter/src/statement/stmt_match.rs index 643204fafd..9c58fcfe27 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_match.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_match.rs @@ -51,11 +51,11 @@ impl FormatNodeRule for FormatStmtMatch { write!( f, [block_indent(&format_args!( - &leading_alternate_branch_comments( + leading_alternate_branch_comments( comments.leading_comments(case), last_case.body.last(), ), - &case.format() + case.format() ))] )?; last_case = case; diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap index 4f33ce6e7c..71e912b57a 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_complex.py.snap @@ -156,191 +156,190 @@ match x: ```diff --- Black +++ Ruff -@@ -2,143 +2,143 @@ +@@ -2,105 +2,105 @@ # case black_test_patma_098 match x: - case -0j: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_142 match x: - case bytes(z): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): y = 0 # case black_test_patma_073 match x: - case 0 if 0: -+ case NOT_YET_IMPLEMENTED_Pattern if 0: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue" if 0: y = 0 - case 0 if 1: -+ case NOT_YET_IMPLEMENTED_Pattern if 1: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue" if 1: y = 1 # case black_test_patma_006 match 3: - case 0 | 1 | 2 | 3: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): x = True # case black_test_patma_049 match x: - case [0, 1] | [1, 0]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): y = 0 # case black_check_sequence_then_mapping match x: - case [*_]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: return "seq" - case {}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: return "map" # case black_test_patma_035 match x: - case {0: [1, 2, {}]}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 0 - case {0: [1, 2, {}] | True} | {1: [[]]} | {0: [1, 2, {}]} | [] | "X" | {}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): y = 1 - case []: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 2 # case black_test_patma_107 match x: - case 0.25 + 1.75j: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_097 match x: - case -0j: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_007 match 4: - case 0 | 1 | 2 | 3: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): x = True # case black_test_patma_154 match x: - case 0 if x: -+ case NOT_YET_IMPLEMENTED_Pattern if x: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue" if x: y = 0 # case black_test_patma_134 match x: - case {1: 0}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 0 - case {0: 0}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 1 - case {**z}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 2 # case black_test_patma_185 match Seq(): - case [*_]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 # case black_test_patma_063 match x: - case 1: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 - case 1: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 1 # case black_test_patma_248 match x: - case {"foo": bar}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = bar # case black_test_patma_019 match (0, 1, 2): - case [0, 1, *x, 2]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 # case black_test_patma_052 match x: - case [0]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 - case [1, 0] if (x := x[:0]): -+ case NOT_YET_IMPLEMENTED_Pattern if (x := x[:0]): ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2] if (x := x[:0]): y = 1 - case [1, 0]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 2 # case black_test_patma_191 match w: - case [x, y, *_]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: z = 0 # case black_test_patma_110 match x: - case -0.25 - 1.75j: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_151 match (x,): - case [y]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: z = 0 # case black_test_patma_114 match x: - case A.B.C.D: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_232 match x: -- case None: -+ case NOT_YET_IMPLEMENTED_Pattern: +@@ -108,37 +108,37 @@ y = 0 # case black_test_patma_058 match x: - case 0: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_233 match x: - case False: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case None: y = 0 # case black_test_patma_078 match x: - case []: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 - case [""]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 1 - case "": -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 2 # case black_test_patma_156 match x: - case z: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: y = 0 # case black_test_patma_189 match w: - case [x, y, *rest]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: z = 0 # case black_test_patma_042 match x: - case (0 as z) | (1 as z) | (2 as z) if z == x % 2: -+ case NOT_YET_IMPLEMENTED_Pattern if z == x % 2: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y) if z == x % 2: y = 0 # case black_test_patma_034 match x: - case {0: [1, 2, {}]}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 0 - case {0: [1, 2, {}] | False} | {1: [[]]} | {0: [1, 2, {}]} | [] | "X" | {}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): y = 1 - case []: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 2 ``` @@ -351,145 +350,145 @@ match x: # case black_test_patma_098 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_142 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): y = 0 # case black_test_patma_073 match x: - case NOT_YET_IMPLEMENTED_Pattern if 0: + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if 0: y = 0 - case NOT_YET_IMPLEMENTED_Pattern if 1: + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if 1: y = 1 # case black_test_patma_006 match 3: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): x = True # case black_test_patma_049 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): y = 0 # case black_check_sequence_then_mapping match x: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: return "seq" - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: return "map" # case black_test_patma_035 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 0 - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): y = 1 - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 2 # case black_test_patma_107 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_097 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_007 match 4: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): x = True # case black_test_patma_154 match x: - case NOT_YET_IMPLEMENTED_Pattern if x: + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if x: y = 0 # case black_test_patma_134 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 0 - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 1 - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 2 # case black_test_patma_185 match Seq(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 # case black_test_patma_063 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 1 # case black_test_patma_248 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = bar # case black_test_patma_019 match (0, 1, 2): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 # case black_test_patma_052 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 - case NOT_YET_IMPLEMENTED_Pattern if (x := x[:0]): + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2] if (x := x[:0]): y = 1 - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 2 # case black_test_patma_191 match w: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: z = 0 # case black_test_patma_110 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_151 match (x,): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: z = 0 # case black_test_patma_114 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_232 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case None: y = 0 # case black_test_patma_058 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 # case black_test_patma_233 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case None: y = 0 # case black_test_patma_078 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 0 - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 1 - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 2 # case black_test_patma_156 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: y = 0 # case black_test_patma_189 match w: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: z = 0 # case black_test_patma_042 match x: - case NOT_YET_IMPLEMENTED_Pattern if z == x % 2: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y) if z == x % 2: y = 0 # case black_test_patma_034 match x: - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: y = 0 - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): y = 1 - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: y = 2 ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap index 0f09fd2007..942764211b 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap @@ -136,16 +136,16 @@ match bar1: match something: - case [a as b]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print(b) - case [a as b, c, d, e as f]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print(f) - case Point(a as b): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(b) - case Point(int() as x, int() as y): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(x, y) @@ -154,29 +154,29 @@ match bar1: match re.match(case): - case type("match", match): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass - case match: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass def func(match: case, case: match) -> case: match Something(): - case func(match, case): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): ... - case another: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: ... match maybe, multiple: - case perhaps, 5: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case perhaps, 6,: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass @@ -186,22 +186,22 @@ match bar1: + more := (than, one), + indeed, +): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case [[5], (6)], [7],: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case _: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match a, *b, c: - case [*_]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: assert "seq" == _ - case {}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: assert "map" == b @@ -215,27 +215,27 @@ match bar1: - loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong - ), - ): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass - case [a as match]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case case: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match match: - case case: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match a, *b(), c: - case d, *f, g: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass @@ -244,33 +244,33 @@ match bar1: - "key": key as key_1, - "password": PASS.ONE | PASS.TWO | PASS.THREE as password, - }: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: pass - case {"maybe": something(complicated as this) as that}: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: pass match something: - case 1 as a: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass - case 2 as b, 3 as c: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case 4 as d, (5 as e), (6 | 7 as g), *h: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass match bar1: - case Foo(aa=Callable() as aa, bb=int()): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(bar1.aa, bar1.bb) - case _: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: print("no match", "\n") @@ -278,7 +278,7 @@ match bar1: - case Foo( - normal=x, perhaps=[list, {"x": d, "y": 1.0}] as y, otherwise=something, q=t as u - ): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass ``` @@ -288,13 +288,13 @@ match bar1: import match match something: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print(b) - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print(f) - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(b) - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(x, y) @@ -302,24 +302,24 @@ match = 1 case: int = re.match(something) match re.match(case): - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass def func(match: case, case: match) -> case: match Something(): - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): ... - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: ... match maybe, multiple: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass @@ -327,18 +327,18 @@ match ( more := (than, one), indeed, ): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match a, *b, c: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: assert "seq" == _ - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: assert "map" == b @@ -349,53 +349,53 @@ match match( ), case, ): - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match match: - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match a, *b(), c: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass match something: - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: pass - case NOT_YET_IMPLEMENTED_Pattern: + case {"NOT_YET_IMPLEMENTED_PatternMatchMapping": _, 2: _}: pass match something: - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass match bar1: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(bar1.aa, bar1.bb) - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: print("no match", "\n") match bar1: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap index 64445949cb..5783c75da6 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_generic.py.snap @@ -124,10 +124,10 @@ with match() as match: match match: - case case: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: match match: - case case: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass if all(version.is_python2() for version in target_versions): @@ -136,7 +136,7 @@ with match() as match: x = False match x: - case bool(z): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): y = 0 self.assertIs(x, False) self.assertEqual(y, 0) @@ -145,7 +145,7 @@ with match() as match: y = None match x: - case 1e1000: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 self.assertEqual(x, 0) self.assertIs(y, None) @@ -153,7 +153,7 @@ with match() as match: x = range(3) match x: - case [y, case as x, z]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: w = 0 # At least one of the above branches must have been taken, because every Python @@ -188,9 +188,9 @@ def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]: ] match match: - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: match match: - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass if all(version.is_python2() for version in target_versions): @@ -210,7 +210,7 @@ def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]: def test_patma_139(self): x = False match x: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): y = 0 self.assertIs(x, False) self.assertEqual(y, 0) @@ -237,14 +237,14 @@ def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]: x = 0 y = None match x: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": y = 0 self.assertEqual(x, 0) self.assertIs(y, None) x = range(3) match x: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: w = 0 # At least one of the above branches must have been taken, because every Python diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap index 5226bfc31a..522535bd25 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_simple.py.snap @@ -109,123 +109,123 @@ def where_is(point): match command.split(): - case [action, obj]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: ... # interpret action, obj match command.split(): - case [action]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: ... # interpret single-verb action - case [action, obj]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: ... # interpret action, obj match command.split(): - case ["quit"]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Goodbye!") quit_game() - case ["look"]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room.describe() - case ["get", obj]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: character.get(obj, current_room) - case ["go", direction]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room = current_room.neighbor(direction) # The rest of your commands go here match command.split(): - case ["drop", *objects]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: for obj in objects: character.drop(obj, current_room) # The rest of your commands go here match command.split(): - case ["quit"]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case ["go", direction]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Going:", direction) - case ["drop", *objects]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Dropping: ", *objects) - case _: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: print(f"Sorry, I couldn't understand {command!r}") match command.split(): - case ["north"] | ["go", "north"]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): current_room = current_room.neighbor("north") - case ["get", obj] | ["pick", "up", obj] | ["pick", obj, "up"]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): ... # Code for picking up the given object match command.split(): - case ["go", ("north" | "south" | "east" | "west")]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room = current_room.neighbor(...) # how do I know which direction to go? match command.split(): - case ["go", ("north" | "south" | "east" | "west") as direction]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room = current_room.neighbor(direction) match command.split(): - case ["go", direction] if direction in current_room.exits: -+ case NOT_YET_IMPLEMENTED_Pattern if direction in current_room.exits: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2] if direction in current_room.exits: current_room = current_room.neighbor(direction) - case ["go", _]: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Sorry, you can't go that way") match event.get(): - case Click(position=(x, y)): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): handle_click_at(x, y) - case KeyPress(key_name="Q") | Quit(): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): game.quit() - case KeyPress(key_name="up arrow"): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): game.go_north() - case KeyPress(): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass # Ignore other keystrokes - case other_event: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: raise ValueError(f"Unrecognized event: {other_event}") match event.get(): - case Click((x, y), button=Button.LEFT): # This is a left click -+ case NOT_YET_IMPLEMENTED_Pattern: # This is a left click ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): # This is a left click handle_click_at(x, y) - case Click(): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass # ignore other clicks def where_is(point): match point: - case Point(x=0, y=0): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print("Origin") - case Point(x=0, y=y): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(f"Y={y}") - case Point(x=x, y=0): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(f"X={x}") - case Point(): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print("Somewhere else") - case _: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: print("Not a point") ``` @@ -235,94 +235,94 @@ def where_is(point): # Cases sampled from PEP 636 examples match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: ... # interpret action, obj match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: ... # interpret single-verb action - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: ... # interpret action, obj match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Goodbye!") quit_game() - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room.describe() - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: character.get(obj, current_room) - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room = current_room.neighbor(direction) # The rest of your commands go here match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: for obj in objects: character.drop(obj, current_room) # The rest of your commands go here match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Going:", direction) - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Dropping: ", *objects) - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: print(f"Sorry, I couldn't understand {command!r}") match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): current_room = current_room.neighbor("north") - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): ... # Code for picking up the given object match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room = current_room.neighbor(...) # how do I know which direction to go? match command.split(): - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: current_room = current_room.neighbor(direction) match command.split(): - case NOT_YET_IMPLEMENTED_Pattern if direction in current_room.exits: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2] if direction in current_room.exits: current_room = current_room.neighbor(direction) - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: print("Sorry, you can't go that way") match event.get(): - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): handle_click_at(x, y) - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchOf | (y): game.quit() - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): game.go_north() - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass # Ignore other keystrokes - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: raise ValueError(f"Unrecognized event: {other_event}") match event.get(): - case NOT_YET_IMPLEMENTED_Pattern: # This is a left click + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): # This is a left click handle_click_at(x, y) - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass # ignore other clicks def where_is(point): match point: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print("Origin") - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(f"Y={y}") - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(f"X={x}") - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print("Somewhere else") - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: print("Not a point") ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap index 6c268b7a02..74b37542ae 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_style.py.snap @@ -68,21 +68,21 @@ match match( @@ -1,35 +1,34 @@ match something: - case b(): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(1 + 1) - case c( - very_complex=True, perhaps_even_loooooooooooooooooooooooooooooooooooooong=-1 - ): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(1) - case c( - very_complex=True, - perhaps_even_loooooooooooooooooooooooooooooooooooooong=-1, - ): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(2) - case a: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass -match(arg) # comment @@ -113,7 +113,7 @@ match match( - case case( - arg, # comment - ): -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass ``` @@ -121,13 +121,13 @@ match match( ```py match something: - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(1 + 1) - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(1) - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): print(2) - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match( @@ -152,7 +152,7 @@ re.match( ) re.match() match match(): - case NOT_YET_IMPLEMENTED_Pattern: + case NOT_YET_IMPLEMENTED_PatternMatchClass(0, 0): pass ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap index 8bcbe70db7..061ae70d6f 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__remove_newline_after_match.py.snap @@ -35,19 +35,19 @@ def http_status(status): def http_status(status): match status: - case 400: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Bad request" - case 401: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Unauthorized" - case 403: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Forbidden" - case 404: -+ case NOT_YET_IMPLEMENTED_Pattern: ++ case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Not found" ``` @@ -56,16 +56,16 @@ def http_status(status): ```py def http_status(status): match status: - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Bad request" - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Unauthorized" - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Forbidden" - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": return "Not found" ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap index c4e92285b8..4a16d601bb 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_empty.py.snap @@ -139,10 +139,10 @@ with ( # d 1 pass match ( # d 2 ): - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match d3: - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass while ( # d 4 ): diff --git a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap index e61a056653..bf8a4b4478 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@parentheses__opening_parentheses_comment_value.py.snap @@ -219,10 +219,13 @@ with ( # d 1 match ( # d 2 x ): - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match d3: - case NOT_YET_IMPLEMENTED_Pattern: + case ( + # d 3 + x as NOT_YET_IMPLEMENTED_PatternMatchAs + ): pass while ( # d 4 x diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap index d1f903c8e7..56d1c9f008 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__match.py.snap @@ -114,13 +114,46 @@ match long_lines: bbbbbbbbaaaaaahhhh == 2 ): # another comment pass + + +match pattern_comments: + case ( + only_trailing # trailing 1 + # trailing 2 +# trailing 3 + ): + pass + + +match pattern_comments: + case ( # leading + only_leading + ): + pass + + +match pattern_comments: + case ( + # leading + leading_and_trailing # trailing 1 + # trailing 2 +# trailing 3 + ): + pass + + +match pattern_comments: + case ( + no_comments + ): + pass ``` ## Output ```py # leading match comment match foo: # dangling match comment - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": pass @@ -130,7 +163,7 @@ match ( # leading expr comment foo # trailing expr comment # another trailing expr comment ): # dangling match comment - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": pass @@ -138,7 +171,7 @@ match ( # leading expr comment match ( # hello foo, # trailing expr comment # another ): # dangling match comment - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": pass @@ -147,13 +180,13 @@ match [ # comment second, third, ]: # another comment - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass match ( # comment "a b c" ).split(): # another comment - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass @@ -161,65 +194,97 @@ match ( # comment # let's go yield foo ): # another comment - case NOT_YET_IMPLEMENTED_Pattern: + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2]: pass match aaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh: # comment - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": pass def foo(): match inside_func: # comment - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": pass match newlines: # case 1 leading comment - case NOT_YET_IMPLEMENTED_Pattern: # case dangling comment + case "NOT_YET_IMPLEMENTED_PatternMatchValue": # case dangling comment # pass leading comment pass # pass trailing comment # case 2 leading comment - case NOT_YET_IMPLEMENTED_Pattern if foo == 2: # second + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if foo == 2: # second pass - case NOT_YET_IMPLEMENTED_Pattern if (foo := 1): # third + case [NOT_YET_IMPLEMENTED_PatternMatchSequence, 2] if (foo := 1): # third pass - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": pass - case NOT_YET_IMPLEMENTED_Pattern: + case "NOT_YET_IMPLEMENTED_PatternMatchValue": pass - case NOT_YET_IMPLEMENTED_Pattern: + case x as NOT_YET_IMPLEMENTED_PatternMatchAs: pass match long_lines: - case NOT_YET_IMPLEMENTED_Pattern if aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2: # comment + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2: # comment pass - case NOT_YET_IMPLEMENTED_Pattern if ( + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if ( aaaaaaaaahhhhhhhh == 1 and bbbbbbaaaaaaaaaaa == 2 ): # comment pass - case NOT_YET_IMPLEMENTED_Pattern if foo := 1: + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if foo := 1: pass - case NOT_YET_IMPLEMENTED_Pattern if (foo := 1): + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if (foo := 1): pass - case NOT_YET_IMPLEMENTED_Pattern if ( + case "NOT_YET_IMPLEMENTED_PatternMatchValue" if ( aaaaaaahhhhhhhhhhh == 1 and bbbbbbbbaaaaaahhhh == 2 ): # another comment pass + + +match pattern_comments: + case ( + x as NOT_YET_IMPLEMENTED_PatternMatchAs # trailing 1 + # trailing 2 + # trailing 3 + ): + pass + + +match pattern_comments: + case ( + # leading + x as NOT_YET_IMPLEMENTED_PatternMatchAs + ): + pass + + +match pattern_comments: + case ( + # leading + x as NOT_YET_IMPLEMENTED_PatternMatchAs # trailing 1 + # trailing 2 + # trailing 3 + ): + pass + + +match pattern_comments: + case (x as NOT_YET_IMPLEMENTED_PatternMatchAs): + pass ``` From d9a81f4fbb9b72119b453e73e84f3262c9bb36aa Mon Sep 17 00:00:00 2001 From: Harutaka Kawamura Date: Wed, 16 Aug 2023 12:35:46 +0900 Subject: [PATCH 141/155] [`flake8-pytest-style`] Implement duplicate parameterized fixture detection (`PT014`) (#6598) --- .../fixtures/flake8_pytest_style/PT014.py | 26 ++++++ .../src/checkers/ast/analyze/statement.rs | 1 + crates/ruff/src/codes.rs | 1 + .../ruff/src/rules/flake8_pytest_style/mod.rs | 6 ++ .../flake8_pytest_style/rules/parametrize.rs | 85 +++++++++++++++++++ ...es__flake8_pytest_style__tests__PT014.snap | 44 ++++++++++ ruff.schema.json | 1 + 7 files changed, 164 insertions(+) create mode 100644 crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py create mode 100644 crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT014.snap diff --git a/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py new file mode 100644 index 0000000000..e81cbc15f5 --- /dev/null +++ b/crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py @@ -0,0 +1,26 @@ +import pytest + + +@pytest.mark.parametrize("x", [1, 1, 2]) +def test_error_literal(x): + ... + + +a = 1 +b = 2 +c = 3 + + +@pytest.mark.parametrize("x", [a, a, b, b, b, c]) +def test_error_expr_simple(x): + ... + + +@pytest.mark.parametrize("x", [(a, b), (a, b), (b, c)]) +def test_error_expr_complex(x): + ... + + +@pytest.mark.parametrize("x", [1, 2]) +def test_ok(x): + ... diff --git a/crates/ruff/src/checkers/ast/analyze/statement.rs b/crates/ruff/src/checkers/ast/analyze/statement.rs index aeb82605fd..7518c07523 100644 --- a/crates/ruff/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff/src/checkers/ast/analyze/statement.rs @@ -300,6 +300,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { if checker.any_enabled(&[ Rule::PytestParametrizeNamesWrongType, Rule::PytestParametrizeValuesWrongType, + Rule::PytestDuplicateParametrizeTestCases, ]) { flake8_pytest_style::rules::parametrize(checker, decorator_list); } diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs index 79add843bc..8d011aafa1 100644 --- a/crates/ruff/src/codes.rs +++ b/crates/ruff/src/codes.rs @@ -685,6 +685,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { (Flake8PytestStyle, "011") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestRaisesTooBroad), (Flake8PytestStyle, "012") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestRaisesWithMultipleStatements), (Flake8PytestStyle, "013") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestIncorrectPytestImport), + (Flake8PytestStyle, "014") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestDuplicateParametrizeTestCases), (Flake8PytestStyle, "015") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestAssertAlwaysFalse), (Flake8PytestStyle, "016") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestFailWithoutMessage), (Flake8PytestStyle, "017") => (RuleGroup::Unspecified, rules::flake8_pytest_style::rules::PytestAssertInExcept), diff --git a/crates/ruff/src/rules/flake8_pytest_style/mod.rs b/crates/ruff/src/rules/flake8_pytest_style/mod.rs index 023ba3d23e..faa28606eb 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/mod.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/mod.rs @@ -169,6 +169,12 @@ mod tests { Settings::default(), "PT013" )] + #[test_case( + Rule::PytestDuplicateParametrizeTestCases, + Path::new("PT014.py"), + Settings::default(), + "PT014" + )] #[test_case( Rule::PytestAssertAlwaysFalse, Path::new("PT015.py"), diff --git a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs index 931e8e6107..9165aef160 100644 --- a/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs +++ b/crates/ruff/src/rules/flake8_pytest_style/rules/parametrize.rs @@ -1,3 +1,6 @@ +use rustc_hash::FxHashMap; +use std::hash::BuildHasherDefault; + use ruff_python_ast::{ self as ast, Arguments, Constant, Decorator, Expr, ExprContext, PySourceType, Ranged, }; @@ -6,6 +9,7 @@ use ruff_text_size::TextRange; use ruff_diagnostics::{AutofixKind, Diagnostic, Edit, Fix, Violation}; use ruff_macros::{derive_message_formats, violation}; +use ruff_python_ast::comparable::ComparableExpr; use ruff_python_codegen::Generator; use ruff_source_file::Locator; @@ -166,6 +170,58 @@ impl Violation for PytestParametrizeValuesWrongType { } } +/// ## What it does +/// Checks for duplicate test cases in `pytest.mark.parametrize`. +/// +/// ## Why is this bad? +/// Duplicate test cases are redundant and should be removed. +/// +/// ## Example +/// ```python +/// import pytest +/// +/// +/// @pytest.mark.parametrize( +/// ("param1", "param2"), +/// [ +/// (1, 2), +/// (1, 2), +/// ], +/// ) +/// def test_foo(param1, param2): +/// ... +/// ``` +/// +/// Use instead: +/// ```python +/// import pytest +/// +/// +/// @pytest.mark.parametrize( +/// ("param1", "param2"), +/// [ +/// (1, 2), +/// ], +/// ) +/// def test_foo(param1, param2): +/// ... +/// ``` +/// +/// ## References +/// - [`pytest` documentation: How to parametrize fixtures and test functions](https://docs.pytest.org/en/latest/how-to/parametrize.html#pytest-mark-parametrize) +#[violation] +pub struct PytestDuplicateParametrizeTestCases { + index: usize, +} + +impl Violation for PytestDuplicateParametrizeTestCases { + #[derive_message_formats] + fn message(&self) -> String { + let PytestDuplicateParametrizeTestCases { index } = self; + format!("Duplicate of test case at index {index} in `@pytest_mark.parametrize`") + } +} + fn elts_to_csv(elts: &[Expr], generator: Generator) -> Option { let all_literals = elts.iter().all(|expr| { matches!( @@ -472,6 +528,7 @@ fn check_values(checker: &mut Checker, names: &Expr, values: &Expr) { values.range(), )); } + if is_multi_named { handle_value_rows(checker, elts, values_type, values_row_type); } @@ -494,6 +551,29 @@ fn check_values(checker: &mut Checker, names: &Expr, values: &Expr) { } } +/// PT014 +fn check_duplicates(checker: &mut Checker, values: &Expr) { + let (Expr::List(ast::ExprList { elts, .. }) | Expr::Tuple(ast::ExprTuple { elts, .. })) = + values + else { + return; + }; + + let mut seen: FxHashMap = + FxHashMap::with_capacity_and_hasher(elts.len(), BuildHasherDefault::default()); + for (index, elt) in elts.iter().enumerate() { + let expr = ComparableExpr::from(elt); + seen.entry(expr) + .and_modify(|index| { + checker.diagnostics.push(Diagnostic::new( + PytestDuplicateParametrizeTestCases { index: *index }, + elt.range(), + )); + }) + .or_insert(index); + } +} + fn handle_single_name(checker: &mut Checker, expr: &Expr, value: &Expr) { let mut diagnostic = Diagnostic::new( PytestParametrizeNamesWrongType { @@ -567,6 +647,11 @@ pub(crate) fn parametrize(checker: &mut Checker, decorators: &[Decorator]) { } } } + if checker.enabled(Rule::PytestDuplicateParametrizeTestCases) { + if let [_, values, ..] = &args[..] { + check_duplicates(checker, values); + } + } } } } diff --git a/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT014.snap b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT014.snap new file mode 100644 index 0000000000..45369f5551 --- /dev/null +++ b/crates/ruff/src/rules/flake8_pytest_style/snapshots/ruff__rules__flake8_pytest_style__tests__PT014.snap @@ -0,0 +1,44 @@ +--- +source: crates/ruff/src/rules/flake8_pytest_style/mod.rs +--- +PT014.py:4:35: PT014 Duplicate of test case at index 0 in `@pytest_mark.parametrize` + | +4 | @pytest.mark.parametrize("x", [1, 1, 2]) + | ^ PT014 +5 | def test_error_literal(x): +6 | ... + | + +PT014.py:14:35: PT014 Duplicate of test case at index 0 in `@pytest_mark.parametrize` + | +14 | @pytest.mark.parametrize("x", [a, a, b, b, b, c]) + | ^ PT014 +15 | def test_error_expr_simple(x): +16 | ... + | + +PT014.py:14:41: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize` + | +14 | @pytest.mark.parametrize("x", [a, a, b, b, b, c]) + | ^ PT014 +15 | def test_error_expr_simple(x): +16 | ... + | + +PT014.py:14:44: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize` + | +14 | @pytest.mark.parametrize("x", [a, a, b, b, b, c]) + | ^ PT014 +15 | def test_error_expr_simple(x): +16 | ... + | + +PT014.py:19:40: PT014 Duplicate of test case at index 0 in `@pytest_mark.parametrize` + | +19 | @pytest.mark.parametrize("x", [(a, b), (a, b), (b, c)]) + | ^^^^^^ PT014 +20 | def test_error_expr_complex(x): +21 | ... + | + + diff --git a/ruff.schema.json b/ruff.schema.json index ed2098be3e..04ccd6b10f 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -2322,6 +2322,7 @@ "PT011", "PT012", "PT013", + "PT014", "PT015", "PT016", "PT017", From 2d86e78bfc6e8bd0a98164671973cf7fa5186ab6 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 15 Aug 2023 23:59:05 -0400 Subject: [PATCH 142/155] Allow top-level `await` in Jupyter notebooks (#6607) ## Summary Top-level `await` is allowed in Jupyter notebooks (see: [autoawait](https://ipython.readthedocs.io/en/stable/interactive/autoawait.html)). Closes https://github.com/astral-sh/ruff/issues/6584. ## Test Plan Had to test this manually. Created a notebook, verified that the `yield` was flagged but the `await` was not. Screen Shot 2023-08-15 at 11 40 19 PM --- .../pyflakes/rules/yield_outside_function.rs | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs b/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs index 1aed996b7e..c5a7c5bc42 100644 --- a/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs +++ b/crates/ruff/src/rules/pyflakes/rules/yield_outside_function.rs @@ -1,10 +1,8 @@ use std::fmt; -use ruff_python_ast::{Expr, Ranged}; - use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; -use ruff_python_semantic::ScopeKind; +use ruff_python_ast::{Expr, Ranged}; use crate::checkers::ast::Checker; @@ -26,12 +24,15 @@ impl fmt::Display for DeferralKeyword { } /// ## What it does -/// Checks for `yield` and `yield from` statements outside of functions. +/// Checks for `yield`, `yield from`, and `await` usages outside of functions. /// /// ## Why is this bad? -/// The use of a `yield` or `yield from` statement outside of a function will +/// The use of `yield`, `yield from`, or `await` outside of a function will /// raise a `SyntaxError`. /// +/// As an exception, `await` is allowed at the top level of a Jupyter notebook +/// (see: [autoawait]). +/// /// ## Example /// ```python /// class Foo: @@ -40,6 +41,8 @@ impl fmt::Display for DeferralKeyword { /// /// ## References /// - [Python documentation: `yield`](https://docs.python.org/3/reference/simple_stmts.html#the-yield-statement) +/// +/// [autoawait]: https://ipython.readthedocs.io/en/stable/interactive/autoawait.html #[violation] pub struct YieldOutsideFunction { keyword: DeferralKeyword, @@ -53,17 +56,26 @@ impl Violation for YieldOutsideFunction { } } +/// F704 pub(crate) fn yield_outside_function(checker: &mut Checker, expr: &Expr) { - if matches!( - checker.semantic().current_scope().kind, - ScopeKind::Class(_) | ScopeKind::Module - ) { + let scope = checker.semantic().current_scope(); + if scope.kind.is_module() || scope.kind.is_class() { let keyword = match expr { Expr::Yield(_) => DeferralKeyword::Yield, Expr::YieldFrom(_) => DeferralKeyword::YieldFrom, Expr::Await(_) => DeferralKeyword::Await, _ => return, }; + + // `await` is allowed at the top level of a Jupyter notebook. + // See: https://ipython.readthedocs.io/en/stable/interactive/autoawait.html. + if scope.kind.is_module() + && checker.source_type.is_jupyter() + && keyword == DeferralKeyword::Await + { + return; + } + checker.diagnostics.push(Diagnostic::new( YieldOutsideFunction { keyword }, expr.range(), From e28858bb29b1f3f51aca4e69201992db771a7116 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Wed, 16 Aug 2023 10:22:44 +0200 Subject: [PATCH 143/155] Fast path for ASCII only identifiers start (#6609) --- crates/ruff_python_formatter/src/lib.rs | 25 ++++++++++++++-------- crates/ruff_python_trivia/src/tokenizer.rs | 10 ++++----- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs index 80494d4626..b6b96f506b 100644 --- a/crates/ruff_python_formatter/src/lib.rs +++ b/crates/ruff_python_formatter/src/lib.rs @@ -50,17 +50,24 @@ where let node_comments = comments.leading_dangling_trailing_comments(node.as_any_node_ref()); - leading_comments(node_comments.leading).fmt(f)?; - self.fmt_node(node, f)?; - self.fmt_dangling_comments(node_comments.dangling, f)?; - trailing_comments(node_comments.trailing).fmt(f) - } + write!( + f, + [ + leading_comments(node_comments.leading), + source_position(node.start()) + ] + )?; - /// Formats the node without comments. Ignores any suppression comments. - fn fmt_node(&self, node: &N, f: &mut PyFormatter) -> FormatResult<()> { - write!(f, [source_position(node.start())])?; self.fmt_fields(node, f)?; - write!(f, [source_position(node.end())]) + self.fmt_dangling_comments(node_comments.dangling, f)?; + + write!( + f, + [ + source_position(node.end()), + trailing_comments(node_comments.trailing) + ] + ) } /// Formats the node's fields. diff --git a/crates/ruff_python_trivia/src/tokenizer.rs b/crates/ruff_python_trivia/src/tokenizer.rs index 7aef8b947d..6da3e5d779 100644 --- a/crates/ruff_python_trivia/src/tokenizer.rs +++ b/crates/ruff_python_trivia/src/tokenizer.rs @@ -85,7 +85,11 @@ pub fn lines_after_ignoring_trivia(offset: TextSize, code: &str) -> u32 { } fn is_identifier_start(c: char) -> bool { - c.is_ascii_alphabetic() || c == '_' || is_non_ascii_identifier_start(c) + if c.is_ascii() { + c.is_ascii_alphabetic() || c == '_' + } else { + is_xid_start(c) + } } // Checks if the character c is a valid continuation character as described @@ -98,10 +102,6 @@ fn is_identifier_continuation(c: char) -> bool { } } -fn is_non_ascii_identifier_start(c: char) -> bool { - is_xid_start(c) -} - #[derive(Clone, Debug, Eq, PartialEq, Hash)] pub struct SimpleToken { pub kind: SimpleTokenKind, From 86ccdcc9d99086b15e86f3d07b83d39a9422069d Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 09:09:19 -0400 Subject: [PATCH 144/155] Add support for multi-character operator tokens to `SimpleTokenizer` (#6563) ## Summary Allows for proper lexing of tokens like `->`. The main challenge is to ensure that our forward and backwards representations are the same for cases like `===`. Specifically, we want that to lex as `==` followed by `=` regardless of whether it's a forwards or backwards lex. To do so, we identify the range of the sequential characters (the full span of `===`), lex it forwards, then return the last token. ## Test Plan `cargo test` --- .../src/comments/placement.rs | 36 +- crates/ruff_python_trivia/src/cursor.rs | 8 + ...tokenizer__tests__tokenize_characters.snap | 46 -- ...trivia__tokenizer__tests__tokenize_eq.snap | 14 + ...er__tests__tokenize_invalid_operators.snap | 22 + ...ia__tokenizer__tests__tokenize_not_eq.snap | 14 + ..._tokenizer__tests__tokenize_operators.snap | 106 +++++ crates/ruff_python_trivia/src/tokenizer.rs | 441 +++++++++++++++--- 8 files changed, 538 insertions(+), 149 deletions(-) delete mode 100644 crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap create mode 100644 crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_eq.snap create mode 100644 crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_invalid_operators.snap create mode 100644 crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_not_eq.snap create mode 100644 crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_operators.snap diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index cc8dc569b5..ec38633573 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -951,39 +951,11 @@ fn handle_dict_unpacking_comment<'a>( // if the remaining tokens from the previous node are exactly `**`, // re-assign the comment to the one that follows the stars - let mut count = 0u32; - - // we start from the preceding node but we skip its token - if let Some(token) = tokens.next() { - // The Keyword case - if token.kind == SimpleTokenKind::Star { - count += 1; - } else { - // The dict case - debug_assert!( - matches!( - token, - SimpleToken { - kind: SimpleTokenKind::LBrace - | SimpleTokenKind::Comma - | SimpleTokenKind::Colon, - .. - } - ), - "{token:?}", - ); - } + if tokens.any(|token| token.kind == SimpleTokenKind::DoubleStar) { + CommentPlacement::trailing(following, comment) + } else { + CommentPlacement::Default(comment) } - - for token in tokens { - debug_assert!(token.kind == SimpleTokenKind::Star, "Expected star token"); - count += 1; - } - if count == 2 { - return CommentPlacement::trailing(following, comment); - } - - CommentPlacement::Default(comment) } /// Own line comments coming after the node are always dangling comments diff --git a/crates/ruff_python_trivia/src/cursor.rs b/crates/ruff_python_trivia/src/cursor.rs index 43a750cb4f..336720269c 100644 --- a/crates/ruff_python_trivia/src/cursor.rs +++ b/crates/ruff_python_trivia/src/cursor.rs @@ -30,6 +30,14 @@ impl<'a> Cursor<'a> { self.chars.clone().next().unwrap_or(EOF_CHAR) } + /// Peeks the second character from the input stream without consuming it. + /// Returns [`EOF_CHAR`] if the position is past the end of the file. + pub fn second(&self) -> char { + let mut chars = self.chars.clone(); + chars.next(); + chars.next().unwrap_or(EOF_CHAR) + } + /// Peeks the next character from the input stream without consuming it. /// Returns [`EOF_CHAR`] if the file is at the end of the file. pub fn last(&self) -> char { diff --git a/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap deleted file mode 100644 index 0dcdad5d26..0000000000 --- a/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_characters.snap +++ /dev/null @@ -1,46 +0,0 @@ ---- -source: crates/ruff_python_trivia/src/tokenizer.rs -expression: test_case.tokens() ---- -[ - SimpleToken { - kind: Minus, - range: 0..1, - }, - SimpleToken { - kind: Greater, - range: 1..2, - }, - SimpleToken { - kind: Whitespace, - range: 2..3, - }, - SimpleToken { - kind: Star, - range: 3..4, - }, - SimpleToken { - kind: Equals, - range: 4..5, - }, - SimpleToken { - kind: Whitespace, - range: 5..6, - }, - SimpleToken { - kind: LParen, - range: 6..7, - }, - SimpleToken { - kind: Tilde, - range: 7..8, - }, - SimpleToken { - kind: Equals, - range: 8..9, - }, - SimpleToken { - kind: RParen, - range: 9..10, - }, -] diff --git a/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_eq.snap b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_eq.snap new file mode 100644 index 0000000000..26f9c5ae2c --- /dev/null +++ b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_eq.snap @@ -0,0 +1,14 @@ +--- +source: crates/ruff_python_trivia/src/tokenizer.rs +expression: test_case.tokens() +--- +[ + SimpleToken { + kind: EqEqual, + range: 0..2, + }, + SimpleToken { + kind: Equals, + range: 2..3, + }, +] diff --git a/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_invalid_operators.snap b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_invalid_operators.snap new file mode 100644 index 0000000000..cee59e0ba3 --- /dev/null +++ b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_invalid_operators.snap @@ -0,0 +1,22 @@ +--- +source: crates/ruff_python_trivia/src/tokenizer.rs +expression: test_case.tokens() +--- +[ + SimpleToken { + kind: RArrow, + range: 0..2, + }, + SimpleToken { + kind: Whitespace, + range: 2..3, + }, + SimpleToken { + kind: Other, + range: 3..4, + }, + SimpleToken { + kind: Bogus, + range: 4..5, + }, +] diff --git a/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_not_eq.snap b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_not_eq.snap new file mode 100644 index 0000000000..00a7d9c1fc --- /dev/null +++ b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_not_eq.snap @@ -0,0 +1,14 @@ +--- +source: crates/ruff_python_trivia/src/tokenizer.rs +expression: test_case.tokens() +--- +[ + SimpleToken { + kind: NotEqual, + range: 0..2, + }, + SimpleToken { + kind: Equals, + range: 2..3, + }, +] diff --git a/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_operators.snap b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_operators.snap new file mode 100644 index 0000000000..f0f92f80c0 --- /dev/null +++ b/crates/ruff_python_trivia/src/snapshots/ruff_python_trivia__tokenizer__tests__tokenize_operators.snap @@ -0,0 +1,106 @@ +--- +source: crates/ruff_python_trivia/src/tokenizer.rs +expression: test_case.tokens() +--- +[ + SimpleToken { + kind: RArrow, + range: 0..2, + }, + SimpleToken { + kind: Whitespace, + range: 2..3, + }, + SimpleToken { + kind: StarEqual, + range: 3..5, + }, + SimpleToken { + kind: Whitespace, + range: 5..6, + }, + SimpleToken { + kind: LParen, + range: 6..7, + }, + SimpleToken { + kind: Whitespace, + range: 7..8, + }, + SimpleToken { + kind: MinusEqual, + range: 8..10, + }, + SimpleToken { + kind: Whitespace, + range: 10..11, + }, + SimpleToken { + kind: RParen, + range: 11..12, + }, + SimpleToken { + kind: Whitespace, + range: 12..13, + }, + SimpleToken { + kind: Tilde, + range: 13..14, + }, + SimpleToken { + kind: Whitespace, + range: 14..15, + }, + SimpleToken { + kind: DoubleSlash, + range: 15..17, + }, + SimpleToken { + kind: Whitespace, + range: 17..18, + }, + SimpleToken { + kind: DoubleStar, + range: 18..20, + }, + SimpleToken { + kind: Whitespace, + range: 20..21, + }, + SimpleToken { + kind: DoubleStarEqual, + range: 21..24, + }, + SimpleToken { + kind: Whitespace, + range: 24..25, + }, + SimpleToken { + kind: Circumflex, + range: 25..26, + }, + SimpleToken { + kind: Whitespace, + range: 26..27, + }, + SimpleToken { + kind: CircumflexEqual, + range: 27..29, + }, + SimpleToken { + kind: Whitespace, + range: 29..30, + }, + SimpleToken { + kind: Vbar, + range: 30..31, + }, + SimpleToken { + kind: Whitespace, + range: 31..32, + }, + SimpleToken { + kind: VbarEqual, + range: 32..34, + }, +] diff --git a/crates/ruff_python_trivia/src/tokenizer.rs b/crates/ruff_python_trivia/src/tokenizer.rs index 6da3e5d779..d767e1d59e 100644 --- a/crates/ruff_python_trivia/src/tokenizer.rs +++ b/crates/ruff_python_trivia/src/tokenizer.rs @@ -1,7 +1,8 @@ use memchr::{memchr2, memchr3, memrchr3_iter}; -use ruff_text_size::{TextLen, TextRange, TextSize}; use unic_ucd_ident::{is_xid_continue, is_xid_start}; +use ruff_text_size::{TextLen, TextRange, TextSize}; + use crate::{is_python_whitespace, Cursor}; /// Searches for the first non-trivia character in `range`. @@ -213,6 +214,78 @@ pub enum SimpleTokenKind { /// `~` Tilde, + /// `==` + EqEqual, + + /// `!=` + NotEqual, + + /// `<=` + LessEqual, + + /// `>=` + GreaterEqual, + + /// `<<` + LeftShift, + + /// `>>` + RightShift, + + /// `**` + DoubleStar, + + /// `**=` + DoubleStarEqual, + + /// `+=` + PlusEqual, + + /// `-=` + MinusEqual, + + /// `*=` + StarEqual, + + /// `/=` + SlashEqual, + + /// `%=` + PercentEqual, + + /// `&=` + AmperEqual, + + /// `|=` + VbarEqual, + + /// `^=` + CircumflexEqual, + + /// `<<=` + LeftShiftEqual, + + /// `>>=` + RightShiftEqual, + + /// `//` + DoubleSlash, + + /// `//=` + DoubleSlashEqual, + + /// `:=` + ColonEqual, + + /// `...` + Ellipsis, + + /// `@=` + AtEqual, + + /// `->` + RArrow, + /// `and` And, @@ -326,35 +399,6 @@ pub enum SimpleTokenKind { } impl SimpleTokenKind { - const fn from_non_trivia_char(c: char) -> SimpleTokenKind { - match c { - '(' => SimpleTokenKind::LParen, - ')' => SimpleTokenKind::RParen, - '[' => SimpleTokenKind::LBracket, - ']' => SimpleTokenKind::RBracket, - '{' => SimpleTokenKind::LBrace, - '}' => SimpleTokenKind::RBrace, - ',' => SimpleTokenKind::Comma, - ':' => SimpleTokenKind::Colon, - ';' => SimpleTokenKind::Semi, - '/' => SimpleTokenKind::Slash, - '*' => SimpleTokenKind::Star, - '.' => SimpleTokenKind::Dot, - '+' => SimpleTokenKind::Plus, - '-' => SimpleTokenKind::Minus, - '=' => SimpleTokenKind::Equals, - '>' => SimpleTokenKind::Greater, - '<' => SimpleTokenKind::Less, - '%' => SimpleTokenKind::Percent, - '&' => SimpleTokenKind::Ampersand, - '^' => SimpleTokenKind::Circumflex, - '|' => SimpleTokenKind::Vbar, - '@' => SimpleTokenKind::At, - '~' => SimpleTokenKind::Tilde, - _ => SimpleTokenKind::Other, - } - } - const fn is_trivia(self) -> bool { matches!( self, @@ -478,6 +522,20 @@ impl<'a> SimpleTokenizer<'a> { } let kind = match first { + // Keywords and identifiers + c if is_identifier_start(c) => { + self.cursor.eat_while(is_identifier_continuation); + let token_len = self.cursor.token_len(); + + let range = TextRange::at(self.offset, token_len); + let kind = self.to_keyword_or_other(range); + + if kind == SimpleTokenKind::Other { + self.bogus = true; + } + kind + } + ' ' | '\t' => { self.cursor.eat_while(|c| matches!(c, ' ' | '\t')); SimpleTokenKind::Whitespace @@ -497,21 +555,156 @@ impl<'a> SimpleTokenizer<'a> { '\\' => SimpleTokenKind::Continuation, - c => { - let kind = if is_identifier_start(c) { - self.cursor.eat_while(is_identifier_continuation); - let token_len = self.cursor.token_len(); - - let range = TextRange::at(self.offset, token_len); - self.to_keyword_or_other(range) + // Non-trivia, non-keyword tokens + '=' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::EqEqual } else { - SimpleTokenKind::from_non_trivia_char(c) - }; - - if kind == SimpleTokenKind::Other { - self.bogus = true; + SimpleTokenKind::Equals } - kind + } + '+' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::PlusEqual + } else { + SimpleTokenKind::Plus + } + } + '*' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::StarEqual + } else if self.cursor.eat_char('*') { + if self.cursor.eat_char('=') { + SimpleTokenKind::DoubleStarEqual + } else { + SimpleTokenKind::DoubleStar + } + } else { + SimpleTokenKind::Star + } + } + '/' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::SlashEqual + } else if self.cursor.eat_char('/') { + if self.cursor.eat_char('=') { + SimpleTokenKind::DoubleSlashEqual + } else { + SimpleTokenKind::DoubleSlash + } + } else { + SimpleTokenKind::Slash + } + } + '%' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::PercentEqual + } else { + SimpleTokenKind::Percent + } + } + '|' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::VbarEqual + } else { + SimpleTokenKind::Vbar + } + } + '^' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::CircumflexEqual + } else { + SimpleTokenKind::Circumflex + } + } + '&' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::AmperEqual + } else { + SimpleTokenKind::Ampersand + } + } + '-' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::MinusEqual + } else if self.cursor.eat_char('>') { + SimpleTokenKind::RArrow + } else { + SimpleTokenKind::Minus + } + } + '@' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::AtEqual + } else { + SimpleTokenKind::At + } + } + '!' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::NotEqual + } else { + self.bogus = true; + SimpleTokenKind::Other + } + } + '~' => SimpleTokenKind::Tilde, + ':' => { + if self.cursor.eat_char('=') { + SimpleTokenKind::ColonEqual + } else { + SimpleTokenKind::Colon + } + } + ';' => SimpleTokenKind::Semi, + '<' => { + if self.cursor.eat_char('<') { + if self.cursor.eat_char('=') { + SimpleTokenKind::LeftShiftEqual + } else { + SimpleTokenKind::LeftShift + } + } else if self.cursor.eat_char('=') { + SimpleTokenKind::LessEqual + } else { + SimpleTokenKind::Less + } + } + '>' => { + if self.cursor.eat_char('>') { + if self.cursor.eat_char('=') { + SimpleTokenKind::RightShiftEqual + } else { + SimpleTokenKind::RightShift + } + } else if self.cursor.eat_char('=') { + SimpleTokenKind::GreaterEqual + } else { + SimpleTokenKind::Greater + } + } + ',' => SimpleTokenKind::Comma, + '.' => { + if self.cursor.first() == '.' && self.cursor.second() == '.' { + self.cursor.bump(); + self.cursor.bump(); + SimpleTokenKind::Ellipsis + } else { + SimpleTokenKind::Dot + } + } + + // Bracket tokens + '(' => SimpleTokenKind::LParen, + ')' => SimpleTokenKind::RParen, + '[' => SimpleTokenKind::LBracket, + ']' => SimpleTokenKind::RBracket, + '{' => SimpleTokenKind::LBrace, + '}' => SimpleTokenKind::RBrace, + + _ => { + self.bogus = true; + SimpleTokenKind::Other } }; @@ -612,38 +805,108 @@ impl<'a> SimpleTokenizer<'a> { } SimpleTokenKind::Comment - } else if c == '\\' { - SimpleTokenKind::Continuation } else { - let kind = if is_identifier_continuation(c) { - // if we only have identifier continuations but no start (e.g. 555) we - // don't want to consume the chars, so in that case, we want to rewind the - // cursor to here - let savepoint = self.cursor.clone(); - self.cursor.eat_back_while(is_identifier_continuation); + match c { + // Keywords and identifiers + c if is_identifier_continuation(c) => { + // if we only have identifier continuations but no start (e.g. 555) we + // don't want to consume the chars, so in that case, we want to rewind the + // cursor to here + let savepoint = self.cursor.clone(); + self.cursor.eat_back_while(is_identifier_continuation); - let token_len = self.cursor.token_len(); - let range = TextRange::at(self.back_offset - token_len, token_len); + let token_len = self.cursor.token_len(); + let range = TextRange::at(self.back_offset - token_len, token_len); - if self.source[range] - .chars() - .next() - .is_some_and(is_identifier_start) - { - self.to_keyword_or_other(range) - } else { - self.cursor = savepoint; + if self.source[range] + .chars() + .next() + .is_some_and(is_identifier_start) + { + self.to_keyword_or_other(range) + } else { + self.cursor = savepoint; + self.bogus = true; + SimpleTokenKind::Other + } + } + + // Non-trivia tokens that are unambiguous when lexing backwards. + // In other words: these are characters that _don't_ appear at the + // end of a multi-character token (like `!=`). + '\\' => SimpleTokenKind::Continuation, + ':' => SimpleTokenKind::Colon, + '~' => SimpleTokenKind::Tilde, + '%' => SimpleTokenKind::Percent, + '|' => SimpleTokenKind::Vbar, + ',' => SimpleTokenKind::Comma, + ';' => SimpleTokenKind::Semi, + '(' => SimpleTokenKind::LParen, + ')' => SimpleTokenKind::RParen, + '[' => SimpleTokenKind::LBracket, + ']' => SimpleTokenKind::RBracket, + '{' => SimpleTokenKind::LBrace, + '}' => SimpleTokenKind::RBrace, + '&' => SimpleTokenKind::Ampersand, + '^' => SimpleTokenKind::Circumflex, + '+' => SimpleTokenKind::Plus, + '-' => SimpleTokenKind::Minus, + + // Non-trivia tokens that _are_ ambiguous when lexing backwards. + // In other words: these are characters that _might_ mark the end + // of a multi-character token (like `!=` or `->` or `//` or `**`). + '=' | '*' | '/' | '@' | '!' | '<' | '>' | '.' => { + // This could be a single-token token, like `+` in `x + y`, or a + // multi-character token, like `+=` in `x += y`. It could also be a sequence + // of multi-character tokens, like `x ==== y`, which is invalid, _but_ it's + // important that we produce the same token stream when lexing backwards as + // we do when lexing forwards. So, identify the range of the sequence, lex + // forwards, and return the last token. + let mut cursor = self.cursor.clone(); + cursor.eat_back_while(|c| { + matches!( + c, + ':' | '~' + | '%' + | '|' + | '&' + | '^' + | '+' + | '-' + | '=' + | '*' + | '/' + | '@' + | '!' + | '<' + | '>' + | '.' + ) + }); + + let token_len = cursor.token_len(); + let range = TextRange::at(self.back_offset - token_len, token_len); + + let forward_lexer = Self::new(self.source, range); + if let Some(token) = forward_lexer.last() { + // If the token spans multiple characters, bump the cursor. Note, + // though, that we already bumped the cursor to past the last character + // in the token at the very start of `next_token_back`. + for _ in self.source[token.range].chars().rev().skip(1) { + self.cursor.bump_back().unwrap(); + } + token.kind() + } else { + self.bogus = true; + SimpleTokenKind::Other + } + } + + _ => { + self.bogus = true; SimpleTokenKind::Other } - } else { - SimpleTokenKind::from_non_trivia_char(c) - }; - - if kind == SimpleTokenKind::Other { - self.bogus = true; } - - kind } } }; @@ -871,6 +1134,7 @@ impl QuoteKind { #[cfg(test)] mod tests { use insta::assert_debug_snapshot; + use ruff_text_size::{TextLen, TextRange, TextSize}; use crate::tokenizer::{lines_after, lines_before, SimpleToken, SimpleTokenizer}; @@ -946,6 +1210,30 @@ mod tests { test_case.assert_reverse_tokenization(); } + #[test] + fn tokenize_eq() { + // Should tokenize as `==`, then `=`, regardless of whether we're lexing forwards or + // backwards. + let source = "==="; + + let test_case = tokenize(source); + + assert_debug_snapshot!(test_case.tokens()); + test_case.assert_reverse_tokenization(); + } + + #[test] + fn tokenize_not_eq() { + // Should tokenize as `!=`, then `=`, regardless of whether we're lexing forwards or + // backwards. + let source = "!=="; + + let test_case = tokenize(source); + + assert_debug_snapshot!(test_case.tokens()); + test_case.assert_reverse_tokenization(); + } + #[test] fn tokenize_continuation() { let source = "( \\\n )"; @@ -957,8 +1245,8 @@ mod tests { } #[test] - fn tokenize_characters() { - let source = "-> *= (~=)"; + fn tokenize_operators() { + let source = "-> *= ( -= ) ~ // ** **= ^ ^= | |="; let test_case = tokenize(source); @@ -966,6 +1254,17 @@ mod tests { test_case.assert_reverse_tokenization(); } + #[test] + fn tokenize_invalid_operators() { + let source = "-> $="; + + let test_case = tokenize(source); + + assert_debug_snapshot!(test_case.tokens()); + + // note: not reversible: [other, bogus, bogus] vs [bogus, bogus, other] + } + #[test] fn tricky_unicode() { let source = "មុ"; From daac31d2b953e6bd3f7def2cccd091994294ddc0 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Wed, 16 Aug 2023 15:13:07 +0200 Subject: [PATCH 145/155] Make `Buffer::write_element` non-failable (#6613) --- crates/ruff_formatter/src/buffer.rs | 168 ++---------------- crates/ruff_formatter/src/builders.rs | 120 ++++++++----- .../src/format_element/document.rs | 21 ++- .../ruff_formatter/src/format_extensions.rs | 2 +- crates/ruff_formatter/src/formatter.rs | 4 +- crates/ruff_formatter/src/lib.rs | 3 +- .../src/expression/parentheses.rs | 3 +- crates/ruff_python_formatter/src/lib.rs | 4 +- crates/ruff_python_formatter/src/verbatim.rs | 5 +- 9 files changed, 115 insertions(+), 215 deletions(-) diff --git a/crates/ruff_formatter/src/buffer.rs b/crates/ruff_formatter/src/buffer.rs index b6dab51a80..d2eec095fb 100644 --- a/crates/ruff_formatter/src/buffer.rs +++ b/crates/ruff_formatter/src/buffer.rs @@ -1,7 +1,7 @@ use super::{write, Arguments, FormatElement}; use crate::format_element::Interned; use crate::prelude::LineMode; -use crate::{Format, FormatResult, FormatState}; +use crate::{FormatResult, FormatState}; use rustc_hash::FxHashMap; use std::any::{Any, TypeId}; use std::fmt::Debug; @@ -25,11 +25,11 @@ pub trait Buffer { /// let mut state = FormatState::new(SimpleFormatContext::default()); /// let mut buffer = VecBuffer::new(&mut state); /// - /// buffer.write_element(FormatElement::StaticText { text: "test"}).unwrap(); + /// buffer.write_element(FormatElement::StaticText { text: "test"}); /// /// assert_eq!(buffer.into_vec(), vec![FormatElement::StaticText { text: "test" }]); /// ``` - fn write_element(&mut self, element: FormatElement) -> FormatResult<()>; + fn write_element(&mut self, element: FormatElement); /// Returns a slice containing all elements written into this buffer. /// @@ -135,8 +135,8 @@ impl BufferSnapshot { impl + ?Sized, Context> Buffer for &mut W { type Context = Context; - fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { - (**self).write_element(element) + fn write_element(&mut self, element: FormatElement) { + (**self).write_element(element); } fn elements(&self) -> &[FormatElement] { @@ -218,10 +218,8 @@ impl DerefMut for VecBuffer<'_, Context> { impl Buffer for VecBuffer<'_, Context> { type Context = Context; - fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { + fn write_element(&mut self, element: FormatElement) { self.elements.push(element); - - Ok(()) } fn elements(&self) -> &[FormatElement] { @@ -252,140 +250,6 @@ Make sure that you take and restore the snapshot in order and that this snapshot } } -/// This struct wraps an existing buffer and emits a preamble text when the first text is written. -/// -/// This can be useful if you, for example, want to write some content if what gets written next isn't empty. -/// -/// # Examples -/// -/// ``` -/// use ruff_formatter::{FormatState, Formatted, PreambleBuffer, SimpleFormatContext, VecBuffer, write}; -/// use ruff_formatter::prelude::*; -/// -/// struct Preamble; -/// -/// impl Format for Preamble { -/// fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { -/// write!(f, [text("# heading"), hard_line_break()]) -/// } -/// } -/// -/// # fn main() -> FormatResult<()> { -/// let mut state = FormatState::new(SimpleFormatContext::default()); -/// let mut buffer = VecBuffer::new(&mut state); -/// -/// { -/// let mut with_preamble = PreambleBuffer::new(&mut buffer, Preamble); -/// -/// write!(&mut with_preamble, [text("this text will be on a new line")])?; -/// } -/// -/// let formatted = Formatted::new(Document::from(buffer.into_vec()), SimpleFormatContext::default()); -/// assert_eq!("# heading\nthis text will be on a new line", formatted.print()?.as_code()); -/// -/// # Ok(()) -/// # } -/// ``` -/// -/// The pre-amble does not get written if no content is written to the buffer. -/// -/// ``` -/// use ruff_formatter::{FormatState, Formatted, PreambleBuffer, SimpleFormatContext, VecBuffer, write}; -/// use ruff_formatter::prelude::*; -/// -/// struct Preamble; -/// -/// impl Format for Preamble { -/// fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { -/// write!(f, [text("# heading"), hard_line_break()]) -/// } -/// } -/// -/// # fn main() -> FormatResult<()> { -/// let mut state = FormatState::new(SimpleFormatContext::default()); -/// let mut buffer = VecBuffer::new(&mut state); -/// { -/// let mut with_preamble = PreambleBuffer::new(&mut buffer, Preamble); -/// } -/// -/// let formatted = Formatted::new(Document::from(buffer.into_vec()), SimpleFormatContext::default()); -/// assert_eq!("", formatted.print()?.as_code()); -/// # Ok(()) -/// # } -/// ``` -pub struct PreambleBuffer<'buf, Preamble, Context> { - /// The wrapped buffer - inner: &'buf mut dyn Buffer, - - /// The pre-amble to write once the first content gets written to this buffer. - preamble: Preamble, - - /// Whether some content (including the pre-amble) has been written at this point. - empty: bool, -} - -impl<'buf, Preamble, Context> PreambleBuffer<'buf, Preamble, Context> { - pub fn new(inner: &'buf mut dyn Buffer, preamble: Preamble) -> Self { - Self { - inner, - preamble, - empty: true, - } - } - - /// Returns `true` if the preamble has been written, `false` otherwise. - pub fn did_write_preamble(&self) -> bool { - !self.empty - } -} - -impl Buffer for PreambleBuffer<'_, Preamble, Context> -where - Preamble: Format, -{ - type Context = Context; - - fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { - if self.empty { - write!(self.inner, [&self.preamble])?; - self.empty = false; - } - - self.inner.write_element(element) - } - - fn elements(&self) -> &[FormatElement] { - self.inner.elements() - } - - fn state(&self) -> &FormatState { - self.inner.state() - } - - fn state_mut(&mut self) -> &mut FormatState { - self.inner.state_mut() - } - - fn snapshot(&self) -> BufferSnapshot { - BufferSnapshot::Any(Box::new(PreambleBufferSnapshot { - inner: self.inner.snapshot(), - empty: self.empty, - })) - } - - fn restore_snapshot(&mut self, snapshot: BufferSnapshot) { - let snapshot = snapshot.unwrap_any::(); - - self.empty = snapshot.empty; - self.inner.restore_snapshot(snapshot.inner); - } -} - -struct PreambleBufferSnapshot { - inner: BufferSnapshot, - empty: bool, -} - /// Buffer that allows you inspecting elements as they get written to the formatter. pub struct Inspect<'inner, Context, Inspector> { inner: &'inner mut dyn Buffer, @@ -404,9 +268,9 @@ where { type Context = Context; - fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { + fn write_element(&mut self, element: FormatElement) { (self.inspector)(&element); - self.inner.write_element(element) + self.inner.write_element(element); } fn elements(&self) -> &[FormatElement] { @@ -566,9 +430,9 @@ fn clean_interned( impl Buffer for RemoveSoftLinesBuffer<'_, Context> { type Context = Context; - fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { + fn write_element(&mut self, element: FormatElement) { let element = match element { - FormatElement::Line(LineMode::Soft) => return Ok(()), + FormatElement::Line(LineMode::Soft) => return, FormatElement::Line(LineMode::SoftOrSpace) => FormatElement::Space, FormatElement::Interned(interned) => { FormatElement::Interned(self.clean_interned(&interned)) @@ -576,7 +440,7 @@ impl Buffer for RemoveSoftLinesBuffer<'_, Context> { element => element, }; - self.inner.write_element(element) + self.inner.write_element(element); } fn elements(&self) -> &[FormatElement] { @@ -653,15 +517,13 @@ pub trait BufferExtensions: Buffer + Sized { } /// Writes a sequence of elements into this buffer. - fn write_elements(&mut self, elements: I) -> FormatResult<()> + fn write_elements(&mut self, elements: I) where I: IntoIterator, { for element in elements { - self.write_element(element)?; + self.write_element(element); } - - Ok(()) } } @@ -690,8 +552,8 @@ where } #[inline] - pub fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { - self.buffer.write_element(element) + pub fn write_element(&mut self, element: FormatElement) { + self.buffer.write_element(element); } pub fn stop(self) -> Recorded<'buf> { diff --git a/crates/ruff_formatter/src/builders.rs b/crates/ruff_formatter/src/builders.rs index 1cbe01e553..fbc694af13 100644 --- a/crates/ruff_formatter/src/builders.rs +++ b/crates/ruff_formatter/src/builders.rs @@ -203,7 +203,8 @@ impl Line { impl Format for Line { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Line(self.mode)) + f.write_element(FormatElement::Line(self.mode)); + Ok(()) } } @@ -266,7 +267,8 @@ pub struct StaticText { impl Format for StaticText { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::StaticText { text: self.text }) + f.write_element(FormatElement::StaticText { text: self.text }); + Ok(()) } } @@ -326,7 +328,8 @@ pub struct SourcePosition(TextSize); impl Format for SourcePosition { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::SourcePosition(self.0)) + f.write_element(FormatElement::SourcePosition(self.0)); + Ok(()) } } @@ -346,12 +349,14 @@ pub struct DynamicText<'a> { impl Format for DynamicText<'_> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { if let Some(source_position) = self.position { - f.write_element(FormatElement::SourcePosition(source_position))?; + f.write_element(FormatElement::SourcePosition(source_position)); } f.write_element(FormatElement::DynamicText { text: self.text.to_string().into_boxed_str(), - }) + }); + + Ok(()) } } @@ -419,7 +424,9 @@ where f.write_element(FormatElement::SourceCodeSlice { slice, contains_newlines, - }) + }); + + Ok(()) } } @@ -466,9 +473,11 @@ pub struct LineSuffix<'a, Context> { impl Format for LineSuffix<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Tag(StartLineSuffix))?; + f.write_element(FormatElement::Tag(StartLineSuffix)); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndLineSuffix)) + f.write_element(FormatElement::Tag(EndLineSuffix)); + + Ok(()) } } @@ -513,7 +522,9 @@ pub struct LineSuffixBoundary; impl Format for LineSuffixBoundary { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::LineSuffixBoundary) + f.write_element(FormatElement::LineSuffixBoundary); + + Ok(()) } } @@ -598,9 +609,11 @@ pub struct FormatLabelled<'a, Context> { impl Format for FormatLabelled<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Tag(StartLabelled(self.label_id)))?; + f.write_element(FormatElement::Tag(StartLabelled(self.label_id))); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndLabelled)) + f.write_element(FormatElement::Tag(EndLabelled)); + + Ok(()) } } @@ -639,7 +652,9 @@ pub struct Space; impl Format for Space { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Space) + f.write_element(FormatElement::Space); + + Ok(()) } } @@ -695,9 +710,11 @@ pub struct Indent<'a, Context> { impl Format for Indent<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Tag(StartIndent))?; + f.write_element(FormatElement::Tag(StartIndent)); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndIndent)) + f.write_element(FormatElement::Tag(EndIndent)); + + Ok(()) } } @@ -766,9 +783,11 @@ pub struct Dedent<'a, Context> { impl Format for Dedent<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Tag(StartDedent(self.mode)))?; + f.write_element(FormatElement::Tag(StartDedent(self.mode))); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndDedent)) + f.write_element(FormatElement::Tag(EndDedent)); + + Ok(()) } } @@ -951,9 +970,11 @@ pub struct Align<'a, Context> { impl Format for Align<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Tag(StartAlign(tag::Align(self.count))))?; + f.write_element(FormatElement::Tag(StartAlign(tag::Align(self.count)))); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndAlign)) + f.write_element(FormatElement::Tag(EndAlign)); + + Ok(()) } } @@ -1171,7 +1192,7 @@ impl Format for BlockIndent<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { let snapshot = f.snapshot(); - f.write_element(FormatElement::Tag(StartIndent))?; + f.write_element(FormatElement::Tag(StartIndent)); match self.mode { IndentMode::Soft => write!(f, [soft_line_break()])?, @@ -1192,7 +1213,7 @@ impl Format for BlockIndent<'_, Context> { return Ok(()); } - f.write_element(FormatElement::Tag(EndIndent))?; + f.write_element(FormatElement::Tag(EndIndent)); match self.mode { IndentMode::Soft => write!(f, [soft_line_break()]), @@ -1404,11 +1425,13 @@ impl Format for Group<'_, Context> { f.write_element(FormatElement::Tag(StartGroup( tag::Group::new().with_id(self.group_id).with_mode(mode), - )))?; + ))); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndGroup)) + f.write_element(FormatElement::Tag(EndGroup)); + + Ok(()) } } @@ -1536,9 +1559,11 @@ impl Format for ConditionalGroup<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { f.write_element(FormatElement::Tag(StartConditionalGroup( tag::ConditionalGroup::new(self.condition), - )))?; + ))); f.write_fmt(Arguments::from(&self.content))?; - f.write_element(FormatElement::Tag(EndConditionalGroup)) + f.write_element(FormatElement::Tag(EndConditionalGroup)); + + Ok(()) } } @@ -1596,7 +1621,9 @@ pub struct ExpandParent; impl Format for ExpandParent { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::ExpandParent) + f.write_element(FormatElement::ExpandParent); + + Ok(()) } } @@ -1838,9 +1865,11 @@ impl Format for IfGroupBreaks<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { f.write_element(FormatElement::Tag(StartConditionalContent( Condition::new(self.mode).with_group_id(self.group_id), - )))?; + ))); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndConditionalContent)) + f.write_element(FormatElement::Tag(EndConditionalContent)); + + Ok(()) } } @@ -1960,9 +1989,11 @@ pub struct IndentIfGroupBreaks<'a, Context> { impl Format for IndentIfGroupBreaks<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { - f.write_element(FormatElement::Tag(StartIndentIfGroupBreaks(self.group_id)))?; + f.write_element(FormatElement::Tag(StartIndentIfGroupBreaks(self.group_id))); Arguments::from(&self.content).fmt(f)?; - f.write_element(FormatElement::Tag(EndIndentIfGroupBreaks)) + f.write_element(FormatElement::Tag(EndIndentIfGroupBreaks)); + + Ok(()) } } @@ -2050,9 +2081,11 @@ impl Format for FitsExpanded<'_, Context> { fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { f.write_element(FormatElement::Tag(StartFitsExpanded( tag::FitsExpanded::new().with_condition(self.condition), - )))?; + ))); f.write_fmt(Arguments::from(&self.content))?; - f.write_element(FormatElement::Tag(EndFitsExpanded)) + f.write_element(FormatElement::Tag(EndFitsExpanded)); + + Ok(()) } } @@ -2306,10 +2339,10 @@ pub struct FillBuilder<'fmt, 'buf, Context> { impl<'a, 'buf, Context> FillBuilder<'a, 'buf, Context> { pub(crate) fn new(fmt: &'a mut Formatter<'buf, Context>) -> Self { - let result = fmt.write_element(FormatElement::Tag(StartFill)); + fmt.write_element(FormatElement::Tag(StartFill)); Self { - result, + result: Ok(()), fmt, empty: true, } @@ -2338,14 +2371,15 @@ impl<'a, 'buf, Context> FillBuilder<'a, 'buf, Context> { if self.empty { self.empty = false; } else { - self.fmt.write_element(FormatElement::Tag(StartEntry))?; + self.fmt.write_element(FormatElement::Tag(StartEntry)); separator.fmt(self.fmt)?; - self.fmt.write_element(FormatElement::Tag(EndEntry))?; + self.fmt.write_element(FormatElement::Tag(EndEntry)); } - self.fmt.write_element(FormatElement::Tag(StartEntry))?; + self.fmt.write_element(FormatElement::Tag(StartEntry)); entry.fmt(self.fmt)?; - self.fmt.write_element(FormatElement::Tag(EndEntry)) + self.fmt.write_element(FormatElement::Tag(EndEntry)); + Ok(()) }); self @@ -2353,8 +2387,10 @@ impl<'a, 'buf, Context> FillBuilder<'a, 'buf, Context> { /// Finishes the output and returns any error encountered pub fn finish(&mut self) -> FormatResult<()> { + if self.result.is_ok() { + self.fmt.write_element(FormatElement::Tag(EndFill)); + } self.result - .and_then(|_| self.fmt.write_element(FormatElement::Tag(EndFill))) } } @@ -2394,9 +2430,9 @@ impl Format for BestFitting<'_, Context> { let mut formatted_variants = Vec::with_capacity(variants.len()); for variant in variants { - buffer.write_element(FormatElement::Tag(StartEntry))?; + buffer.write_element(FormatElement::Tag(StartEntry)); buffer.write_fmt(Arguments::from(variant))?; - buffer.write_element(FormatElement::Tag(EndEntry))?; + buffer.write_element(FormatElement::Tag(EndEntry)); formatted_variants.push(buffer.take_vec().into_boxed_slice()); } @@ -2412,6 +2448,8 @@ impl Format for BestFitting<'_, Context> { } }; - f.write_element(element) + f.write_element(element); + + Ok(()) } } diff --git a/crates/ruff_formatter/src/format_element/document.rs b/crates/ruff_formatter/src/format_element/document.rs index 7db6e9de2a..2ce0d041d0 100644 --- a/crates/ruff_formatter/src/format_element/document.rs +++ b/crates/ruff_formatter/src/format_element/document.rs @@ -251,10 +251,7 @@ impl Format> for &[FormatElement] { | FormatElement::StaticText { .. } | FormatElement::DynamicText { .. } | FormatElement::SourceCodeSlice { .. }) => { - fn write_escaped( - element: &FormatElement, - f: &mut Formatter, - ) -> FormatResult<()> { + fn write_escaped(element: &FormatElement, f: &mut Formatter) { let text = match element { FormatElement::StaticText { text } => text, FormatElement::DynamicText { text } => text.as_ref(), @@ -267,9 +264,9 @@ impl Format> for &[FormatElement] { if text.contains('"') { f.write_element(FormatElement::DynamicText { text: text.replace('"', r#"\""#).into(), - }) + }); } else { - f.write_element(element.clone()) + f.write_element(element.clone()); } } @@ -284,7 +281,7 @@ impl Format> for &[FormatElement] { write!(f, [text(" ")])?; } element if element.is_text() => { - write_escaped(element, f)?; + write_escaped(element, f); } _ => unreachable!(), } @@ -334,7 +331,7 @@ impl Format> for &[FormatElement] { f.write_elements([ FormatElement::Tag(StartIndent), FormatElement::Line(LineMode::Hard), - ])?; + ]); for variant in variants { write!(f, [&**variant, hard_line_break()])?; @@ -343,7 +340,7 @@ impl Format> for &[FormatElement] { f.write_elements([ FormatElement::Tag(EndIndent), FormatElement::Line(LineMode::Hard), - ])?; + ]); write!(f, [text("])")])?; } @@ -631,7 +628,9 @@ impl Format> for ContentArrayStart { FormatElement::Tag(StartGroup(tag::Group::new())), FormatElement::Tag(StartIndent), FormatElement::Line(LineMode::Soft), - ]) + ]); + + Ok(()) } } @@ -644,7 +643,7 @@ impl Format> for ContentArrayEnd { FormatElement::Tag(EndIndent), FormatElement::Line(LineMode::Soft), FormatElement::Tag(EndGroup), - ])?; + ]); write!(f, [text("]")]) } diff --git a/crates/ruff_formatter/src/format_extensions.rs b/crates/ruff_formatter/src/format_extensions.rs index 6183826434..b1fb33d6b6 100644 --- a/crates/ruff_formatter/src/format_extensions.rs +++ b/crates/ruff_formatter/src/format_extensions.rs @@ -166,7 +166,7 @@ where match result { Ok(Some(elements)) => { - f.write_element(elements.clone())?; + f.write_element(elements.clone()); Ok(()) } diff --git a/crates/ruff_formatter/src/formatter.rs b/crates/ruff_formatter/src/formatter.rs index c0fa7d1920..9a43635807 100644 --- a/crates/ruff_formatter/src/formatter.rs +++ b/crates/ruff_formatter/src/formatter.rs @@ -206,8 +206,8 @@ impl Buffer for Formatter<'_, Context> { type Context = Context; #[inline] - fn write_element(&mut self, element: FormatElement) -> FormatResult<()> { - self.buffer.write_element(element) + fn write_element(&mut self, element: FormatElement) { + self.buffer.write_element(element); } fn elements(&self) -> &[FormatElement] { diff --git a/crates/ruff_formatter/src/lib.rs b/crates/ruff_formatter/src/lib.rs index a6cd1f578e..91589e1a86 100644 --- a/crates/ruff_formatter/src/lib.rs +++ b/crates/ruff_formatter/src/lib.rs @@ -42,8 +42,7 @@ use crate::format_element::document::Document; use crate::printer::{Printer, PrinterOptions}; pub use arguments::{Argument, Arguments}; pub use buffer::{ - Buffer, BufferExtensions, BufferSnapshot, Inspect, PreambleBuffer, RemoveSoftLinesBuffer, - VecBuffer, + Buffer, BufferExtensions, BufferSnapshot, Inspect, RemoveSoftLinesBuffer, VecBuffer, }; pub use builders::BestFitting; pub use source_code::{SourceCode, SourceCodeSlice}; diff --git a/crates/ruff_python_formatter/src/expression/parentheses.rs b/crates/ruff_python_formatter/src/expression/parentheses.rs index c9ab19225a..3b52be652a 100644 --- a/crates/ruff_python_formatter/src/expression/parentheses.rs +++ b/crates/ruff_python_formatter/src/expression/parentheses.rs @@ -268,7 +268,8 @@ impl<'ast> Format> for InParenthesesOnlyLineBreak { f.write_element(FormatElement::Line(match self { InParenthesesOnlyLineBreak::SoftLineBreak => LineMode::Soft, InParenthesesOnlyLineBreak::SoftLineBreakOrSpace => LineMode::SoftOrSpace, - })) + })); + Ok(()) } } } diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs index b6b96f506b..d088569905 100644 --- a/crates/ruff_python_formatter/src/lib.rs +++ b/crates/ruff_python_formatter/src/lib.rs @@ -184,11 +184,11 @@ impl Format> for NotYetImplementedCustomText<'_> { tag::VerbatimKind::Verbatim { length: self.text.text_len(), }, - )))?; + ))); text(self.text).fmt(f)?; - f.write_element(FormatElement::Tag(Tag::EndVerbatim))?; + f.write_element(FormatElement::Tag(Tag::EndVerbatim)); f.context() .comments() diff --git a/crates/ruff_python_formatter/src/verbatim.rs b/crates/ruff_python_formatter/src/verbatim.rs index 825ff63aca..fcb741c80b 100644 --- a/crates/ruff_python_formatter/src/verbatim.rs +++ b/crates/ruff_python_formatter/src/verbatim.rs @@ -855,7 +855,7 @@ impl Format> for VerbatimText { tag::VerbatimKind::Verbatim { length: self.verbatim_range.len(), }, - )))?; + ))); match normalize_newlines(f.context().locator().slice(self.verbatim_range), ['\r']) { Cow::Borrowed(_) => { @@ -878,6 +878,7 @@ impl Format> for VerbatimText { } } - f.write_element(FormatElement::Tag(Tag::EndVerbatim)) + f.write_element(FormatElement::Tag(Tag::EndVerbatim)); + Ok(()) } } From 95f78821adff8ee8b8d35158309c070bc2a00dfe Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 09:20:48 -0400 Subject: [PATCH 146/155] Fix parenthesized detection for tuples (#6599) ## Summary This PR fixes our code for detecting whether a tuple has its own parentheses, which is necessary when attempting to preserve parentheses. As-is, we were getting some cases wrong, like `(a := 1), (b := 3))` -- the detection code inferred that this _was_ parenthesized, and so wrapped the entire thing in an unnecessary set of parentheses. ## Test Plan `cargo test` Before: | project | similarity index | |--------------|------------------| | cpython | 0.75472 | | django | 0.99804 | | transformers | 0.99618 | | twine | 0.99876 | | typeshed | 0.74288 | | warehouse | 0.99601 | | zulip | 0.99727 | After: | project | similarity index | |--------------|------------------| | cpython | 0.75473 | | django | 0.99804 | | transformers | 0.99618 | | twine | 0.99876 | | typeshed | 0.74288 | | warehouse | 0.99601 | | zulip | 0.99727 | --- .../test/fixtures/ruff/expression/tuple.py | 2 + .../test/fixtures/ruff/statement/for.py | 10 ++++ .../src/expression/expr_tuple.rs | 44 +++++++++------ ..._compatibility@py_39__pep_572_py39.py.snap | 54 ------------------- .../format@expression__tuple.py.snap | 4 ++ .../snapshots/format@statement__for.py.snap | 24 +++++++++ 6 files changed, 67 insertions(+), 71 deletions(-) delete mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_39__pep_572_py39.py.snap diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tuple.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tuple.py index 13859fb27d..9c6c5a6d5b 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tuple.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tuple.py @@ -3,6 +3,8 @@ a1 = 1, 2 a2 = (1, 2) a3 = (1, 2), 3 a4 = ((1, 2), 3) +a5 = (1), (2) +a6 = ((1), (2)) # Wrapping parentheses checks b1 = (("Michael", "Ende"), ("Der", "satanarchäolügenialkohöllische", "Wunschpunsch"), ("Beelzebub", "Irrwitzer"), ("Tyrannja", "Vamperl"),) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py index 3a96b5390f..c1e96d6d79 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py @@ -32,3 +32,13 @@ for (x, y) in (z, w): # type comment for x in (): # type: int ... + +# Tuple parentheses for iterable. +for x in 1, 2, 3: + pass + +for x in (1, 2, 3): + pass + +for x in 1, 2, 3,: + pass diff --git a/crates/ruff_python_formatter/src/expression/expr_tuple.rs b/crates/ruff_python_formatter/src/expression/expr_tuple.rs index b062261762..ad89e8a82a 100644 --- a/crates/ruff_python_formatter/src/expression/expr_tuple.rs +++ b/crates/ruff_python_formatter/src/expression/expr_tuple.rs @@ -1,7 +1,8 @@ use ruff_formatter::{format_args, write, FormatRuleWithOptions}; use ruff_python_ast::node::AnyNodeRef; use ruff_python_ast::ExprTuple; -use ruff_python_ast::{Expr, Ranged}; +use ruff_python_ast::Ranged; +use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer}; use ruff_text_size::TextRange; use crate::builders::parenthesize_if_expands; @@ -11,7 +12,7 @@ use crate::expression::parentheses::{ }; use crate::prelude::*; -#[derive(Eq, PartialEq, Debug, Default)] +#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)] pub enum TupleParentheses { /// By default tuples with a single element will include parentheses. Tuples with multiple elements /// will parenthesize if the expression expands. This means that tuples will often *preserve* @@ -100,9 +101,9 @@ impl FormatRuleWithOptions> for FormatExprTuple { impl FormatNodeRule for FormatExprTuple { fn fmt_fields(&self, item: &ExprTuple, f: &mut PyFormatter) -> FormatResult<()> { let ExprTuple { - range, elts, ctx: _, + range: _, } = item; let comments = f.context().comments().clone(); @@ -124,7 +125,7 @@ impl FormatNodeRule for FormatExprTuple { } [single] => match self.parentheses { TupleParentheses::Preserve - if !is_parenthesized(*range, elts, f.context().source()) => + if !is_tuple_parenthesized(item, f.context().source()) => { write!(f, [single.format(), text(",")]) } @@ -141,7 +142,7 @@ impl FormatNodeRule for FormatExprTuple { // // Unlike other expression parentheses, tuple parentheses are part of the range of the // tuple itself. - _ if is_parenthesized(*range, elts, f.context().source()) + _ if is_tuple_parenthesized(item, f.context().source()) && !(self.parentheses == TupleParentheses::NeverPreserve && dangling.is_empty()) => { @@ -203,21 +204,30 @@ impl NeedsParentheses for ExprTuple { } /// Check if a tuple has already had parentheses in the input -fn is_parenthesized(tuple_range: TextRange, elts: &[Expr], source: &str) -> bool { - let parentheses = '('; - let first_char = &source[usize::from(tuple_range.start())..].chars().next(); - let Some(first_char) = first_char else { +fn is_tuple_parenthesized(tuple: &ExprTuple, source: &str) -> bool { + let Some(elt) = tuple.elts.first() else { return false; }; - if *first_char != parentheses { + + // Count the number of open parentheses between the start of the tuple and the first element. + let open_parentheses_count = + SimpleTokenizer::new(source, TextRange::new(tuple.start(), elt.start())) + .skip_trivia() + .filter(|token| token.kind() == SimpleTokenKind::LParen) + .count(); + if open_parentheses_count == 0 { return false; } - // Consider `a = (1, 2), 3`: The first char of the current expr starts is a parentheses, but - // it's not its own but that of its first tuple child. We know that it belongs to the child - // because if it wouldn't, the child would start (at least) a char later - let Some(first_child) = elts.first() else { - return false; - }; - first_child.range().start() != tuple_range.start() + // Count the number of parentheses between the end of the first element and its trailing comma. + let close_parentheses_count = + SimpleTokenizer::new(source, TextRange::new(elt.end(), tuple.end())) + .skip_trivia() + .take_while(|token| token.kind() != SimpleTokenKind::Comma) + .filter(|token| token.kind() == SimpleTokenKind::RParen) + .count(); + + // If the number of open parentheses is greater than the number of close parentheses, the tuple + // is parenthesized. + open_parentheses_count > close_parentheses_count } diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_39__pep_572_py39.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_39__pep_572_py39.py.snap deleted file mode 100644 index 561947c702..0000000000 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_39__pep_572_py39.py.snap +++ /dev/null @@ -1,54 +0,0 @@ ---- -source: crates/ruff_python_formatter/tests/fixtures.rs -input_file: crates/ruff_python_formatter/resources/test/fixtures/black/py_39/pep_572_py39.py ---- -## Input - -```py -# Unparenthesized walruses are now allowed in set literals & set comprehensions -# since Python 3.9 -{x := 1, 2, 3} -{x4 := x**5 for x in range(7)} -# We better not remove the parentheses here (since it's a 3.10 feature) -x[(a := 1)] -x[(a := 1), (b := 3)] -``` - -## Black Differences - -```diff ---- Black -+++ Ruff -@@ -4,4 +4,4 @@ - {x4 := x**5 for x in range(7)} - # We better not remove the parentheses here (since it's a 3.10 feature) - x[(a := 1)] --x[(a := 1), (b := 3)] -+x[((a := 1), (b := 3))] -``` - -## Ruff Output - -```py -# Unparenthesized walruses are now allowed in set literals & set comprehensions -# since Python 3.9 -{x := 1, 2, 3} -{x4 := x**5 for x in range(7)} -# We better not remove the parentheses here (since it's a 3.10 feature) -x[(a := 1)] -x[((a := 1), (b := 3))] -``` - -## Black Output - -```py -# Unparenthesized walruses are now allowed in set literals & set comprehensions -# since Python 3.9 -{x := 1, 2, 3} -{x4 := x**5 for x in range(7)} -# We better not remove the parentheses here (since it's a 3.10 feature) -x[(a := 1)] -x[(a := 1), (b := 3)] -``` - - diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__tuple.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__tuple.py.snap index 5e818a39cb..85dfa81fff 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__tuple.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__tuple.py.snap @@ -9,6 +9,8 @@ a1 = 1, 2 a2 = (1, 2) a3 = (1, 2), 3 a4 = ((1, 2), 3) +a5 = (1), (2) +a6 = ((1), (2)) # Wrapping parentheses checks b1 = (("Michael", "Ende"), ("Der", "satanarchäolügenialkohöllische", "Wunschpunsch"), ("Beelzebub", "Irrwitzer"), ("Tyrannja", "Vamperl"),) @@ -79,6 +81,8 @@ a1 = 1, 2 a2 = (1, 2) a3 = (1, 2), 3 a4 = ((1, 2), 3) +a5 = (1), (2) +a6 = ((1), (2)) # Wrapping parentheses checks b1 = ( diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap index 637372d81f..fbff2337ec 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap @@ -38,6 +38,16 @@ for (x, y) in (z, w): # type comment for x in (): # type: int ... + +# Tuple parentheses for iterable. +for x in 1, 2, 3: + pass + +for x in (1, 2, 3): + pass + +for x in 1, 2, 3,: + pass ``` ## Output @@ -76,6 +86,20 @@ for x, y in (z, w): # type comment for x in (): # type: int ... + +# Tuple parentheses for iterable. +for x in 1, 2, 3: + pass + +for x in (1, 2, 3): + pass + +for x in ( + 1, + 2, + 3, +): + pass ``` From 7ee2ae839507fb4b21844ab2d1c07170e1c745b6 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Wed, 16 Aug 2023 15:31:31 +0200 Subject: [PATCH 147/155] Estimate expected `VecBuffer` size (#6612) --- crates/ruff_formatter/src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/ruff_formatter/src/lib.rs b/crates/ruff_formatter/src/lib.rs index 91589e1a86..475259c52b 100644 --- a/crates/ruff_formatter/src/lib.rs +++ b/crates/ruff_formatter/src/lib.rs @@ -778,9 +778,13 @@ pub fn format( where Context: FormatContext, { + let source_length = context.source_code().as_str().len(); + // Use a simple heuristic to guess the number of expected format elements. + // See [#6612](https://github.com/astral-sh/ruff/pull/6612) for more details on how the formula was determined. Changes to our formatter, or supporting + // more languages may require fine tuning the formula. + let estimated_buffer_size = source_length / 2; let mut state = FormatState::new(context); - let mut buffer = - VecBuffer::with_capacity(state.context().source_code().as_str().len(), &mut state); + let mut buffer = VecBuffer::with_capacity(estimated_buffer_size, &mut state); buffer.write_fmt(arguments)?; From 12f3c4c931f2ead6ed45695ba3d2193c0737d0ac Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 09:41:07 -0400 Subject: [PATCH 148/155] Fix comment formatting for yielded tuples (#6603) ## Summary Closes https://github.com/astral-sh/ruff/issues/6384, although I think the issue was fixed already on main, for the most part. The linked issue is around formatting expressions like: ```python def test(): ( yield #comment 1 * # comment 2 # comment 3 test # comment 4 ) ``` On main, prior to this PR, we now format like: ```python def test(): ( yield ( # comment 1 # comment 2 # comment 3 *test ) # comment 4 ) ``` Which strikes me as reasonable. (We can't test this, since it's a syntax error after for our parser, despite being a syntax error in both cases from CPython's perspective.) Meanwhile, Black does: ```python def test(): ( yield # comment 1 * # comment 2 # comment 3 test # comment 4 ) ``` So our formatting differs in that we move comments between the star and the expression above the star. As of this PR, we also support formatting this input, which is valid: ```python def test(): ( yield #comment 1 * # comment 2 # comment 3 test, # comment 4 1 ) ``` Like: ```python def test(): ( yield ( # comment 1 ( # comment 2 # comment 3 *test, # comment 4 1, ) ) ) ``` There were two fixes here: (1) marking starred comments as dangling and formatting them properly; and (2) supporting parenthesized comments for tuples that don't contain their own parentheses, as is often the case for yielded tuples (previously, we hit a debug assert). Note that this diff ## Test Plan cargo test --- .../test/fixtures/ruff/expression/starred.py | 8 ++++ .../test/fixtures/ruff/expression/yield.py | 8 ++++ .../src/comments/placement.rs | 45 ++++++++++++------- .../src/expression/expr_starred.rs | 7 ++- .../src/expression/expr_tuple.rs | 2 +- .../format@expression__starred.py.snap | 19 +++++++- .../format@expression__yield.py.snap | 20 +++++++++ 7 files changed, 88 insertions(+), 21 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py index 0167d0ee3a..cdbcf4c942 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/starred.py @@ -23,3 +23,11 @@ call( [What, i, this, s, very, long, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] ] # trailing value comment ) + +call( + x, + * # Trailing star comment + ( # Leading value comment + y + ) +) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/yield.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/yield.py index 592cebdaa1..2c5e07c6f7 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/yield.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/yield.py @@ -57,3 +57,11 @@ def foo(): yield from (yield l) + ( + yield + #comment 1 + * # comment 2 + # comment 3 + test, # comment 4 + 1 + ) diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index ec38633573..b36c40c9f4 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -9,6 +9,7 @@ use ruff_text_size::{TextLen, TextRange}; use crate::comments::visitor::{CommentPlacement, DecoratedComment}; use crate::expression::expr_slice::{assign_comment_in_slice, ExprSliceCommentSection}; +use crate::expression::expr_tuple::is_tuple_parenthesized; use crate::other::parameters::{ assign_argument_separator_comment_placement, find_parameter_separators, }; @@ -185,7 +186,7 @@ fn handle_enclosed_comment<'a>( AnyNodeRef::ExprIfExp(expr_if) => handle_expr_if_comment(comment, expr_if, locator), AnyNodeRef::ExprSlice(expr_slice) => handle_slice_comments(comment, expr_slice, locator), AnyNodeRef::ExprStarred(starred) => { - handle_trailing_expression_starred_star_end_of_line_comment(comment, starred) + handle_trailing_expression_starred_star_end_of_line_comment(comment, starred, locator) } AnyNodeRef::ExprSubscript(expr_subscript) => { if let Expr::Slice(expr_slice) = expr_subscript.slice.as_ref() { @@ -217,8 +218,10 @@ fn handle_enclosed_comment<'a>( | AnyNodeRef::ExprGeneratorExp(_) | AnyNodeRef::ExprListComp(_) | AnyNodeRef::ExprSetComp(_) - | AnyNodeRef::ExprDictComp(_) - | AnyNodeRef::ExprTuple(_) => handle_bracketed_end_of_line_comment(comment, locator), + | AnyNodeRef::ExprDictComp(_) => handle_bracketed_end_of_line_comment(comment, locator), + AnyNodeRef::ExprTuple(tuple) if is_tuple_parenthesized(tuple, locator.contents()) => { + handle_bracketed_end_of_line_comment(comment, locator) + } _ => CommentPlacement::Default(comment), } } @@ -1060,27 +1063,37 @@ fn handle_expr_if_comment<'a>( CommentPlacement::Default(comment) } -/// Moving +/// Handles trailing comments on between the `*` of a starred expression and the +/// expression itself. For example, attaches the first two comments here as leading +/// comments on the enclosing node, and the third to the `True` node. /// ``` python /// call( -/// # Leading starred comment -/// * # Trailing star comment -/// [] -/// ) -/// ``` -/// to -/// ``` python -/// call( -/// # Leading starred comment -/// # Trailing star comment -/// * [] +/// * # dangling end-of-line comment +/// # dangling own line comment +/// ( # leading comment on the expression +/// True +/// ) /// ) /// ``` fn handle_trailing_expression_starred_star_end_of_line_comment<'a>( comment: DecoratedComment<'a>, starred: &'a ast::ExprStarred, + locator: &Locator, ) -> CommentPlacement<'a> { - CommentPlacement::leading(starred, comment) + if comment.following_node().is_some() { + let tokenizer = SimpleTokenizer::new( + locator.contents(), + TextRange::new(starred.start(), comment.start()), + ); + if !tokenizer + .skip_trivia() + .any(|token| token.kind() == SimpleTokenKind::LParen) + { + return CommentPlacement::leading(starred, comment); + } + } + + CommentPlacement::Default(comment) } /// Handles trailing own line comments before the `as` keyword of a with item and diff --git a/crates/ruff_python_formatter/src/expression/expr_starred.rs b/crates/ruff_python_formatter/src/expression/expr_starred.rs index 1f63e00f52..a06cc3752a 100644 --- a/crates/ruff_python_formatter/src/expression/expr_starred.rs +++ b/crates/ruff_python_formatter/src/expression/expr_starred.rs @@ -1,6 +1,6 @@ use ruff_python_ast::ExprStarred; -use crate::comments::SourceComment; +use crate::comments::{dangling_comments, SourceComment}; use ruff_formatter::write; use ruff_python_ast::node::AnyNodeRef; @@ -20,7 +20,10 @@ impl FormatNodeRule for FormatExprStarred { ctx: _, } = item; - write!(f, [text("*"), value.format()]) + let comments = f.context().comments().clone(); + let dangling = comments.dangling_comments(item); + + write!(f, [text("*"), dangling_comments(dangling), value.format()]) } fn fmt_dangling_comments( diff --git a/crates/ruff_python_formatter/src/expression/expr_tuple.rs b/crates/ruff_python_formatter/src/expression/expr_tuple.rs index ad89e8a82a..bb9cd298ec 100644 --- a/crates/ruff_python_formatter/src/expression/expr_tuple.rs +++ b/crates/ruff_python_formatter/src/expression/expr_tuple.rs @@ -204,7 +204,7 @@ impl NeedsParentheses for ExprTuple { } /// Check if a tuple has already had parentheses in the input -fn is_tuple_parenthesized(tuple: &ExprTuple, source: &str) -> bool { +pub(crate) fn is_tuple_parenthesized(tuple: &ExprTuple, source: &str) -> bool { let Some(elt) = tuple.elts.first() else { return false; }; diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap index c93c51da25..2393ae56af 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__starred.py.snap @@ -29,6 +29,14 @@ call( [What, i, this, s, very, long, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] ] # trailing value comment ) + +call( + x, + * # Trailing star comment + ( # Leading value comment + y + ) +) ``` ## Output @@ -52,8 +60,7 @@ call( call( # Leading starred comment - # Leading value comment - *( + *( # Leading value comment [ What, i, @@ -83,6 +90,14 @@ call( ] ], # trailing value comment ) + +call( + x, + # Trailing star comment + *( # Leading value comment + y + ), +) ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__yield.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__yield.py.snap index b5d464ec81..1698ba87e2 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__yield.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__yield.py.snap @@ -63,6 +63,14 @@ def foo(): yield from (yield l) + ( + yield + #comment 1 + * # comment 2 + # comment 3 + test, # comment 4 + 1 + ) ``` ## Output @@ -115,6 +123,18 @@ def foo(): pass yield from (yield l) + + ( + yield ( + # comment 1 + ( + # comment 2 + # comment 3 + *test, # comment 4 + 1, + ) + ) + ) ``` From d0b8e4f701493d1234bfc425dfe1c20fdab1eec3 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 11:05:51 -0400 Subject: [PATCH 149/155] Update Black tests (#6618) ## Summary Pulls in some tests that we previously couldn't support ## Test Plan `cargo test` --- .../black/miscellaneous/force_py36.py | 2 +- .../black/miscellaneous/force_py36.py.expect | 2 +- .../test/fixtures/black/py_311/pep_646.py | 194 ++++++++++++++ .../fixtures/black/py_311/pep_646.py.expect | 194 ++++++++++++++ .../black/py_38/pep_572_remove_parens.py | 69 +++++ .../py_38/pep_572_remove_parens.py.expect | 71 +++++ .../test/fixtures/import_black_tests.py | 4 +- ...ility@py_38__pep_572_remove_parens.py.snap | 247 ++++++++++++++++++ 8 files changed, 778 insertions(+), 5 deletions(-) create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py.expect create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py create mode 100644 crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py.expect create mode 100644 crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_572_remove_parens.py.snap diff --git a/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py b/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py index 106e97214d..4a8abc946e 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py @@ -1,3 +1,3 @@ # The input source must not contain any Py36-specific syntax (e.g. argument type # annotations, trailing comma after *rest) or this test becomes invalid. -def long_function_name(argument_one, argument_two, argument_three, argument_four, argument_five, argument_six, *rest): ... +def long_function_name(argument_one, argument_two, argument_three, argument_four, argument_five, argument_six, *rest): pass diff --git a/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py.expect b/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py.expect index bb26932707..f63094e472 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py.expect +++ b/crates/ruff_python_formatter/resources/test/fixtures/black/miscellaneous/force_py36.py.expect @@ -9,4 +9,4 @@ def long_function_name( argument_six, *rest, ): - ... + pass diff --git a/crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py b/crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py new file mode 100644 index 0000000000..e843ecf39d --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py @@ -0,0 +1,194 @@ +A[*b] +A[*b] = 1 +A +del A[*b] +A +A[*b, *b] +A[*b, *b] = 1 +A +del A[*b, *b] +A +A[b, *b] +A[b, *b] = 1 +A +del A[b, *b] +A +A[*b, b] +A[*b, b] = 1 +A +del A[*b, b] +A +A[b, b, *b] +A[b, b, *b] = 1 +A +del A[b, b, *b] +A +A[*b, b, b] +A[*b, b, b] = 1 +A +del A[*b, b, b] +A +A[b, *b, b] +A[b, *b, b] = 1 +A +del A[b, *b, b] +A +A[b, b, *b, b] +A[b, b, *b, b] = 1 +A +del A[b, b, *b, b] +A +A[b, *b, b, b] +A[b, *b, b, b] = 1 +A +del A[b, *b, b, b] +A +A[A[b, *b, b]] +A[A[b, *b, b]] = 1 +A +del A[A[b, *b, b]] +A +A[*A[b, *b, b]] +A[*A[b, *b, b]] = 1 +A +del A[*A[b, *b, b]] +A +A[b, ...] +A[b, ...] = 1 +A +del A[b, ...] +A +A[*A[b, ...]] +A[*A[b, ...]] = 1 +A +del A[*A[b, ...]] +A +l = [1, 2, 3] +A[*l] +A[*l] = 1 +A +del A[*l] +A +A[*l, 4] +A[*l, 4] = 1 +A +del A[*l, 4] +A +A[0, *l] +A[0, *l] = 1 +A +del A[0, *l] +A +A[1:2, *l] +A[1:2, *l] = 1 +A +del A[1:2, *l] +A +repr(A[1:2, *l]) == repr(A[1:2, 1, 2, 3]) +t = (1, 2, 3) +A[*t] +A[*t] = 1 +A +del A[*t] +A +A[*t, 4] +A[*t, 4] = 1 +A +del A[*t, 4] +A +A[0, *t] +A[0, *t] = 1 +A +del A[0, *t] +A +A[1:2, *t] +A[1:2, *t] = 1 +A +del A[1:2, *t] +A +repr(A[1:2, *t]) == repr(A[1:2, 1, 2, 3]) + + +def returns_list(): + return [1, 2, 3] + + +A[returns_list()] +A[returns_list()] = 1 +A +del A[returns_list()] +A +A[returns_list(), 4] +A[returns_list(), 4] = 1 +A +del A[returns_list(), 4] +A +A[*returns_list()] +A[*returns_list()] = 1 +A +del A[*returns_list()] +A +A[*returns_list(), 4] +A[*returns_list(), 4] = 1 +A +del A[*returns_list(), 4] +A +A[0, *returns_list()] +A[0, *returns_list()] = 1 +A +del A[0, *returns_list()] +A +A[*returns_list(), *returns_list()] +A[*returns_list(), *returns_list()] = 1 +A +del A[*returns_list(), *returns_list()] +A +A[1:2, *b] +A[*b, 1:2] +A[1:2, *b, 1:2] +A[*b, 1:2, *b] +A[1:, *b] +A[*b, 1:] +A[1:, *b, 1:] +A[*b, 1:, *b] +A[:1, *b] +A[*b, :1] +A[:1, *b, :1] +A[*b, :1, *b] +A[:, *b] +A[*b, :] +A[:, *b, :] +A[*b, :, *b] +A[a * b()] +A[a * b(), *c, *d(), e * f(g * h)] +A[a * b(), :] +A[a * b(), *c, *d(), e * f(g * h) :] +A[[b] * len(c), :] + + +def f1(*args: *b): + pass + + +f1.__annotations__ + + +def f2(*args: *b, arg1): + pass + + +f2.__annotations__ + + +def f3(*args: *b, arg1: int): + pass + + +f3.__annotations__ + + +def f4(*args: *b, arg1: int = 2): + pass + + +f4.__annotations__ diff --git a/crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py.expect b/crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py.expect new file mode 100644 index 0000000000..e843ecf39d --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/black/py_311/pep_646.py.expect @@ -0,0 +1,194 @@ +A[*b] +A[*b] = 1 +A +del A[*b] +A +A[*b, *b] +A[*b, *b] = 1 +A +del A[*b, *b] +A +A[b, *b] +A[b, *b] = 1 +A +del A[b, *b] +A +A[*b, b] +A[*b, b] = 1 +A +del A[*b, b] +A +A[b, b, *b] +A[b, b, *b] = 1 +A +del A[b, b, *b] +A +A[*b, b, b] +A[*b, b, b] = 1 +A +del A[*b, b, b] +A +A[b, *b, b] +A[b, *b, b] = 1 +A +del A[b, *b, b] +A +A[b, b, *b, b] +A[b, b, *b, b] = 1 +A +del A[b, b, *b, b] +A +A[b, *b, b, b] +A[b, *b, b, b] = 1 +A +del A[b, *b, b, b] +A +A[A[b, *b, b]] +A[A[b, *b, b]] = 1 +A +del A[A[b, *b, b]] +A +A[*A[b, *b, b]] +A[*A[b, *b, b]] = 1 +A +del A[*A[b, *b, b]] +A +A[b, ...] +A[b, ...] = 1 +A +del A[b, ...] +A +A[*A[b, ...]] +A[*A[b, ...]] = 1 +A +del A[*A[b, ...]] +A +l = [1, 2, 3] +A[*l] +A[*l] = 1 +A +del A[*l] +A +A[*l, 4] +A[*l, 4] = 1 +A +del A[*l, 4] +A +A[0, *l] +A[0, *l] = 1 +A +del A[0, *l] +A +A[1:2, *l] +A[1:2, *l] = 1 +A +del A[1:2, *l] +A +repr(A[1:2, *l]) == repr(A[1:2, 1, 2, 3]) +t = (1, 2, 3) +A[*t] +A[*t] = 1 +A +del A[*t] +A +A[*t, 4] +A[*t, 4] = 1 +A +del A[*t, 4] +A +A[0, *t] +A[0, *t] = 1 +A +del A[0, *t] +A +A[1:2, *t] +A[1:2, *t] = 1 +A +del A[1:2, *t] +A +repr(A[1:2, *t]) == repr(A[1:2, 1, 2, 3]) + + +def returns_list(): + return [1, 2, 3] + + +A[returns_list()] +A[returns_list()] = 1 +A +del A[returns_list()] +A +A[returns_list(), 4] +A[returns_list(), 4] = 1 +A +del A[returns_list(), 4] +A +A[*returns_list()] +A[*returns_list()] = 1 +A +del A[*returns_list()] +A +A[*returns_list(), 4] +A[*returns_list(), 4] = 1 +A +del A[*returns_list(), 4] +A +A[0, *returns_list()] +A[0, *returns_list()] = 1 +A +del A[0, *returns_list()] +A +A[*returns_list(), *returns_list()] +A[*returns_list(), *returns_list()] = 1 +A +del A[*returns_list(), *returns_list()] +A +A[1:2, *b] +A[*b, 1:2] +A[1:2, *b, 1:2] +A[*b, 1:2, *b] +A[1:, *b] +A[*b, 1:] +A[1:, *b, 1:] +A[*b, 1:, *b] +A[:1, *b] +A[*b, :1] +A[:1, *b, :1] +A[*b, :1, *b] +A[:, *b] +A[*b, :] +A[:, *b, :] +A[*b, :, *b] +A[a * b()] +A[a * b(), *c, *d(), e * f(g * h)] +A[a * b(), :] +A[a * b(), *c, *d(), e * f(g * h) :] +A[[b] * len(c), :] + + +def f1(*args: *b): + pass + + +f1.__annotations__ + + +def f2(*args: *b, arg1): + pass + + +f2.__annotations__ + + +def f3(*args: *b, arg1: int): + pass + + +f3.__annotations__ + + +def f4(*args: *b, arg1: int = 2): + pass + + +f4.__annotations__ diff --git a/crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py b/crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py new file mode 100644 index 0000000000..df005e488e --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py @@ -0,0 +1,69 @@ +if (foo := 0): + pass + +if (foo := 1): + pass + +if (y := 5 + 5): + pass + +y = (x := 0) + +y += (x := 0) + +(y := 5 + 5) + +test: int = (test2 := 2) + +a, b = (test := (1, 2)) + +# see also https://github.com/psf/black/issues/2139 +assert (foo := 42 - 12) + +foo(x=(y := f(x))) + + +def foo(answer=(p := 42)): + ... + + +def foo2(answer: (p := 42) = 5): + ... + + +lambda: (x := 1) + +a[(x := 12)] +a[:(x := 13)] + +# we don't touch expressions in f-strings but if we do one day, don't break 'em +f'{(x:=10)}' + + +def a(): + return (x := 3) + await (b := 1) + yield (a := 2) + raise (c := 3) + +def this_is_so_dumb() -> (please := no): + pass + +async def await_the_walrus(): + with (x := y): + pass + + with (x := y) as z, (a := b) as c: + pass + + with (x := await y): + pass + + with (x := await a, y := await b): + pass + + with ((x := await a, y := await b)): + pass + + with (x := await a), (y := await b): + pass diff --git a/crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py.expect b/crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py.expect new file mode 100644 index 0000000000..37a6a85087 --- /dev/null +++ b/crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py.expect @@ -0,0 +1,71 @@ +if foo := 0: + pass + +if foo := 1: + pass + +if y := 5 + 5: + pass + +y = (x := 0) + +y += (x := 0) + +(y := 5 + 5) + +test: int = (test2 := 2) + +a, b = (test := (1, 2)) + +# see also https://github.com/psf/black/issues/2139 +assert (foo := 42 - 12) + +foo(x=(y := f(x))) + + +def foo(answer=(p := 42)): + ... + + +def foo2(answer: (p := 42) = 5): + ... + + +lambda: (x := 1) + +a[(x := 12)] +a[:(x := 13)] + +# we don't touch expressions in f-strings but if we do one day, don't break 'em +f"{(x:=10)}" + + +def a(): + return (x := 3) + await (b := 1) + yield (a := 2) + raise (c := 3) + + +def this_is_so_dumb() -> (please := no): + pass + + +async def await_the_walrus(): + with (x := y): + pass + + with (x := y) as z, (a := b) as c: + pass + + with (x := await y): + pass + + with (x := await a, y := await b): + pass + + with (x := await a, y := await b): + pass + + with (x := await a), (y := await b): + pass diff --git a/crates/ruff_python_formatter/resources/test/fixtures/import_black_tests.py b/crates/ruff_python_formatter/resources/test/fixtures/import_black_tests.py index 17c99b1185..ad45c01784 100755 --- a/crates/ruff_python_formatter/resources/test/fixtures/import_black_tests.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/import_black_tests.py @@ -43,6 +43,7 @@ def import_fixture(fixture: Path, fixture_set: str): # The name of the folders in the `data` for which the tests should be imported FIXTURE_SETS = [ + "fast", "py_36", "py_37", "py_38", @@ -58,9 +59,6 @@ FIXTURE_SETS = [ # Tests that ruff doesn't fully support yet and, therefore, should not be imported IGNORE_LIST = [ - "pep_572_remove_parens.py", # Reformatting bugs - "pep_646.py", # Rust Python parser bug - # Contain syntax errors "async_as_identifier.py", "invalid_header.py", diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_572_remove_parens.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_572_remove_parens.py.snap new file mode 100644 index 0000000000..daea36ba7e --- /dev/null +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_38__pep_572_remove_parens.py.snap @@ -0,0 +1,247 @@ +--- +source: crates/ruff_python_formatter/tests/fixtures.rs +input_file: crates/ruff_python_formatter/resources/test/fixtures/black/py_38/pep_572_remove_parens.py +--- +## Input + +```py +if (foo := 0): + pass + +if (foo := 1): + pass + +if (y := 5 + 5): + pass + +y = (x := 0) + +y += (x := 0) + +(y := 5 + 5) + +test: int = (test2 := 2) + +a, b = (test := (1, 2)) + +# see also https://github.com/psf/black/issues/2139 +assert (foo := 42 - 12) + +foo(x=(y := f(x))) + + +def foo(answer=(p := 42)): + ... + + +def foo2(answer: (p := 42) = 5): + ... + + +lambda: (x := 1) + +a[(x := 12)] +a[:(x := 13)] + +# we don't touch expressions in f-strings but if we do one day, don't break 'em +f'{(x:=10)}' + + +def a(): + return (x := 3) + await (b := 1) + yield (a := 2) + raise (c := 3) + +def this_is_so_dumb() -> (please := no): + pass + +async def await_the_walrus(): + with (x := y): + pass + + with (x := y) as z, (a := b) as c: + pass + + with (x := await y): + pass + + with (x := await a, y := await b): + pass + + with ((x := await a, y := await b)): + pass + + with (x := await a), (y := await b): + pass +``` + +## Black Differences + +```diff +--- Black ++++ Ruff +@@ -34,7 +34,7 @@ + lambda: (x := 1) + + a[(x := 12)] +-a[:(x := 13)] ++a[: (x := 13)] + + # we don't touch expressions in f-strings but if we do one day, don't break 'em + f"{(x:=10)}" +``` + +## Ruff Output + +```py +if foo := 0: + pass + +if foo := 1: + pass + +if y := 5 + 5: + pass + +y = (x := 0) + +y += (x := 0) + +(y := 5 + 5) + +test: int = (test2 := 2) + +a, b = (test := (1, 2)) + +# see also https://github.com/psf/black/issues/2139 +assert (foo := 42 - 12) + +foo(x=(y := f(x))) + + +def foo(answer=(p := 42)): + ... + + +def foo2(answer: (p := 42) = 5): + ... + + +lambda: (x := 1) + +a[(x := 12)] +a[: (x := 13)] + +# we don't touch expressions in f-strings but if we do one day, don't break 'em +f"{(x:=10)}" + + +def a(): + return (x := 3) + await (b := 1) + yield (a := 2) + raise (c := 3) + + +def this_is_so_dumb() -> (please := no): + pass + + +async def await_the_walrus(): + with (x := y): + pass + + with (x := y) as z, (a := b) as c: + pass + + with (x := await y): + pass + + with (x := await a, y := await b): + pass + + with (x := await a, y := await b): + pass + + with (x := await a), (y := await b): + pass +``` + +## Black Output + +```py +if foo := 0: + pass + +if foo := 1: + pass + +if y := 5 + 5: + pass + +y = (x := 0) + +y += (x := 0) + +(y := 5 + 5) + +test: int = (test2 := 2) + +a, b = (test := (1, 2)) + +# see also https://github.com/psf/black/issues/2139 +assert (foo := 42 - 12) + +foo(x=(y := f(x))) + + +def foo(answer=(p := 42)): + ... + + +def foo2(answer: (p := 42) = 5): + ... + + +lambda: (x := 1) + +a[(x := 12)] +a[:(x := 13)] + +# we don't touch expressions in f-strings but if we do one day, don't break 'em +f"{(x:=10)}" + + +def a(): + return (x := 3) + await (b := 1) + yield (a := 2) + raise (c := 3) + + +def this_is_so_dumb() -> (please := no): + pass + + +async def await_the_walrus(): + with (x := y): + pass + + with (x := y) as z, (a := b) as c: + pass + + with (x := await y): + pass + + with (x := await a, y := await b): + pass + + with (x := await a, y := await b): + pass + + with (x := await a), (y := await b): + pass +``` + + From fdbb2fbdba907e5fc118f67d2f257cc141322c09 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Wed, 16 Aug 2023 18:54:42 +0200 Subject: [PATCH 150/155] Fix unreachable in playground (#6623) --- crates/ruff/src/fs.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/ruff/src/fs.rs b/crates/ruff/src/fs.rs index c8ff195468..2a617113fe 100644 --- a/crates/ruff/src/fs.rs +++ b/crates/ruff/src/fs.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; use globset::GlobMatcher; use log::debug; -use path_absolutize::{path_dedot, Absolutize}; +use path_absolutize::Absolutize; use crate::registry::RuleSet; @@ -61,7 +61,13 @@ pub fn normalize_path_to, R: AsRef>(path: P, project_root: /// Convert an absolute path to be relative to the current working directory. pub fn relativize_path>(path: P) -> String { let path = path.as_ref(); - if let Ok(path) = path.strip_prefix(&*path_dedot::CWD) { + + #[cfg(target_arch = "wasm32")] + let cwd = Path::new("."); + #[cfg(not(target_arch = "wasm32"))] + let cwd = path_absolutize::path_dedot::CWD.as_path(); + + if let Ok(path) = path.strip_prefix(cwd) { return format!("{}", path.display()); } format!("{}", path.display()) From 0a5be74be38030d1a6891a7966514be95afe7b1d Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 13:25:46 -0400 Subject: [PATCH 151/155] Fix transformers checkout in scripts/formatter_ecosystem_checks.sh (#6622) ## Summary In #6387, we accidentally added `git -C "$dir/django" checkout 95e4d6b81312fdd9f8ebf3385be1c1331168b5cf` as the transformers checkout (duplicated line from the Django case). This PR fixes the SHA, and spaces out the cases to make it more visible. I _think_ the net effect here is that we've been formatting `main` on transformers, rather than the SHA? --- scripts/formatter_ecosystem_checks.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/formatter_ecosystem_checks.sh b/scripts/formatter_ecosystem_checks.sh index 4acbce21a6..7342105c44 100755 --- a/scripts/formatter_ecosystem_checks.sh +++ b/scripts/formatter_ecosystem_checks.sh @@ -21,31 +21,37 @@ if [ ! -d "$dir/twine/.git" ]; then git clone --filter=tree:0 https://github.com/pypa/twine "$dir/twine" fi git -C "$dir/twine" checkout 0bb428c410b8df64c04dc881ac1db37d932f3066 + # web framework that implements a lot of magic if [ ! -d "$dir/django/.git" ]; then git clone --filter=tree:0 https://github.com/django/django "$dir/django" fi git -C "$dir/django" checkout 95e4d6b81312fdd9f8ebf3385be1c1331168b5cf + # an ML project if [ ! -d "$dir/transformers/.git" ]; then git clone --filter=tree:0 https://github.com/huggingface/transformers "$dir/transformers" fi -git -C "$dir/django" checkout 95e4d6b81312fdd9f8ebf3385be1c1331168b5cf +git -C "$dir/transformers" checkout c9a82be592ca305180a7ab6a36e884bca1d426b8 + # type annotations if [ ! -d "$dir/typeshed/.git" ]; then git clone --filter=tree:0 https://github.com/python/typeshed "$dir/typeshed" fi git -C "$dir/typeshed" checkout 7d33060e6ae3ebe54462a891f0c566c97371915b + # python 3.11, typing and 100% test coverage if [ ! -d "$dir/warehouse/.git" ]; then git clone --filter=tree:0 https://github.com/pypi/warehouse "$dir/warehouse" fi git -C "$dir/warehouse" checkout fe6455c0a946e81f61d72edc1049f536d8bba903 + # zulip, a django user if [ ! -d "$dir/zulip/.git" ]; then git clone --filter=tree:0 https://github.com/zulip/zulip "$dir/zulip" fi git -C "$dir/zulip" checkout 6cb080c4479546a7f5cb017fcddea56605910b48 + # cpython itself if [ ! -d "$dir/cpython/.git" ]; then git clone --filter=tree:0 https://github.com/python/cpython "$dir/cpython" From 6253d8e2c8aa5972c18751094d1dfc8dc16c9ebd Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 16 Aug 2023 12:38:33 -0500 Subject: [PATCH 152/155] Remove unused runtime string formatting logic (#6624) In https://github.com/astral-sh/ruff/pull/6616 we are adding support for nested replacements in format specifiers which makes actually formatting strings infeasible without a great deal of complexity. Since we're not using these functions (they just exist for runtime use in RustPython), we can just remove them. --- Cargo.lock | 1 - crates/ruff_python_literal/Cargo.toml | 1 - crates/ruff_python_literal/src/cformat.rs | 440 +------------------ crates/ruff_python_literal/src/format.rs | 511 +--------------------- 4 files changed, 4 insertions(+), 949 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6221b28476..64150585ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2378,7 +2378,6 @@ dependencies = [ "is-macro", "itertools", "lexical-parse-float", - "num-bigint", "num-traits", "rand", "unic-ucd-category", diff --git a/crates/ruff_python_literal/Cargo.toml b/crates/ruff_python_literal/Cargo.toml index 819dd59149..fd6a8dc439 100644 --- a/crates/ruff_python_literal/Cargo.toml +++ b/crates/ruff_python_literal/Cargo.toml @@ -17,7 +17,6 @@ hexf-parse = "0.2.1" is-macro.workspace = true itertools = { workspace = true } lexical-parse-float = { version = "0.8.0", features = ["format"] } -num-bigint = { workspace = true } num-traits = { workspace = true } unic-ucd-category = "0.9" diff --git a/crates/ruff_python_literal/src/cformat.rs b/crates/ruff_python_literal/src/cformat.rs index f0aa883bdc..e635faa384 100644 --- a/crates/ruff_python_literal/src/cformat.rs +++ b/crates/ruff_python_literal/src/cformat.rs @@ -1,15 +1,13 @@ //! Implementation of Printf-Style string formatting //! as per the [Python Docs](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting). use bitflags::bitflags; -use num_traits::Signed; use std::{ - cmp, fmt, + fmt, iter::{Enumerate, Peekable}, str::FromStr, }; -use crate::{float, Case}; -use num_bigint::{BigInt, Sign}; +use crate::Case; #[derive(Debug, PartialEq)] pub enum CFormatErrorType { @@ -165,249 +163,6 @@ impl CFormatSpec { format_char, }) } - - fn compute_fill_string(fill_char: char, fill_chars_needed: usize) -> String { - (0..fill_chars_needed) - .map(|_| fill_char) - .collect::() - } - - fn fill_string( - &self, - string: String, - fill_char: char, - num_prefix_chars: Option, - ) -> String { - let mut num_chars = string.chars().count(); - if let Some(num_prefix_chars) = num_prefix_chars { - num_chars += num_prefix_chars; - } - let num_chars = num_chars; - - let width = match &self.min_field_width { - Some(CFormatQuantity::Amount(width)) => cmp::max(width, &num_chars), - _ => &num_chars, - }; - let fill_chars_needed = width.saturating_sub(num_chars); - let fill_string = CFormatSpec::compute_fill_string(fill_char, fill_chars_needed); - - if fill_string.is_empty() { - string - } else { - if self.flags.contains(CConversionFlags::LEFT_ADJUST) { - format!("{string}{fill_string}") - } else { - format!("{fill_string}{string}") - } - } - } - - fn fill_string_with_precision(&self, string: String, fill_char: char) -> String { - let num_chars = string.chars().count(); - - let width = match &self.precision { - Some(CFormatPrecision::Quantity(CFormatQuantity::Amount(width))) => { - cmp::max(width, &num_chars) - } - _ => &num_chars, - }; - let fill_chars_needed = width.saturating_sub(num_chars); - let fill_string = CFormatSpec::compute_fill_string(fill_char, fill_chars_needed); - - if fill_string.is_empty() { - string - } else { - // Don't left-adjust if precision-filling: that will always be prepending 0s to %d - // arguments, the LEFT_ADJUST flag will be used by a later call to fill_string with - // the 0-filled string as the string param. - format!("{fill_string}{string}") - } - } - - fn format_string_with_precision( - &self, - string: String, - precision: Option<&CFormatPrecision>, - ) -> String { - // truncate if needed - let string = match precision { - Some(CFormatPrecision::Quantity(CFormatQuantity::Amount(precision))) - if string.chars().count() > *precision => - { - string.chars().take(*precision).collect::() - } - Some(CFormatPrecision::Dot) => { - // truncate to 0 - String::new() - } - _ => string, - }; - self.fill_string(string, ' ', None) - } - - #[inline] - pub fn format_string(&self, string: String) -> String { - self.format_string_with_precision(string, self.precision.as_ref()) - } - - #[inline] - pub fn format_char(&self, ch: char) -> String { - self.format_string_with_precision( - ch.to_string(), - Some(&(CFormatQuantity::Amount(1).into())), - ) - } - - pub fn format_bytes(&self, bytes: &[u8]) -> Vec { - let bytes = if let Some(CFormatPrecision::Quantity(CFormatQuantity::Amount(precision))) = - self.precision - { - &bytes[..cmp::min(bytes.len(), precision)] - } else { - bytes - }; - if let Some(CFormatQuantity::Amount(width)) = self.min_field_width { - let fill = cmp::max(0, width - bytes.len()); - let mut v = Vec::with_capacity(bytes.len() + fill); - if self.flags.contains(CConversionFlags::LEFT_ADJUST) { - v.extend_from_slice(bytes); - v.append(&mut vec![b' '; fill]); - } else { - v.append(&mut vec![b' '; fill]); - v.extend_from_slice(bytes); - } - v - } else { - bytes.to_vec() - } - } - - pub fn format_number(&self, num: &BigInt) -> String { - use CNumberType::{Decimal, Hex, Octal}; - let magnitude = num.abs(); - let prefix = if self.flags.contains(CConversionFlags::ALTERNATE_FORM) { - match self.format_type { - CFormatType::Number(Octal) => "0o", - CFormatType::Number(Hex(Case::Lower)) => "0x", - CFormatType::Number(Hex(Case::Upper)) => "0X", - _ => "", - } - } else { - "" - }; - - let magnitude_string: String = match self.format_type { - CFormatType::Number(Decimal) => magnitude.to_str_radix(10), - CFormatType::Number(Octal) => magnitude.to_str_radix(8), - CFormatType::Number(Hex(Case::Lower)) => magnitude.to_str_radix(16), - CFormatType::Number(Hex(Case::Upper)) => { - let mut result = magnitude.to_str_radix(16); - result.make_ascii_uppercase(); - result - } - _ => unreachable!(), // Should not happen because caller has to make sure that this is a number - }; - - let sign_string = match num.sign() { - Sign::Minus => "-", - _ => self.flags.sign_string(), - }; - - let padded_magnitude_string = self.fill_string_with_precision(magnitude_string, '0'); - - if self.flags.contains(CConversionFlags::ZERO_PAD) { - let fill_char = if self.flags.contains(CConversionFlags::LEFT_ADJUST) { - ' ' // '-' overrides the '0' conversion if both are given - } else { - '0' - }; - let signed_prefix = format!("{sign_string}{prefix}"); - format!( - "{}{}", - signed_prefix, - self.fill_string( - padded_magnitude_string, - fill_char, - Some(signed_prefix.chars().count()), - ), - ) - } else { - self.fill_string( - format!("{sign_string}{prefix}{padded_magnitude_string}"), - ' ', - None, - ) - } - } - - pub fn format_float(&self, num: f64) -> String { - let sign_string = if num.is_sign_negative() && !num.is_nan() { - "-" - } else { - self.flags.sign_string() - }; - - let precision = match &self.precision { - Some(CFormatPrecision::Quantity(quantity)) => match quantity { - CFormatQuantity::Amount(amount) => *amount, - CFormatQuantity::FromValuesTuple => 6, - }, - Some(CFormatPrecision::Dot) => 0, - None => 6, - }; - - let magnitude_string = match &self.format_type { - CFormatType::Float(CFloatType::PointDecimal(case)) => { - let magnitude = num.abs(); - float::format_fixed( - precision, - magnitude, - *case, - self.flags.contains(CConversionFlags::ALTERNATE_FORM), - ) - } - CFormatType::Float(CFloatType::Exponent(case)) => { - let magnitude = num.abs(); - float::format_exponent( - precision, - magnitude, - *case, - self.flags.contains(CConversionFlags::ALTERNATE_FORM), - ) - } - CFormatType::Float(CFloatType::General(case)) => { - let precision = if precision == 0 { 1 } else { precision }; - let magnitude = num.abs(); - float::format_general( - precision, - magnitude, - *case, - self.flags.contains(CConversionFlags::ALTERNATE_FORM), - false, - ) - } - _ => unreachable!(), - }; - - if self.flags.contains(CConversionFlags::ZERO_PAD) { - let fill_char = if self.flags.contains(CConversionFlags::LEFT_ADJUST) { - ' ' - } else { - '0' - }; - format!( - "{}{}", - sign_string, - self.fill_string( - magnitude_string, - fill_char, - Some(sign_string.chars().count()), - ) - ) - } else { - self.fill_string(format!("{sign_string}{magnitude_string}"), ' ', None) - } - } } fn parse_spec_mapping_key(iter: &mut ParseIter) -> Result, ParsingError> @@ -741,38 +496,6 @@ impl CFormatString { mod tests { use super::*; - #[test] - fn test_fill_and_align() { - assert_eq!( - "%10s" - .parse::() - .unwrap() - .format_string("test".to_owned()), - " test".to_owned() - ); - assert_eq!( - "%-10s" - .parse::() - .unwrap() - .format_string("test".to_owned()), - "test ".to_owned() - ); - assert_eq!( - "%#10x" - .parse::() - .unwrap() - .format_number(&BigInt::from(0x1337)), - " 0x1337".to_owned() - ); - assert_eq!( - "%-#10x" - .parse::() - .unwrap() - .format_number(&BigInt::from(0x1337)), - "0x1337 ".to_owned() - ); - } - #[test] fn test_parse_key() { let expected = Ok(CFormatSpec { @@ -844,165 +567,6 @@ mod tests { }); let parsed = "% 0 -+++###10d".parse::(); assert_eq!(parsed, expected); - assert_eq!( - parsed.unwrap().format_number(&BigInt::from(12)), - "+12 ".to_owned() - ); - } - - #[test] - fn test_parse_and_format_string() { - assert_eq!( - "%5.4s" - .parse::() - .unwrap() - .format_string("Hello, World!".to_owned()), - " Hell".to_owned() - ); - assert_eq!( - "%-5.4s" - .parse::() - .unwrap() - .format_string("Hello, World!".to_owned()), - "Hell ".to_owned() - ); - assert_eq!( - "%.s" - .parse::() - .unwrap() - .format_string("Hello, World!".to_owned()), - String::new() - ); - assert_eq!( - "%5.s" - .parse::() - .unwrap() - .format_string("Hello, World!".to_owned()), - " ".to_owned() - ); - } - - #[test] - fn test_parse_and_format_unicode_string() { - assert_eq!( - "%.2s" - .parse::() - .unwrap() - .format_string("❤❤❤❤❤❤❤❤".to_owned()), - "❤❤".to_owned() - ); - } - - #[test] - fn test_parse_and_format_number() { - assert_eq!( - "%5d" - .parse::() - .unwrap() - .format_number(&BigInt::from(27)), - " 27".to_owned() - ); - assert_eq!( - "%05d" - .parse::() - .unwrap() - .format_number(&BigInt::from(27)), - "00027".to_owned() - ); - assert_eq!( - "%.5d" - .parse::() - .unwrap() - .format_number(&BigInt::from(27)), - "00027".to_owned() - ); - assert_eq!( - "%+05d" - .parse::() - .unwrap() - .format_number(&BigInt::from(27)), - "+0027".to_owned() - ); - assert_eq!( - "%-d" - .parse::() - .unwrap() - .format_number(&BigInt::from(-27)), - "-27".to_owned() - ); - assert_eq!( - "% d" - .parse::() - .unwrap() - .format_number(&BigInt::from(27)), - " 27".to_owned() - ); - assert_eq!( - "% d" - .parse::() - .unwrap() - .format_number(&BigInt::from(-27)), - "-27".to_owned() - ); - assert_eq!( - "%08x" - .parse::() - .unwrap() - .format_number(&BigInt::from(0x1337)), - "00001337".to_owned() - ); - assert_eq!( - "%#010x" - .parse::() - .unwrap() - .format_number(&BigInt::from(0x1337)), - "0x00001337".to_owned() - ); - assert_eq!( - "%-#010x" - .parse::() - .unwrap() - .format_number(&BigInt::from(0x1337)), - "0x1337 ".to_owned() - ); - } - - #[test] - fn test_parse_and_format_float() { - assert_eq!( - "%f".parse::().unwrap().format_float(1.2345), - "1.234500" - ); - assert_eq!( - "%.2f".parse::().unwrap().format_float(1.2345), - "1.23" - ); - assert_eq!( - "%.f".parse::().unwrap().format_float(1.2345), - "1" - ); - assert_eq!( - "%+.f".parse::().unwrap().format_float(1.2345), - "+1" - ); - assert_eq!( - "%+f".parse::().unwrap().format_float(1.2345), - "+1.234500" - ); - assert_eq!( - "% f".parse::().unwrap().format_float(1.2345), - " 1.234500" - ); - assert_eq!( - "%f".parse::().unwrap().format_float(-1.2345), - "-1.234500" - ); - assert_eq!( - "%f".parse::() - .unwrap() - .format_float(1.234_567_890_1), - "1.234568" - ); } #[test] diff --git a/crates/ruff_python_literal/src/format.rs b/crates/ruff_python_literal/src/format.rs index 89e7ef852a..dd6fdcc8e7 100644 --- a/crates/ruff_python_literal/src/format.rs +++ b/crates/ruff_python_literal/src/format.rs @@ -1,12 +1,9 @@ use itertools::{Itertools, PeekingNext}; -use num_traits::{cast::ToPrimitive, FromPrimitive, Signed}; use std::error::Error; -use std::ops::Deref; -use std::{cmp, str::FromStr}; +use std::str::FromStr; -use crate::{float, Case}; -use num_bigint::{BigInt, Sign}; +use crate::Case; trait FormatParse { fn parse(text: &str) -> (Option, &str) @@ -325,418 +322,6 @@ impl FormatSpec { format_type, }) } - - fn compute_fill_string(fill_char: char, fill_chars_needed: i32) -> String { - (0..fill_chars_needed) - .map(|_| fill_char) - .collect::() - } - - #[allow( - clippy::cast_possible_wrap, - clippy::cast_possible_truncation, - clippy::cast_sign_loss - )] - fn add_magnitude_separators_for_char( - magnitude_str: &str, - inter: i32, - sep: char, - disp_digit_cnt: i32, - ) -> String { - // Don't add separators to the floating decimal point of numbers - let mut parts = magnitude_str.splitn(2, '.'); - let magnitude_int_str = parts.next().unwrap().to_string(); - let dec_digit_cnt = magnitude_str.len() as i32 - magnitude_int_str.len() as i32; - let int_digit_cnt = disp_digit_cnt - dec_digit_cnt; - let mut result = FormatSpec::separate_integer(magnitude_int_str, inter, sep, int_digit_cnt); - if let Some(part) = parts.next() { - result.push_str(&format!(".{part}")); - } - result - } - - #[allow( - clippy::cast_sign_loss, - clippy::cast_possible_wrap, - clippy::cast_possible_truncation - )] - fn separate_integer( - magnitude_str: String, - inter: i32, - sep: char, - disp_digit_cnt: i32, - ) -> String { - let magnitude_len = magnitude_str.len() as i32; - let offset = i32::from(disp_digit_cnt % (inter + 1) == 0); - let disp_digit_cnt = disp_digit_cnt + offset; - let pad_cnt = disp_digit_cnt - magnitude_len; - let sep_cnt = disp_digit_cnt / (inter + 1); - let diff = pad_cnt - sep_cnt; - if pad_cnt > 0 && diff > 0 { - // separate with 0 padding - let padding = "0".repeat(diff as usize); - let padded_num = format!("{padding}{magnitude_str}"); - FormatSpec::insert_separator(padded_num, inter, sep, sep_cnt) - } else { - // separate without padding - let sep_cnt = (magnitude_len - 1) / inter; - FormatSpec::insert_separator(magnitude_str, inter, sep, sep_cnt) - } - } - - #[allow( - clippy::cast_sign_loss, - clippy::cast_possible_truncation, - clippy::cast_possible_wrap - )] - fn insert_separator(mut magnitude_str: String, inter: i32, sep: char, sep_cnt: i32) -> String { - let magnitude_len = magnitude_str.len() as i32; - for i in 1..=sep_cnt { - magnitude_str.insert((magnitude_len - inter * i) as usize, sep); - } - magnitude_str - } - - fn validate_format(&self, default_format_type: FormatType) -> Result<(), FormatSpecError> { - let format_type = self.format_type.as_ref().unwrap_or(&default_format_type); - match (&self.grouping_option, format_type) { - ( - Some(FormatGrouping::Comma), - FormatType::String - | FormatType::Character - | FormatType::Binary - | FormatType::Octal - | FormatType::Hex(_) - | FormatType::Number(_), - ) => { - let ch = char::from(format_type); - Err(FormatSpecError::UnspecifiedFormat(',', ch)) - } - ( - Some(FormatGrouping::Underscore), - FormatType::String | FormatType::Character | FormatType::Number(_), - ) => { - let ch = char::from(format_type); - Err(FormatSpecError::UnspecifiedFormat('_', ch)) - } - _ => Ok(()), - } - } - - fn get_separator_interval(&self) -> usize { - match self.format_type { - Some(FormatType::Binary | FormatType::Octal | FormatType::Hex(_)) => 4, - Some(FormatType::Decimal | FormatType::Number(_) | FormatType::FixedPoint(_)) => 3, - None => 3, - _ => panic!("Separators only valid for numbers!"), - } - } - - #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] - fn add_magnitude_separators(&self, magnitude_str: String, prefix: &str) -> String { - match &self.grouping_option { - Some(fg) => { - let sep = match fg { - FormatGrouping::Comma => ',', - FormatGrouping::Underscore => '_', - }; - let inter = self.get_separator_interval().try_into().unwrap(); - let magnitude_len = magnitude_str.len(); - let width = self.width.unwrap_or(magnitude_len) as i32 - prefix.len() as i32; - let disp_digit_cnt = cmp::max(width, magnitude_len as i32); - FormatSpec::add_magnitude_separators_for_char( - &magnitude_str, - inter, - sep, - disp_digit_cnt, - ) - } - None => magnitude_str, - } - } - - pub fn format_bool(&self, input: bool) -> Result { - let x = u8::from(input); - match &self.format_type { - Some( - FormatType::Binary - | FormatType::Decimal - | FormatType::Octal - | FormatType::Number(Case::Lower) - | FormatType::Hex(_) - | FormatType::GeneralFormat(_) - | FormatType::Character, - ) => self.format_int(&BigInt::from_u8(x).unwrap()), - Some(FormatType::Exponent(_) | FormatType::FixedPoint(_) | FormatType::Percentage) => { - self.format_float(f64::from(x)) - } - None => { - let first_letter = (input.to_string().as_bytes()[0] as char).to_uppercase(); - Ok(first_letter.collect::() + &input.to_string()[1..]) - } - _ => Err(FormatSpecError::InvalidFormatSpecifier), - } - } - - pub fn format_float(&self, num: f64) -> Result { - self.validate_format(FormatType::FixedPoint(Case::Lower))?; - let precision = self.precision.unwrap_or(6); - let magnitude = num.abs(); - let raw_magnitude_str: Result = match &self.format_type { - Some(FormatType::FixedPoint(case)) => Ok(float::format_fixed( - precision, - magnitude, - *case, - self.alternate_form, - )), - Some( - FormatType::Decimal - | FormatType::Binary - | FormatType::Octal - | FormatType::Hex(_) - | FormatType::String - | FormatType::Character - | FormatType::Number(Case::Upper), - ) => { - let ch = char::from(self.format_type.as_ref().unwrap()); - Err(FormatSpecError::UnknownFormatCode(ch, "float")) - } - Some(FormatType::GeneralFormat(case) | FormatType::Number(case)) => { - let precision = if precision == 0 { 1 } else { precision }; - Ok(float::format_general( - precision, - magnitude, - *case, - self.alternate_form, - false, - )) - } - Some(FormatType::Exponent(case)) => Ok(float::format_exponent( - precision, - magnitude, - *case, - self.alternate_form, - )), - Some(FormatType::Percentage) => match magnitude { - magnitude if magnitude.is_nan() => Ok("nan%".to_owned()), - magnitude if magnitude.is_infinite() => Ok("inf%".to_owned()), - _ => { - let result = format!("{:.*}", precision, magnitude * 100.0); - let point = float::decimal_point_or_empty(precision, self.alternate_form); - Ok(format!("{result}{point}%")) - } - }, - None => match magnitude { - magnitude if magnitude.is_nan() => Ok("nan".to_owned()), - magnitude if magnitude.is_infinite() => Ok("inf".to_owned()), - _ => match self.precision { - Some(precision) => Ok(float::format_general( - precision, - magnitude, - Case::Lower, - self.alternate_form, - true, - )), - None => Ok(float::to_string(magnitude)), - }, - }, - }; - let format_sign = self.sign.unwrap_or(FormatSign::Minus); - let sign_str = if num.is_sign_negative() && !num.is_nan() { - "-" - } else { - match format_sign { - FormatSign::Plus => "+", - FormatSign::Minus => "", - FormatSign::MinusOrSpace => " ", - } - }; - let magnitude_str = self.add_magnitude_separators(raw_magnitude_str?, sign_str); - Ok( - self.format_sign_and_align( - &AsciiStr::new(&magnitude_str), - sign_str, - FormatAlign::Right, - ), - ) - } - - #[inline] - fn format_int_radix(&self, magnitude: &BigInt, radix: u32) -> Result { - match self.precision { - Some(_) => Err(FormatSpecError::PrecisionNotAllowed), - None => Ok(magnitude.to_str_radix(radix)), - } - } - - pub fn format_int(&self, num: &BigInt) -> Result { - self.validate_format(FormatType::Decimal)?; - let magnitude = num.abs(); - let prefix = if self.alternate_form { - match self.format_type { - Some(FormatType::Binary) => "0b", - Some(FormatType::Octal) => "0o", - Some(FormatType::Hex(Case::Lower)) => "0x", - Some(FormatType::Hex(Case::Upper)) => "0X", - _ => "", - } - } else { - "" - }; - let raw_magnitude_str = match self.format_type { - Some(FormatType::Binary) => self.format_int_radix(&magnitude, 2), - Some(FormatType::Decimal) => self.format_int_radix(&magnitude, 10), - Some(FormatType::Octal) => self.format_int_radix(&magnitude, 8), - Some(FormatType::Hex(Case::Lower)) => self.format_int_radix(&magnitude, 16), - Some(FormatType::Hex(Case::Upper)) => { - if self.precision.is_some() { - Err(FormatSpecError::PrecisionNotAllowed) - } else { - let mut result = magnitude.to_str_radix(16); - result.make_ascii_uppercase(); - Ok(result) - } - } - - Some(FormatType::Number(Case::Lower)) => self.format_int_radix(&magnitude, 10), - Some(FormatType::Number(Case::Upper)) => { - Err(FormatSpecError::UnknownFormatCode('N', "int")) - } - Some(FormatType::String) => Err(FormatSpecError::UnknownFormatCode('s', "int")), - Some(FormatType::Character) => match (self.sign, self.alternate_form) { - (Some(_), _) => Err(FormatSpecError::NotAllowed("Sign")), - (_, true) => Err(FormatSpecError::NotAllowed("Alternate form (#)")), - (_, _) => match num.to_u32() { - Some(n) if n <= 0x0010_ffff => Ok(std::char::from_u32(n).unwrap().to_string()), - Some(_) | None => Err(FormatSpecError::CodeNotInRange), - }, - }, - Some( - FormatType::GeneralFormat(_) - | FormatType::FixedPoint(_) - | FormatType::Exponent(_) - | FormatType::Percentage, - ) => match num.to_f64() { - Some(float) => return self.format_float(float), - _ => Err(FormatSpecError::UnableToConvert), - }, - None => self.format_int_radix(&magnitude, 10), - }?; - let format_sign = self.sign.unwrap_or(FormatSign::Minus); - let sign_str = match num.sign() { - Sign::Minus => "-", - _ => match format_sign { - FormatSign::Plus => "+", - FormatSign::Minus => "", - FormatSign::MinusOrSpace => " ", - }, - }; - let sign_prefix = format!("{sign_str}{prefix}"); - let magnitude_str = self.add_magnitude_separators(raw_magnitude_str, &sign_prefix); - Ok(self.format_sign_and_align( - &AsciiStr::new(&magnitude_str), - &sign_prefix, - FormatAlign::Right, - )) - } - - pub fn format_string(&self, s: &T) -> Result - where - T: CharLen + Deref, - { - self.validate_format(FormatType::String)?; - match self.format_type { - Some(FormatType::String) | None => { - let mut value = self.format_sign_and_align(s, "", FormatAlign::Left); - if let Some(precision) = self.precision { - value.truncate(precision); - } - Ok(value) - } - _ => { - let ch = char::from(self.format_type.as_ref().unwrap()); - Err(FormatSpecError::UnknownFormatCode(ch, "str")) - } - } - } - - #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] - fn format_sign_and_align( - &self, - magnitude_str: &T, - sign_str: &str, - default_align: FormatAlign, - ) -> String - where - T: CharLen + Deref, - { - let align = self.align.unwrap_or(default_align); - - let num_chars = magnitude_str.char_len(); - let fill_char = self.fill.unwrap_or(' '); - let fill_chars_needed: i32 = self.width.map_or(0, |w| { - cmp::max(0, (w as i32) - (num_chars as i32) - (sign_str.len() as i32)) - }); - - let magnitude_str = &**magnitude_str; - match align { - FormatAlign::Left => format!( - "{}{}{}", - sign_str, - magnitude_str, - FormatSpec::compute_fill_string(fill_char, fill_chars_needed) - ), - FormatAlign::Right => format!( - "{}{}{}", - FormatSpec::compute_fill_string(fill_char, fill_chars_needed), - sign_str, - magnitude_str - ), - FormatAlign::AfterSign => format!( - "{}{}{}", - sign_str, - FormatSpec::compute_fill_string(fill_char, fill_chars_needed), - magnitude_str - ), - FormatAlign::Center => { - let left_fill_chars_needed = fill_chars_needed / 2; - let right_fill_chars_needed = fill_chars_needed - left_fill_chars_needed; - let left_fill_string = - FormatSpec::compute_fill_string(fill_char, left_fill_chars_needed); - let right_fill_string = - FormatSpec::compute_fill_string(fill_char, right_fill_chars_needed); - format!("{left_fill_string}{sign_str}{magnitude_str}{right_fill_string}") - } - } - } -} - -pub trait CharLen { - /// Returns the number of characters in the text - fn char_len(&self) -> usize; -} - -struct AsciiStr<'a> { - inner: &'a str, -} - -impl<'a> AsciiStr<'a> { - fn new(inner: &'a str) -> Self { - Self { inner } - } -} - -impl CharLen for AsciiStr<'_> { - fn char_len(&self) -> usize { - self.inner.len() - } -} - -impl Deref for AsciiStr<'_> { - type Target = str; - fn deref(&self) -> &Self::Target { - self.inner - } } #[derive(Debug, PartialEq)] @@ -1122,98 +707,6 @@ mod tests { assert_eq!(FormatSpec::parse("<>-#23,.11b"), expected); } - fn format_bool(text: &str, value: bool) -> Result { - FormatSpec::parse(text).and_then(|spec| spec.format_bool(value)) - } - - #[test] - fn test_format_bool() { - assert_eq!(format_bool("b", true), Ok("1".to_owned())); - assert_eq!(format_bool("b", false), Ok("0".to_owned())); - assert_eq!(format_bool("d", true), Ok("1".to_owned())); - assert_eq!(format_bool("d", false), Ok("0".to_owned())); - assert_eq!(format_bool("o", true), Ok("1".to_owned())); - assert_eq!(format_bool("o", false), Ok("0".to_owned())); - assert_eq!(format_bool("n", true), Ok("1".to_owned())); - assert_eq!(format_bool("n", false), Ok("0".to_owned())); - assert_eq!(format_bool("x", true), Ok("1".to_owned())); - assert_eq!(format_bool("x", false), Ok("0".to_owned())); - assert_eq!(format_bool("X", true), Ok("1".to_owned())); - assert_eq!(format_bool("X", false), Ok("0".to_owned())); - assert_eq!(format_bool("g", true), Ok("1".to_owned())); - assert_eq!(format_bool("g", false), Ok("0".to_owned())); - assert_eq!(format_bool("G", true), Ok("1".to_owned())); - assert_eq!(format_bool("G", false), Ok("0".to_owned())); - assert_eq!(format_bool("c", true), Ok("\x01".to_owned())); - assert_eq!(format_bool("c", false), Ok("\x00".to_owned())); - assert_eq!(format_bool("e", true), Ok("1.000000e+00".to_owned())); - assert_eq!(format_bool("e", false), Ok("0.000000e+00".to_owned())); - assert_eq!(format_bool("E", true), Ok("1.000000E+00".to_owned())); - assert_eq!(format_bool("E", false), Ok("0.000000E+00".to_owned())); - assert_eq!(format_bool("f", true), Ok("1.000000".to_owned())); - assert_eq!(format_bool("f", false), Ok("0.000000".to_owned())); - assert_eq!(format_bool("F", true), Ok("1.000000".to_owned())); - assert_eq!(format_bool("F", false), Ok("0.000000".to_owned())); - assert_eq!(format_bool("%", true), Ok("100.000000%".to_owned())); - assert_eq!(format_bool("%", false), Ok("0.000000%".to_owned())); - } - - #[test] - fn test_format_int() { - assert_eq!( - FormatSpec::parse("d") - .unwrap() - .format_int(&BigInt::from_bytes_be(Sign::Plus, b"\x10")), - Ok("16".to_owned()) - ); - assert_eq!( - FormatSpec::parse("x") - .unwrap() - .format_int(&BigInt::from_bytes_be(Sign::Plus, b"\x10")), - Ok("10".to_owned()) - ); - assert_eq!( - FormatSpec::parse("b") - .unwrap() - .format_int(&BigInt::from_bytes_be(Sign::Plus, b"\x10")), - Ok("10000".to_owned()) - ); - assert_eq!( - FormatSpec::parse("o") - .unwrap() - .format_int(&BigInt::from_bytes_be(Sign::Plus, b"\x10")), - Ok("20".to_owned()) - ); - assert_eq!( - FormatSpec::parse("+d") - .unwrap() - .format_int(&BigInt::from_bytes_be(Sign::Plus, b"\x10")), - Ok("+16".to_owned()) - ); - assert_eq!( - FormatSpec::parse("^ 5d") - .unwrap() - .format_int(&BigInt::from_bytes_be(Sign::Minus, b"\x10")), - Ok(" -16 ".to_owned()) - ); - assert_eq!( - FormatSpec::parse("0>+#10x") - .unwrap() - .format_int(&BigInt::from_bytes_be(Sign::Plus, b"\x10")), - Ok("00000+0x10".to_owned()) - ); - } - - #[test] - fn test_format_int_sep() { - let spec = FormatSpec::parse(",").expect(""); - assert_eq!(spec.grouping_option, Some(FormatGrouping::Comma)); - assert_eq!( - spec.format_int(&BigInt::from_str("1234567890123456789012345678").unwrap()), - Ok("1,234,567,890,123,456,789,012,345,678".to_owned()) - ); - } - #[test] fn test_format_parse() { let expected = Ok(FormatString { From 98b9f2e70570a1a8a6b473fce496d3c4020e22d4 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 16:33:59 -0400 Subject: [PATCH 153/155] Respect .ipynb and .pyi sources when linting from stdin (#6628) ## Summary When running Ruff from stdin, we were always falling back to the default source type, even if the user specified a path (as is the case when running from the LSP). This PR wires up the source type inference, which means we now get the expected result when checking `.pyi` and `.ipynb` files. Closes #6627. ## Test Plan Verified that `cat crates/ruff/resources/test/fixtures/jupyter/valid.ipynb | cargo run -p ruff_cli -- --force-exclude --no-cache --no-fix --isolated --select ALL --stdin-filename foo.ipynb -` yielded the expected results (and differs from the errors you get if you omit the filename). Verified that `cat foo.pyi | cargo run -p ruff_cli -- --force-exclude --no-cache --no-fix --format json --isolated --select TCH --stdin-filename path/to/foo.pyi -` yielded no errors. --- crates/ruff/src/jupyter/notebook.rs | 61 ++++++++++------ crates/ruff/src/test.rs | 2 +- crates/ruff_cli/src/diagnostics.rs | 88 +++++++++++++++++++---- crates/ruff_cli/tests/integration_test.rs | 42 +++++++++++ 4 files changed, 155 insertions(+), 38 deletions(-) diff --git a/crates/ruff/src/jupyter/notebook.rs b/crates/ruff/src/jupyter/notebook.rs index 43238f5e2b..a4289fd776 100644 --- a/crates/ruff/src/jupyter/notebook.rs +++ b/crates/ruff/src/jupyter/notebook.rs @@ -1,7 +1,7 @@ use std::cmp::Ordering; use std::fmt::Display; use std::fs::File; -use std::io::{BufReader, BufWriter, Read, Seek, SeekFrom, Write}; +use std::io::{BufReader, BufWriter, Cursor, Read, Seek, SeekFrom, Write}; use std::iter; use std::path::Path; @@ -26,7 +26,7 @@ pub const JUPYTER_NOTEBOOK_EXT: &str = "ipynb"; /// Run round-trip source code generation on a given Jupyter notebook file path. pub fn round_trip(path: &Path) -> anyhow::Result { - let mut notebook = Notebook::read(path).map_err(|err| { + let mut notebook = Notebook::from_path(path).map_err(|err| { anyhow::anyhow!( "Failed to read notebook file `{}`: {:?}", path.display(), @@ -120,18 +120,30 @@ pub struct Notebook { impl Notebook { /// Read the Jupyter Notebook from the given [`Path`]. - /// - /// See also the black implementation - /// - pub fn read(path: &Path) -> Result> { - let mut reader = BufReader::new(File::open(path).map_err(|err| { + pub fn from_path(path: &Path) -> Result> { + Self::from_reader(BufReader::new(File::open(path).map_err(|err| { Diagnostic::new( IOError { message: format!("{err}"), }, TextRange::default(), ) - })?); + })?)) + } + + /// Read the Jupyter Notebook from its JSON string. + pub fn from_contents(contents: &str) -> Result> { + Self::from_reader(Cursor::new(contents)) + } + + /// Read a Jupyter Notebook from a [`Read`] implementor. + /// + /// See also the black implementation + /// + fn from_reader(mut reader: R) -> Result> + where + R: Read + Seek, + { let trailing_newline = reader.seek(SeekFrom::End(-1)).is_ok_and(|_| { let mut buf = [0; 1]; reader.read_exact(&mut buf).is_ok_and(|_| buf[0] == b'\n') @@ -144,7 +156,7 @@ impl Notebook { TextRange::default(), ) })?; - let raw_notebook: RawNotebook = match serde_json::from_reader(reader) { + let raw_notebook: RawNotebook = match serde_json::from_reader(reader.by_ref()) { Ok(notebook) => notebook, Err(err) => { // Translate the error into a diagnostic @@ -159,14 +171,19 @@ impl Notebook { Category::Syntax | Category::Eof => { // Maybe someone saved the python sources (those with the `# %%` separator) // as jupyter notebook instead. Let's help them. - let contents = std::fs::read_to_string(path).map_err(|err| { - Diagnostic::new( - IOError { - message: format!("{err}"), - }, - TextRange::default(), - ) - })?; + let mut contents = String::new(); + reader + .rewind() + .and_then(|_| reader.read_to_string(&mut contents)) + .map_err(|err| { + Diagnostic::new( + IOError { + message: format!("{err}"), + }, + TextRange::default(), + ) + })?; + // Check if tokenizing was successful and the file is non-empty if lex(&contents, Mode::Module).any(|result| result.is_err()) { Diagnostic::new( @@ -182,7 +199,7 @@ impl Notebook { Diagnostic::new( SyntaxError { message: format!( - "Expected a Jupyter Notebook (.{JUPYTER_NOTEBOOK_EXT} extension), \ + "Expected a Jupyter Notebook (.{JUPYTER_NOTEBOOK_EXT}), \ which must be internally stored as JSON, \ but found a Python source file: {err}" ), @@ -484,22 +501,22 @@ mod tests { fn test_invalid() { let path = Path::new("resources/test/fixtures/jupyter/invalid_extension.ipynb"); assert_eq!( - Notebook::read(path).unwrap_err().kind.body, - "SyntaxError: Expected a Jupyter Notebook (.ipynb extension), \ + Notebook::from_path(path).unwrap_err().kind.body, + "SyntaxError: Expected a Jupyter Notebook (.ipynb), \ which must be internally stored as JSON, \ but found a Python source file: \ expected value at line 1 column 1" ); let path = Path::new("resources/test/fixtures/jupyter/not_json.ipynb"); assert_eq!( - Notebook::read(path).unwrap_err().kind.body, + Notebook::from_path(path).unwrap_err().kind.body, "SyntaxError: A Jupyter Notebook (.ipynb) must internally be JSON, \ but this file isn't valid JSON: \ expected value at line 1 column 1" ); let path = Path::new("resources/test/fixtures/jupyter/wrong_schema.ipynb"); assert_eq!( - Notebook::read(path).unwrap_err().kind.body, + Notebook::from_path(path).unwrap_err().kind.body, "SyntaxError: This file does not match the schema expected of Jupyter Notebooks: \ missing field `cells` at line 1 column 2" ); diff --git a/crates/ruff/src/test.rs b/crates/ruff/src/test.rs index b89ce5a80f..07e9c15ac1 100644 --- a/crates/ruff/src/test.rs +++ b/crates/ruff/src/test.rs @@ -33,7 +33,7 @@ use crate::source_kind::SourceKind; #[cfg(not(fuzzing))] pub(crate) fn read_jupyter_notebook(path: &Path) -> Result { let path = test_resource_path("fixtures/jupyter").join(path); - Notebook::read(&path).map_err(|err| { + Notebook::from_path(&path).map_err(|err| { anyhow::anyhow!( "Failed to read notebook file `{}`: {:?}", path.display(), diff --git a/crates/ruff_cli/src/diagnostics.rs b/crates/ruff_cli/src/diagnostics.rs index 5ad6a50fd2..f348468b1b 100644 --- a/crates/ruff_cli/src/diagnostics.rs +++ b/crates/ruff_cli/src/diagnostics.rs @@ -96,12 +96,14 @@ impl AddAssign for Diagnostics { } } -/// Returns either an indexed python jupyter notebook or a diagnostic (which is empty if we skip) -fn load_jupyter_notebook(path: &Path) -> Result> { - let notebook = match Notebook::read(path) { +/// Read a Jupyter Notebook from disk. +/// +/// Returns either an indexed Python Jupyter Notebook or a diagnostic (which is empty if we skip). +fn notebook_from_path(path: &Path) -> Result> { + let notebook = match Notebook::from_path(path) { Ok(notebook) => { if !notebook.is_python_notebook() { - // Not a python notebook, this could e.g. be an R notebook which we want to just skip + // Not a python notebook, this could e.g. be an R notebook which we want to just skip. debug!( "Skipping {} because it's not a Python notebook", path.display() @@ -126,6 +128,44 @@ fn load_jupyter_notebook(path: &Path) -> Result> { Ok(notebook) } +/// Parse a Jupyter Notebook from a JSON string. +/// +/// Returns either an indexed Python Jupyter Notebook or a diagnostic (which is empty if we skip). +fn notebook_from_contents( + contents: &str, + path: Option<&Path>, +) -> Result> { + let notebook = match Notebook::from_contents(contents) { + Ok(notebook) => { + if !notebook.is_python_notebook() { + // Not a python notebook, this could e.g. be an R notebook which we want to just skip. + if let Some(path) = path { + debug!( + "Skipping {} because it's not a Python notebook", + path.display() + ); + } + return Err(Box::default()); + } + notebook + } + Err(diagnostic) => { + // Failed to read the jupyter notebook + return Err(Box::new(Diagnostics { + messages: vec![Message::from_diagnostic( + *diagnostic, + SourceFileBuilder::new(path.map(Path::to_string_lossy).unwrap_or_default(), "") + .finish(), + TextSize::default(), + )], + ..Diagnostics::default() + })); + } + }; + + Ok(notebook) +} + /// Lint the source code at the given `Path`. pub(crate) fn lint_path( path: &Path, @@ -216,7 +256,7 @@ pub(crate) fn lint_path( // Read the file from disk let mut source_kind = if source_type.is_jupyter() { - match load_jupyter_notebook(path) { + match notebook_from_path(path) { Ok(notebook) => SourceKind::Jupyter(notebook), Err(diagnostic) => return Ok(*diagnostic), } @@ -278,7 +318,7 @@ pub(crate) fn lint_path( SourceKind::Jupyter(dest_notebook) => { // We need to load the notebook again, since we might've // mutated it. - let src_notebook = match load_jupyter_notebook(path) { + let src_notebook = match notebook_from_path(path) { Ok(notebook) => notebook, Err(diagnostic) => return Ok(*diagnostic), }; @@ -401,8 +441,19 @@ pub(crate) fn lint_stdin( noqa: flags::Noqa, autofix: flags::FixMode, ) -> Result { - let mut source_kind = SourceKind::Python(contents.to_string()); - let source_type = PySourceType::default(); + let source_type = path.map(PySourceType::from).unwrap_or_default(); + + let mut source_kind = if source_type.is_jupyter() { + // SAFETY: Jupyter isn't the default type, so we must have a path. + match notebook_from_contents(contents, path) { + Ok(notebook) => SourceKind::Jupyter(notebook), + Err(diagnostic) => return Ok(*diagnostic), + } + } else { + SourceKind::Python(contents.to_string()) + }; + + let contents = source_kind.content().to_string(); // Lint the inputs. let ( @@ -417,7 +468,7 @@ pub(crate) fn lint_stdin( transformed, fixed, }) = lint_fix( - contents, + &contents, path.unwrap_or_else(|| Path::new("-")), package, noqa, @@ -433,7 +484,7 @@ pub(crate) fn lint_stdin( flags::FixMode::Diff => { // But only write a diff if it's non-empty. if !fixed.is_empty() { - let text_diff = TextDiff::from_lines(contents, &transformed); + let text_diff = TextDiff::from_lines(contents.as_str(), &transformed); let mut unified_diff = text_diff.unified_diff(); if let Some(path) = path { unified_diff @@ -453,7 +504,7 @@ pub(crate) fn lint_stdin( } else { // If we fail to autofix, lint the original source code. let result = lint_only( - contents, + &contents, path.unwrap_or_else(|| Path::new("-")), package, settings, @@ -472,7 +523,7 @@ pub(crate) fn lint_stdin( } } else { let result = lint_only( - contents, + &contents, path.unwrap_or_else(|| Path::new("-")), package, settings, @@ -508,14 +559,21 @@ pub(crate) fn lint_stdin( mod tests { use std::path::Path; - use crate::diagnostics::{load_jupyter_notebook, Diagnostics}; + use crate::diagnostics::{notebook_from_contents, notebook_from_path, Diagnostics}; #[test] fn test_r() { let path = Path::new("../ruff/resources/test/fixtures/jupyter/R.ipynb"); - // No diagnostics is used as skip signal + // No diagnostics is used as skip signal. assert_eq!( - load_jupyter_notebook(path).unwrap_err(), + notebook_from_path(path).unwrap_err(), + Box::::default() + ); + + let contents = std::fs::read_to_string(path).unwrap(); + // No diagnostics is used as skip signal. + assert_eq!( + notebook_from_contents(&contents, Some(path)).unwrap_err(), Box::::default() ); } diff --git a/crates/ruff_cli/tests/integration_test.rs b/crates/ruff_cli/tests/integration_test.rs index 4d62a835d4..bbb88ad0ec 100644 --- a/crates/ruff_cli/tests/integration_test.rs +++ b/crates/ruff_cli/tests/integration_test.rs @@ -81,6 +81,48 @@ Found 1 error. Ok(()) } +#[test] +fn stdin_source_type() -> Result<()> { + // Raise `TCH` errors in `.py` files. + let mut cmd = Command::cargo_bin(BIN_NAME)?; + let output = cmd + .args([ + "-", + "--format", + "text", + "--stdin-filename", + "TCH.py", + "--isolated", + ]) + .write_stdin("import os\n") + .assert() + .failure(); + assert_eq!( + str::from_utf8(&output.get_output().stdout)?, + r#"TCH.py:1:8: F401 [*] `os` imported but unused +Found 1 error. +[*] 1 potentially fixable with the --fix option. +"# + ); + + // But not in `.pyi` files. + let mut cmd = Command::cargo_bin(BIN_NAME)?; + cmd.args([ + "-", + "--format", + "text", + "--stdin-filename", + "TCH.pyi", + "--isolated", + "--select", + "TCH", + ]) + .write_stdin("import os\n") + .assert() + .success(); + Ok(()) +} + #[cfg(unix)] #[test] fn stdin_json() -> Result<()> { From 97ae9e74333b93b1e375c16e547a7f6698c7b52f Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 17:13:33 -0400 Subject: [PATCH 154/155] Don't detect `pandas#values` for stores, deletes, or class accesses (#6631) ## Summary Ensures we avoid cases like: ```python x.values = 1 ``` Since Pandas doesn't even expose a setter for that. We also avoid cases like: ```python print(self.values) ``` Since it's overwhelming likely to be a false positive. Closes https://github.com/astral-sh/ruff/issues/6630. ## Test Plan `cargo test` --- .../ruff/src/checkers/ast/analyze/expression.rs | 4 ++-- crates/ruff/src/rules/pandas_vet/helpers.rs | 9 ++++++++- crates/ruff/src/rules/pandas_vet/mod.rs | 17 +++++++++++++++++ crates/ruff/src/rules/pandas_vet/rules/attr.rs | 16 +++++++++++----- ..._vet__tests__PD011_pass_values_instance.snap | 4 ++++ ...das_vet__tests__PD011_pass_values_store.snap | 4 ++++ 6 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_instance.snap create mode 100644 crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_store.snap diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index 2951899f4c..419094fcfb 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -261,7 +261,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { pylint::rules::load_before_global_declaration(checker, id, expr); } } - Expr::Attribute(ast::ExprAttribute { attr, value, .. }) => { + Expr::Attribute(attribute) => { // Ex) typing.List[...] if checker.any_enabled(&[ Rule::FutureRewritableTypeAnnotation, @@ -323,7 +323,7 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { if checker.enabled(Rule::CollectionsNamedTuple) { flake8_pyi::rules::collections_named_tuple(checker, expr); } - pandas_vet::rules::attr(checker, attr, value, expr); + pandas_vet::rules::attr(checker, attribute); } Expr::Call( call @ ast::ExprCall { diff --git a/crates/ruff/src/rules/pandas_vet/helpers.rs b/crates/ruff/src/rules/pandas_vet/helpers.rs index 295f160754..c0952f61af 100644 --- a/crates/ruff/src/rules/pandas_vet/helpers.rs +++ b/crates/ruff/src/rules/pandas_vet/helpers.rs @@ -30,8 +30,15 @@ pub(super) fn test_expression(expr: &Expr, semantic: &SemanticModel) -> Resoluti .resolve_name(name) .map_or(Resolution::IrrelevantBinding, |id| { match &semantic.binding(id).kind { + BindingKind::Argument => { + // Avoid, e.g., `self.values`. + if matches!(name.id.as_str(), "self" | "cls") { + Resolution::IrrelevantBinding + } else { + Resolution::RelevantLocal + } + } BindingKind::Annotation - | BindingKind::Argument | BindingKind::Assignment | BindingKind::NamedExprAssignment | BindingKind::UnpackedAssignment diff --git a/crates/ruff/src/rules/pandas_vet/mod.rs b/crates/ruff/src/rules/pandas_vet/mod.rs index b57f0836df..b2c2d150fe 100644 --- a/crates/ruff/src/rules/pandas_vet/mod.rs +++ b/crates/ruff/src/rules/pandas_vet/mod.rs @@ -209,6 +209,23 @@ mod tests { "#, "PD011_pass_values_call" )] + #[test_case( + r#" + import pandas as pd + x = pd.DataFrame() + x.values = 1 + "#, + "PD011_pass_values_store" + )] + #[test_case( + r#" + class Class: + def __init__(self, values: str) -> None: + self.values = values + print(self.values) + "#, + "PD011_pass_values_instance" + )] #[test_case( r#" import pandas as pd diff --git a/crates/ruff/src/rules/pandas_vet/rules/attr.rs b/crates/ruff/src/rules/pandas_vet/rules/attr.rs index de4de9de9e..05f3505db7 100644 --- a/crates/ruff/src/rules/pandas_vet/rules/attr.rs +++ b/crates/ruff/src/rules/pandas_vet/rules/attr.rs @@ -1,4 +1,4 @@ -use ruff_python_ast::{Expr, Ranged}; +use ruff_python_ast::{self as ast, Expr, ExprContext, Ranged}; use ruff_diagnostics::Violation; use ruff_diagnostics::{Diagnostic, DiagnosticKind}; @@ -44,8 +44,14 @@ impl Violation for PandasUseOfDotValues { } } -pub(crate) fn attr(checker: &mut Checker, attr: &str, value: &Expr, attr_expr: &Expr) { - let violation: DiagnosticKind = match attr { +pub(crate) fn attr(checker: &mut Checker, attribute: &ast::ExprAttribute) { + // Avoid, e.g., `x.values = y`. + if matches!(attribute.ctx, ExprContext::Store | ExprContext::Del) { + return; + } + + let violation: DiagnosticKind = match attribute.attr.as_str() { + // PD011 "values" if checker.settings.rules.enabled(Rule::PandasUseOfDotValues) => { PandasUseOfDotValues.into() } @@ -62,7 +68,7 @@ pub(crate) fn attr(checker: &mut Checker, attr: &str, value: &Expr, attr_expr: & // Avoid flagging on non-DataFrames (e.g., `{"a": 1}.values`), and on irrelevant bindings // (like imports). if !matches!( - test_expression(value, checker.semantic()), + test_expression(attribute.value.as_ref(), checker.semantic()), Resolution::RelevantLocal ) { return; @@ -70,5 +76,5 @@ pub(crate) fn attr(checker: &mut Checker, attr: &str, value: &Expr, attr_expr: & checker .diagnostics - .push(Diagnostic::new(violation, attr_expr.range())); + .push(Diagnostic::new(violation, attribute.range())); } diff --git a/crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_instance.snap b/crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_instance.snap new file mode 100644 index 0000000000..cee5b2f842 --- /dev/null +++ b/crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_instance.snap @@ -0,0 +1,4 @@ +--- +source: crates/ruff/src/rules/pandas_vet/mod.rs +--- + diff --git a/crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_store.snap b/crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_store.snap new file mode 100644 index 0000000000..cee5b2f842 --- /dev/null +++ b/crates/ruff/src/rules/pandas_vet/snapshots/ruff__rules__pandas_vet__tests__PD011_pass_values_store.snap @@ -0,0 +1,4 @@ +--- +source: crates/ruff/src/rules/pandas_vet/mod.rs +--- + From 036035bc502cd13dbb555385a3e6398f89b977a5 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 16 Aug 2023 21:02:30 -0400 Subject: [PATCH 155/155] Refactor literal-comparison and not-test rules (#6636) ## Summary No behavior changes, but these need some refactoring to support https://github.com/astral-sh/ruff/pull/6575 (namely, they need to take the `ast::ExprCompare` or similar node instead of the attribute fields), and I don't want to muddy that PR. ## Test Plan `cargo test` --- .../src/checkers/ast/analyze/expression.rs | 39 ++---- crates/ruff/src/rules/pycodestyle/helpers.rs | 2 +- .../pycodestyle/rules/literal_comparisons.rs | 116 +++++++++--------- .../src/rules/pycodestyle/rules/not_tests.rs | 91 +++++++------- 4 files changed, 113 insertions(+), 135 deletions(-) diff --git a/crates/ruff/src/checkers/ast/analyze/expression.rs b/crates/ruff/src/checkers/ast/analyze/expression.rs index 419094fcfb..3ab6021c1a 100644 --- a/crates/ruff/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff/src/checkers/ast/analyze/expression.rs @@ -1101,22 +1101,15 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { } } } - Expr::UnaryOp(ast::ExprUnaryOp { - op, - operand, - range: _, - }) => { - let check_not_in = checker.enabled(Rule::NotInTest); - let check_not_is = checker.enabled(Rule::NotIsTest); - if check_not_in || check_not_is { - pycodestyle::rules::not_tests( - checker, - expr, - *op, - operand, - check_not_in, - check_not_is, - ); + Expr::UnaryOp( + unary_op @ ast::ExprUnaryOp { + op, + operand, + range: _, + }, + ) => { + if checker.any_enabled(&[Rule::NotInTest, Rule::NotIsTest]) { + pycodestyle::rules::not_tests(checker, unary_op); } if checker.enabled(Rule::UnaryPrefixIncrementDecrement) { flake8_bugbear::rules::unary_prefix_increment_decrement( @@ -1141,18 +1134,8 @@ pub(crate) fn expression(expr: &Expr, checker: &mut Checker) { range: _, }, ) => { - let check_none_comparisons = checker.enabled(Rule::NoneComparison); - let check_true_false_comparisons = checker.enabled(Rule::TrueFalseComparison); - if check_none_comparisons || check_true_false_comparisons { - pycodestyle::rules::literal_comparisons( - checker, - expr, - left, - ops, - comparators, - check_none_comparisons, - check_true_false_comparisons, - ); + if checker.any_enabled(&[Rule::NoneComparison, Rule::TrueFalseComparison]) { + pycodestyle::rules::literal_comparisons(checker, compare); } if checker.enabled(Rule::IsLiteral) { pyflakes::rules::invalid_literal_comparison(checker, left, ops, comparators, expr); diff --git a/crates/ruff/src/rules/pycodestyle/helpers.rs b/crates/ruff/src/rules/pycodestyle/helpers.rs index eee48f336e..76a752b8f9 100644 --- a/crates/ruff/src/rules/pycodestyle/helpers.rs +++ b/crates/ruff/src/rules/pycodestyle/helpers.rs @@ -10,7 +10,7 @@ pub(super) fn is_ambiguous_name(name: &str) -> bool { name == "l" || name == "I" || name == "O" } -pub(super) fn compare( +pub(super) fn generate_comparison( left: &Expr, ops: &[CmpOp], comparators: &[Expr], diff --git a/crates/ruff/src/rules/pycodestyle/rules/literal_comparisons.rs b/crates/ruff/src/rules/pycodestyle/rules/literal_comparisons.rs index 1a75983d89..d16fa579f7 100644 --- a/crates/ruff/src/rules/pycodestyle/rules/literal_comparisons.rs +++ b/crates/ruff/src/rules/pycodestyle/rules/literal_comparisons.rs @@ -1,15 +1,15 @@ -use itertools::izip; -use ruff_python_ast::{self as ast, CmpOp, Constant, Expr, Ranged}; use rustc_hash::FxHashMap; use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_ast::helpers; use ruff_python_ast::helpers::is_const_none; +use ruff_python_ast::{self as ast, CmpOp, Constant, Expr, Ranged}; use crate::checkers::ast::Checker; +use crate::codes::Rule; use crate::registry::AsRule; -use crate::rules::pycodestyle::helpers::compare; +use crate::rules::pycodestyle::helpers::generate_comparison; #[derive(Debug, PartialEq, Eq, Copy, Clone)] enum EqCmpOp { @@ -130,15 +130,7 @@ impl AlwaysAutofixableViolation for TrueFalseComparison { } /// E711, E712 -pub(crate) fn literal_comparisons( - checker: &mut Checker, - expr: &Expr, - left: &Expr, - ops: &[CmpOp], - comparators: &[Expr], - check_none_comparisons: bool, - check_true_false_comparisons: bool, -) { +pub(crate) fn literal_comparisons(checker: &mut Checker, compare: &ast::ExprCompare) { // Mapping from (bad operator index) to (replacement operator). As we iterate // through the list of operators, we apply "dummy" fixes for each error, // then replace the entire expression at the end with one "real" fix, to @@ -146,15 +138,18 @@ pub(crate) fn literal_comparisons( let mut bad_ops: FxHashMap = FxHashMap::default(); let mut diagnostics: Vec = vec![]; - let op = ops.first().unwrap(); - // Check `left`. - let mut comparator = left; - let next = &comparators[0]; + let mut comparator = compare.left.as_ref(); + let [op, ..] = compare.ops.as_slice() else { + return; + }; + let [next, ..] = compare.comparators.as_slice() else { + return; + }; if !helpers::is_constant_non_singleton(next) { if let Some(op) = EqCmpOp::try_from(*op) { - if check_none_comparisons && is_const_none(comparator) { + if checker.enabled(Rule::NoneComparison) && is_const_none(comparator) { match op { EqCmpOp::Eq => { let diagnostic = Diagnostic::new(NoneComparison(op), comparator.range()); @@ -173,7 +168,7 @@ pub(crate) fn literal_comparisons( } } - if check_true_false_comparisons { + if checker.enabled(Rule::TrueFalseComparison) { if let Expr::Constant(ast::ExprConstant { value: Constant::Bool(value), kind: None, @@ -208,59 +203,66 @@ pub(crate) fn literal_comparisons( } // Check each comparator in order. - for (idx, (op, next)) in izip!(ops, comparators).enumerate() { + for (index, (op, next)) in compare + .ops + .iter() + .zip(compare.comparators.iter()) + .enumerate() + { if helpers::is_constant_non_singleton(comparator) { comparator = next; continue; } - if let Some(op) = EqCmpOp::try_from(*op) { - if check_none_comparisons && is_const_none(next) { + let Some(op) = EqCmpOp::try_from(*op) else { + continue; + }; + + if checker.enabled(Rule::NoneComparison) && is_const_none(next) { + match op { + EqCmpOp::Eq => { + let diagnostic = Diagnostic::new(NoneComparison(op), next.range()); + if checker.patch(diagnostic.kind.rule()) { + bad_ops.insert(index, CmpOp::Is); + } + diagnostics.push(diagnostic); + } + EqCmpOp::NotEq => { + let diagnostic = Diagnostic::new(NoneComparison(op), next.range()); + if checker.patch(diagnostic.kind.rule()) { + bad_ops.insert(index, CmpOp::IsNot); + } + diagnostics.push(diagnostic); + } + } + } + + if checker.enabled(Rule::TrueFalseComparison) { + if let Expr::Constant(ast::ExprConstant { + value: Constant::Bool(value), + kind: None, + range: _, + }) = next + { match op { EqCmpOp::Eq => { - let diagnostic = Diagnostic::new(NoneComparison(op), next.range()); + let diagnostic = + Diagnostic::new(TrueFalseComparison(*value, op), next.range()); if checker.patch(diagnostic.kind.rule()) { - bad_ops.insert(idx, CmpOp::Is); + bad_ops.insert(index, CmpOp::Is); } diagnostics.push(diagnostic); } EqCmpOp::NotEq => { - let diagnostic = Diagnostic::new(NoneComparison(op), next.range()); + let diagnostic = + Diagnostic::new(TrueFalseComparison(*value, op), next.range()); if checker.patch(diagnostic.kind.rule()) { - bad_ops.insert(idx, CmpOp::IsNot); + bad_ops.insert(index, CmpOp::IsNot); } diagnostics.push(diagnostic); } } } - - if check_true_false_comparisons { - if let Expr::Constant(ast::ExprConstant { - value: Constant::Bool(value), - kind: None, - range: _, - }) = next - { - match op { - EqCmpOp::Eq => { - let diagnostic = - Diagnostic::new(TrueFalseComparison(*value, op), next.range()); - if checker.patch(diagnostic.kind.rule()) { - bad_ops.insert(idx, CmpOp::Is); - } - diagnostics.push(diagnostic); - } - EqCmpOp::NotEq => { - let diagnostic = - Diagnostic::new(TrueFalseComparison(*value, op), next.range()); - if checker.patch(diagnostic.kind.rule()) { - bad_ops.insert(idx, CmpOp::IsNot); - } - diagnostics.push(diagnostic); - } - } - } - } } comparator = next; @@ -270,17 +272,19 @@ pub(crate) fn literal_comparisons( // `noqa`, but another doesn't, both will be removed here. if !bad_ops.is_empty() { // Replace the entire comparison expression. - let ops = ops + let ops = compare + .ops .iter() .enumerate() .map(|(idx, op)| bad_ops.get(&idx).unwrap_or(op)) .copied() .collect::>(); - let content = compare(left, &ops, comparators, checker.locator()); + let content = + generate_comparison(&compare.left, &ops, &compare.comparators, checker.locator()); for diagnostic in &mut diagnostics { diagnostic.set_fix(Fix::suggested(Edit::range_replacement( content.to_string(), - expr.range(), + compare.range(), ))); } } diff --git a/crates/ruff/src/rules/pycodestyle/rules/not_tests.rs b/crates/ruff/src/rules/pycodestyle/rules/not_tests.rs index e77c1ebfa1..0ee126d046 100644 --- a/crates/ruff/src/rules/pycodestyle/rules/not_tests.rs +++ b/crates/ruff/src/rules/pycodestyle/rules/not_tests.rs @@ -1,11 +1,10 @@ -use ruff_python_ast::{self as ast, CmpOp, Expr, Ranged, UnaryOp}; - use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; +use ruff_python_ast::{self as ast, CmpOp, Expr, Ranged}; use crate::checkers::ast::Checker; -use crate::registry::AsRule; -use crate::rules::pycodestyle::helpers::compare; +use crate::registry::{AsRule, Rule}; +use crate::rules::pycodestyle::helpers::generate_comparison; /// ## What it does /// Checks for negative comparison using `not {foo} in {bar}`. @@ -74,54 +73,46 @@ impl AlwaysAutofixableViolation for NotIsTest { } /// E713, E714 -pub(crate) fn not_tests( - checker: &mut Checker, - expr: &Expr, - op: UnaryOp, - operand: &Expr, - check_not_in: bool, - check_not_is: bool, -) { - if matches!(op, UnaryOp::Not) { - if let Expr::Compare(ast::ExprCompare { - left, - ops, - comparators, - range: _, - }) = operand - { - if !matches!(&ops[..], [CmpOp::In | CmpOp::Is]) { - return; - } - for op in ops { - match op { - CmpOp::In => { - if check_not_in { - let mut diagnostic = Diagnostic::new(NotInTest, operand.range()); - if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( - compare(left, &[CmpOp::NotIn], comparators, checker.locator()), - expr.range(), - ))); - } - checker.diagnostics.push(diagnostic); - } - } - CmpOp::Is => { - if check_not_is { - let mut diagnostic = Diagnostic::new(NotIsTest, operand.range()); - if checker.patch(diagnostic.kind.rule()) { - diagnostic.set_fix(Fix::automatic(Edit::range_replacement( - compare(left, &[CmpOp::IsNot], comparators, checker.locator()), - expr.range(), - ))); - } - checker.diagnostics.push(diagnostic); - } - } - _ => {} +pub(crate) fn not_tests(checker: &mut Checker, unary_op: &ast::ExprUnaryOp) { + if !unary_op.op.is_not() { + return; + } + + let Expr::Compare(ast::ExprCompare { + left, + ops, + comparators, + range: _, + }) = unary_op.operand.as_ref() + else { + return; + }; + + match ops.as_slice() { + [CmpOp::In] => { + if checker.enabled(Rule::NotInTest) { + let mut diagnostic = Diagnostic::new(NotInTest, unary_op.operand.range()); + if checker.patch(diagnostic.kind.rule()) { + diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + generate_comparison(left, &[CmpOp::NotIn], comparators, checker.locator()), + unary_op.range(), + ))); } + checker.diagnostics.push(diagnostic); } } + [CmpOp::Is] => { + if checker.enabled(Rule::NotIsTest) { + let mut diagnostic = Diagnostic::new(NotIsTest, unary_op.operand.range()); + if checker.patch(diagnostic.kind.rule()) { + diagnostic.set_fix(Fix::automatic(Edit::range_replacement( + generate_comparison(left, &[CmpOp::IsNot], comparators, checker.locator()), + unary_op.range(), + ))); + } + checker.diagnostics.push(diagnostic); + } + } + _ => {} } }