Skip to content

Commit

Permalink
[parsing 3.3] Matrix multiply (PEP 465)
Browse files Browse the repository at this point in the history
  • Loading branch information
thatch committed Mar 12, 2020
1 parent 2a3703e commit 9d0a2be
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 1 deletion.
73 changes: 73 additions & 0 deletions libcst/_nodes/tests/test_matrix_multiply.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

# pyre-strict
from typing import Any

import libcst as cst
from libcst._nodes.tests.base import (
CSTNodeTest,
parse_expression_as,
parse_statement_as,
)
from libcst.testing.utils import data_provider


class NamedExprTest(CSTNodeTest):
@data_provider(
(
{
"node": cst.BinaryOperation(
left=cst.Name("a"),
operator=cst.MatrixMultiply(),
right=cst.Name("b"),
),
"code": "a @ b",
"parser": parse_expression_as(python_version="3.8"),
},
{
"node": cst.SimpleStatementLine(
body=(
cst.AugAssign(
target=cst.Name("a"),
operator=cst.MatrixMultiplyAssign(),
value=cst.Name("b"),
),
),
),
"code": "a @= b\n",
"parser": parse_statement_as(python_version="3.8"),
},
)
)
def test_valid(self, **kwargs: Any) -> None:
self.validate_node(**kwargs)

@data_provider(
(
{
"code": "a @ b",
"parser": parse_expression_as(python_version="3.6"),
"expect_success": True,
},
{
"code": "a @ b",
"parser": parse_expression_as(python_version="3.3"),
"expect_success": False,
},
{
"code": "a @= b",
"parser": parse_statement_as(python_version="3.6"),
"expect_success": True,
},
{
"code": "a @= b",
"parser": parse_statement_as(python_version="3.3"),
"expect_success": False,
},
)
)
def test_versions(self, code, parser, expect_success) -> None:
self.assert_parses(code, parser, expect_success)
3 changes: 2 additions & 1 deletion libcst/_parser/conversions/expression.py
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,8 @@ def convert_star_expr(
@with_production("and_expr", "shift_expr ('&' shift_expr)*")
@with_production("shift_expr", "arith_expr (('<<'|'>>') arith_expr)*")
@with_production("arith_expr", "term (('+'|'-') term)*")
@with_production("term", "factor (('*'|'@'|'/'|'%'|'//') factor)*")
@with_production("term", "factor (('*'|'@'|'/'|'%'|'//') factor)*", version=">=3.5")
@with_production("term", "factor (('*'|'/'|'%'|'//') factor)*", version="<3.5")
def convert_binop(
config: ParserConfig, children: typing.Sequence[typing.Any]
) -> typing.Any:
Expand Down
9 changes: 9 additions & 0 deletions libcst/_parser/conversions/statement.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,15 @@ def convert_annassign(config: ParserConfig, children: Sequence[Any]) -> Any:
"('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | "
+ "'>>=' | '**=' | '//=') (yield_expr | testlist)"
),
version=">=3.5",
)
@with_production(
"augassign",
(
"('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | "
+ "'>>=' | '**=' | '//=') (yield_expr | testlist)"
),
version="<3.5",
)
def convert_augassign(config: ParserConfig, children: Sequence[Any]) -> Any:
op, expr = children
Expand Down

0 comments on commit 9d0a2be

Please sign in to comment.