# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Tuple
from libcst._add_slots import add_slots
from libcst._nodes.base import BaseLeaf, CSTNode, CSTValidationError
from libcst._nodes.internal import CodegenState, visit_required
from libcst._nodes.whitespace import BaseParenthesizableWhitespace, SimpleWhitespace
from libcst._visitors import CSTVisitorT
class _BaseOneTokenOp(CSTNode, ABC):
"""
Any node that has a static value and needs to own whitespace on both sides.
"""
__slots__ = ()
whitespace_before: BaseParenthesizableWhitespace
whitespace_after: BaseParenthesizableWhitespace
def _visit_and_replace_children(self, visitor: CSTVisitorT) -> "_BaseOneTokenOp":
# pyre-ignore Pyre thinks that self.__class__ is CSTNode, not _BaseOneTokenOp
return self.__class__(
whitespace_before=visit_required(
self, "whitespace_before", self.whitespace_before, visitor
),
whitespace_after=visit_required(
self, "whitespace_after", self.whitespace_after, visitor
),
)
def _codegen_impl(self, state: CodegenState) -> None:
self.whitespace_before._codegen(state)
with state.record_syntactic_position(self):
state.add_token(self._get_token())
self.whitespace_after._codegen(state)
@abstractmethod
def _get_token(self) -> str: ...
class _BaseTwoTokenOp(CSTNode, ABC):
"""
Any node that ends up as two tokens, so we must preserve the whitespace
in beteween them.
"""
__slots__ = ()
whitespace_before: BaseParenthesizableWhitespace
whitespace_between: BaseParenthesizableWhitespace
whitespace_after: BaseParenthesizableWhitespace
def _validate(self) -> None:
if self.whitespace_between.empty:
raise CSTValidationError("Must have at least one space between not and in.")
def _visit_and_replace_children(self, visitor: CSTVisitorT) -> "_BaseTwoTokenOp":
# pyre-ignore Pyre thinks that self.__class__ is CSTNode, not _BaseTwoTokenOp
return self.__class__(
whitespace_before=visit_required(
self, "whitespace_before", self.whitespace_before, visitor
),
whitespace_between=visit_required(
self, "whitespace_between", self.whitespace_between, visitor
),
whitespace_after=visit_required(
self, "whitespace_after", self.whitespace_after, visitor
),
)
def _codegen_impl(self, state: CodegenState) -> None:
self.whitespace_before._codegen(state)
with state.record_syntactic_position(self):
state.add_token(self._get_tokens()[0])
self.whitespace_between._codegen(state)
state.add_token(self._get_tokens()[1])
self.whitespace_after._codegen(state)
@abstractmethod
def _get_tokens(self) -> Tuple[str, str]: ...
class BaseUnaryOp(CSTNode, ABC):
"""
Any node that has a static value used in a :class:`UnaryOperation` expression.
"""
__slots__ = ()
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace
def _visit_and_replace_children(self, visitor: CSTVisitorT) -> "BaseUnaryOp":
# pyre-ignore Pyre thinks that self.__class__ is CSTNode, not BaseUnaryOp
return self.__class__(
whitespace_after=visit_required(
self, "whitespace_after", self.whitespace_after, visitor
)
)
def _codegen_impl(self, state: CodegenState) -> None:
state.add_token(self._get_token())
self.whitespace_after._codegen(state)
@abstractmethod
def _get_token(self) -> str: ...
class BaseBooleanOp(_BaseOneTokenOp, ABC):
"""
Any node that has a static value used in a :class:`BooleanOperation` expression.
This node is purely for typing.
"""
__slots__ = ()
class BaseBinaryOp(CSTNode, ABC):
"""
Any node that has a static value used in a :class:`BinaryOperation` expression.
This node is purely for typing.
"""
__slots__ = ()
class BaseCompOp(CSTNode, ABC):
"""
Any node that has a static value used in a :class:`Comparison` expression.
This node is purely for typing.
"""
__slots__ = ()
class BaseAugOp(CSTNode, ABC):
"""
Any node that has a static value used in an :class:`AugAssign` assignment.
This node is purely for typing.
"""
__slots__ = ()
[docs]
@add_slots
@dataclass(frozen=True)
class Semicolon(_BaseOneTokenOp):
"""
Used by any small statement (any subclass of :class:`BaseSmallStatement`
such as :class:`Pass`) as a separator between subsequent nodes contained
within a :class:`SimpleStatementLine` or :class:`SimpleStatementSuite`.
"""
#: Any space that appears directly before this semicolon.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
#: Any space that appears directly after this semicolon.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
def _get_token(self) -> str:
return ";"
[docs]
@add_slots
@dataclass(frozen=True)
class Colon(_BaseOneTokenOp):
"""
Used by :class:`Slice` as a separator between subsequent expressions,
and in :class:`Lambda` to separate arguments and body.
"""
#: Any space that appears directly before this colon.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
#: Any space that appears directly after this colon.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
def _get_token(self) -> str:
return ":"
[docs]
@add_slots
@dataclass(frozen=True)
class Comma(_BaseOneTokenOp):
"""
Syntactic trivia used as a separator between subsequent items in various
parts of the grammar.
Some use-cases are:
* :class:`Import` or :class:`ImportFrom`.
* :class:`FunctionDef` arguments.
* :class:`Tuple`/:class:`List`/:class:`Set`/:class:`Dict` elements.
"""
#: Any space that appears directly before this comma.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
#: Any space that appears directly after this comma.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
def _get_token(self) -> str:
return ","
[docs]
@add_slots
@dataclass(frozen=True)
class Dot(_BaseOneTokenOp):
"""
Used by :class:`Attribute` as a separator between subsequent :class:`Name` nodes.
"""
#: Any space that appears directly before this dot.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
#: Any space that appears directly after this dot.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
def _get_token(self) -> str:
return "."
[docs]
@add_slots
@dataclass(frozen=True)
class ImportStar(BaseLeaf):
"""
Used by :class:`ImportFrom` to denote a star import instead of a list
of importable objects.
"""
def _codegen_impl(self, state: CodegenState) -> None:
state.add_token("*")
[docs]
@add_slots
@dataclass(frozen=True)
class AssignEqual(_BaseOneTokenOp):
"""
Used by :class:`AnnAssign` to denote a single equal character when doing an
assignment on top of a type annotation. Also used by :class:`Param` and
:class:`Arg` to denote assignment of a default value, and by
:class:`FormattedStringExpression` to denote usage of self-documenting
expressions.
"""
#: Any space that appears directly before this equal sign.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this equal sign.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "="
[docs]
@add_slots
@dataclass(frozen=True)
class Plus(BaseUnaryOp):
"""
A unary operator that can be used in a :class:`UnaryOperation`
expression.
"""
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
def _get_token(self) -> str:
return "+"
@add_slots
@dataclass(frozen=True)
class Minus(BaseUnaryOp):
"""
A unary operator that can be used in a :class:`UnaryOperation`
expression.
"""
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
def _get_token(self) -> str:
return "-"
@add_slots
@dataclass(frozen=True)
class BitInvert(BaseUnaryOp):
"""
A unary operator that can be used in a :class:`UnaryOperation`
expression.
"""
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field("")
def _get_token(self) -> str:
return "~"
@add_slots
@dataclass(frozen=True)
class Not(BaseUnaryOp):
"""
A unary operator that can be used in a :class:`UnaryOperation`
expression.
"""
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "not"
@add_slots
@dataclass(frozen=True)
class And(BaseBooleanOp):
"""
A boolean operator that can be used in a :class:`BooleanOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "and"
[docs]
@add_slots
@dataclass(frozen=True)
class Or(BaseBooleanOp):
"""
A boolean operator that can be used in a :class:`BooleanOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "or"
@add_slots
@dataclass(frozen=True)
class Add(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "+"
[docs]
@add_slots
@dataclass(frozen=True)
class Subtract(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "-"
@add_slots
@dataclass(frozen=True)
class Multiply(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "*"
@add_slots
@dataclass(frozen=True)
class Divide(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "/"
@add_slots
@dataclass(frozen=True)
class FloorDivide(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "//"
@add_slots
@dataclass(frozen=True)
class Modulo(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "%"
@add_slots
@dataclass(frozen=True)
class Power(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "**"
@add_slots
@dataclass(frozen=True)
class LeftShift(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "<<"
@add_slots
@dataclass(frozen=True)
class RightShift(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return ">>"
@add_slots
@dataclass(frozen=True)
class BitOr(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "|"
@add_slots
@dataclass(frozen=True)
class BitAnd(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "&"
@add_slots
@dataclass(frozen=True)
class BitXor(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "^"
@add_slots
@dataclass(frozen=True)
class MatrixMultiply(BaseBinaryOp, _BaseOneTokenOp):
"""
A binary operator that can be used in a :class:`BinaryOperation`
expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "@"
@add_slots
@dataclass(frozen=True)
class LessThan(BaseCompOp, _BaseOneTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "<"
@add_slots
@dataclass(frozen=True)
class GreaterThan(BaseCompOp, _BaseOneTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return ">"
@add_slots
@dataclass(frozen=True)
class Equal(BaseCompOp, _BaseOneTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "=="
[docs]
@add_slots
@dataclass(frozen=True)
class LessThanEqual(BaseCompOp, _BaseOneTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "<="
@add_slots
@dataclass(frozen=True)
class GreaterThanEqual(BaseCompOp, _BaseOneTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return ">="
[docs]
@add_slots
@dataclass(frozen=True)
class NotEqual(BaseCompOp, _BaseOneTokenOp):
"""
A comparison operator that can be used in a :class:`Comparison` expression.
This node defines a static value for convenience, but in reality due to
PEP 401 it can be one of two values, both of which should be a
:class:`NotEqual` :class:`Comparison` operator.
"""
#: The actual text value of this operator. Can be either ``!=`` or ``<>``.
value: str = "!="
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _validate(self) -> None:
if self.value not in ["!=", "<>"]:
raise CSTValidationError("Invalid value for NotEqual node.")
def _visit_and_replace_children(self, visitor: CSTVisitorT) -> "NotEqual":
return self.__class__(
whitespace_before=visit_required(
self, "whitespace_before", self.whitespace_before, visitor
),
value=self.value,
whitespace_after=visit_required(
self, "whitespace_after", self.whitespace_after, visitor
),
)
def _get_token(self) -> str:
return self.value
@add_slots
@dataclass(frozen=True)
class In(BaseCompOp, _BaseOneTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "in"
[docs]
@add_slots
@dataclass(frozen=True)
class NotIn(BaseCompOp, _BaseTwoTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
This operator spans two tokens that must be separated by at least one space,
so there is a third whitespace attribute to represent this.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears between the ``not`` and ``in`` tokens.
whitespace_between: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_tokens(self) -> Tuple[str, str]:
return ("not", "in")
@add_slots
@dataclass(frozen=True)
class Is(BaseCompOp, _BaseOneTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "is"
@add_slots
@dataclass(frozen=True)
class IsNot(BaseCompOp, _BaseTwoTokenOp):
"""
A comparision operator that can be used in a :class:`Comparison` expression.
This operator spans two tokens that must be separated by at least one space,
so there is a third whitespace attribute to represent this.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears between the ``is`` and ``not`` tokens.
whitespace_between: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_tokens(self) -> Tuple[str, str]:
return ("is", "not")
@add_slots
@dataclass(frozen=True)
class AddAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "+="
[docs]
@add_slots
@dataclass(frozen=True)
class SubtractAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "-="
@add_slots
@dataclass(frozen=True)
class MultiplyAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "*="
@add_slots
@dataclass(frozen=True)
class MatrixMultiplyAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "@="
@add_slots
@dataclass(frozen=True)
class DivideAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "/="
@add_slots
@dataclass(frozen=True)
class ModuloAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "%="
@add_slots
@dataclass(frozen=True)
class BitAndAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "&="
@add_slots
@dataclass(frozen=True)
class BitOrAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "|="
@add_slots
@dataclass(frozen=True)
class BitXorAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "^="
@add_slots
@dataclass(frozen=True)
class LeftShiftAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "<<="
@add_slots
@dataclass(frozen=True)
class RightShiftAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return ">>="
@add_slots
@dataclass(frozen=True)
class PowerAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "**="
@add_slots
@dataclass(frozen=True)
class FloorDivideAssign(BaseAugOp, _BaseOneTokenOp):
"""
An augmented assignment operator that can be used in a :class:`AugAssign`
statement.
"""
#: Any space that appears directly before this operator.
whitespace_before: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
#: Any space that appears directly after this operator.
whitespace_after: BaseParenthesizableWhitespace = SimpleWhitespace.field(" ")
def _get_token(self) -> str:
return "//="