diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-03-14 13:51:49 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-03-14 13:51:49 +0900 |
commit | f6d58bbefc4f57710d6b2875bdd6b1f0533d1f39 (patch) | |
tree | 61a553241898a73a114cd1dcca5682ee1aa6b350 /sphinx/pycode/ast.py | |
parent | f85b870ad59f39c8637160a4cd4d865ce1e1628e (diff) | |
download | sphinx-git-f6d58bbefc4f57710d6b2875bdd6b1f0533d1f39.tar.gz |
Fix #7304: pycode: Support operators (BinOp, BoolOp and UnaryOp)
Diffstat (limited to 'sphinx/pycode/ast.py')
-rw-r--r-- | sphinx/pycode/ast.py | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/sphinx/pycode/ast.py b/sphinx/pycode/ast.py index 52617e3bc..4d8aa8955 100644 --- a/sphinx/pycode/ast.py +++ b/sphinx/pycode/ast.py @@ -9,7 +9,7 @@ """ import sys -from typing import List +from typing import Dict, List, Type if sys.version_info > (3, 8): import ast @@ -21,6 +21,29 @@ else: import ast # type: ignore +OPERATORS = { + ast.Add: "+", + ast.And: "and", + ast.BitAnd: "&", + ast.BitOr: "|", + ast.BitXor: "^", + ast.Div: "/", + ast.FloorDiv: "//", + ast.Invert: "~", + ast.LShift: "<<", + ast.MatMult: "@", + ast.Mult: "*", + ast.Mod: "%", + ast.Not: "not", + ast.Pow: "**", + ast.Or: "or", + ast.RShift: ">>", + ast.Sub: "-", + ast.UAdd: "+", + ast.USub: "-", +} # type: Dict[Type[ast.AST], str] + + def parse(code: str, mode: str = 'exec') -> "ast.AST": """Parse the *code* using built-in ast or typed_ast. @@ -41,6 +64,8 @@ def unparse(node: ast.AST) -> str: return None elif isinstance(node, str): return node + elif node.__class__ in OPERATORS: + return OPERATORS[node.__class__] elif isinstance(node, ast.arg): if node.annotation: return "%s: %s" % (node.arg, unparse(node.annotation)) @@ -50,6 +75,11 @@ def unparse(node: ast.AST) -> str: return unparse_arguments(node) elif isinstance(node, ast.Attribute): return "%s.%s" % (unparse(node.value), node.attr) + elif isinstance(node, ast.BinOp): + return " ".join(unparse(e) for e in [node.left, node.op, node.right]) + elif isinstance(node, ast.BoolOp): + op = " %s " % unparse(node.op) + return op.join(unparse(e) for e in node.values) elif isinstance(node, ast.Bytes): return repr(node.s) elif isinstance(node, ast.Call): @@ -81,6 +111,8 @@ def unparse(node: ast.AST) -> str: return repr(node.s) elif isinstance(node, ast.Subscript): return "%s[%s]" % (unparse(node.value), unparse(node.slice)) + elif isinstance(node, ast.UnaryOp): + return "%s %s" % (unparse(node.op), unparse(node.operand)) elif isinstance(node, ast.Tuple): return ", ".join(unparse(e) for e in node.elts) elif sys.version_info > (3, 6) and isinstance(node, ast.Constant): |