diff --git a/sphinx/pycode/ast.py b/sphinx/pycode/ast.py index 3fe0a7fcb..e6f1d2b35 100644 --- a/sphinx/pycode/ast.py +++ b/sphinx/pycode/ast.py @@ -81,81 +81,6 @@ class _UnparseVisitor(ast.NodeVisitor): else: return node.arg - def visit_Attribute(self, node: ast.Attribute) -> str: - return "%s.%s" % (self.visit(node.value), node.attr) - - def visit_BinOp(self, node: ast.BinOp) -> str: - return " ".join(self.visit(e) for e in [node.left, node.op, node.right]) - - def visit_BoolOp(self, node: ast.BoolOp) -> str: - op = " %s " % self.visit(node.op) - return op.join(self.visit(e) for e in node.values) - - def visit_Call(self, node: ast.Call) -> str: - args = ([self.visit(e) for e in node.args] + - ["%s=%s" % (k.arg, self.visit(k.value)) for k in node.keywords]) - return "%s(%s)" % (self.visit(node.func), ", ".join(args)) - - def visit_Dict(self, node: ast.Dict) -> str: - keys = (self.visit(k) for k in node.keys) - values = (self.visit(v) for v in node.values) - items = (k + ": " + v for k, v in zip(keys, values)) - return "{" + ", ".join(items) + "}" - - def visit_Index(self, node: ast.Index) -> str: - return self.visit(node.value) - - def visit_Lambda(self, node: ast.Lambda) -> str: - return "lambda %s: ..." % self.visit(node.args) - - def visit_List(self, node: ast.List) -> str: - return "[" + ", ".join(self.visit(e) for e in node.elts) + "]" - - def visit_Name(self, node: ast.Name) -> str: - return node.id - - if sys.version_info < (3, 8): - # these ast nodes were deprecated in python 3.8 - def visit_Num(self, node: ast.Num) -> str: - return repr(node.n) - - def visit_Str(self, node: ast.Str) -> str: - return repr(node.s) - - def visit_Bytes(self, node: ast.Bytes) -> str: - return repr(node.s) - - def visit_NameConstant(self, node: ast.NameConstant) -> str: - return repr(node.value) - - def visit_Ellipsis(self, node: ast.Ellipsis) -> str: - return "..." - - def visit_Set(self, node: ast.Set) -> str: - return "{" + ", ".join(self.visit(e) for e in node.elts) + "}" - - def visit_Subscript(self, node: ast.Subscript) -> str: - return "%s[%s]" % (self.visit(node.value), self.visit(node.slice)) - - def visit_UnaryOp(self, node: ast.UnaryOp) -> str: - return "%s %s" % (self.visit(node.op), self.visit(node.operand)) - - def visit_Tuple(self, node: ast.Tuple) -> str: - if node.elts: - return ", ".join(self.visit(e) for e in node.elts) - else: - return "()" - - if sys.version_info >= (3, 6): - def visit_Constant(self, node: ast.Constant) -> str: - if node.value is Ellipsis: - return "..." - else: - return repr(node.value) - - def generic_visit(self, node): - raise NotImplementedError('Unable to parse %s object' % type(node).__name__) - def _visit_arg_with_default(self, arg: ast.arg, default: Optional[ast.AST]) -> str: """Unparse a single argument to a string.""" name = self.visit(arg) @@ -203,3 +128,78 @@ class _UnparseVisitor(ast.NodeVisitor): args.append("**" + self.visit(node.kwarg)) return ", ".join(args) + + def visit_Attribute(self, node: ast.Attribute) -> str: + return "%s.%s" % (self.visit(node.value), node.attr) + + def visit_BinOp(self, node: ast.BinOp) -> str: + return " ".join(self.visit(e) for e in [node.left, node.op, node.right]) + + def visit_BoolOp(self, node: ast.BoolOp) -> str: + op = " %s " % self.visit(node.op) + return op.join(self.visit(e) for e in node.values) + + def visit_Call(self, node: ast.Call) -> str: + args = ([self.visit(e) for e in node.args] + + ["%s=%s" % (k.arg, self.visit(k.value)) for k in node.keywords]) + return "%s(%s)" % (self.visit(node.func), ", ".join(args)) + + def visit_Dict(self, node: ast.Dict) -> str: + keys = (self.visit(k) for k in node.keys) + values = (self.visit(v) for v in node.values) + items = (k + ": " + v for k, v in zip(keys, values)) + return "{" + ", ".join(items) + "}" + + def visit_Index(self, node: ast.Index) -> str: + return self.visit(node.value) + + def visit_Lambda(self, node: ast.Lambda) -> str: + return "lambda %s: ..." % self.visit(node.args) + + def visit_List(self, node: ast.List) -> str: + return "[" + ", ".join(self.visit(e) for e in node.elts) + "]" + + def visit_Name(self, node: ast.Name) -> str: + return node.id + + def visit_Set(self, node: ast.Set) -> str: + return "{" + ", ".join(self.visit(e) for e in node.elts) + "}" + + def visit_Subscript(self, node: ast.Subscript) -> str: + return "%s[%s]" % (self.visit(node.value), self.visit(node.slice)) + + def visit_UnaryOp(self, node: ast.UnaryOp) -> str: + return "%s %s" % (self.visit(node.op), self.visit(node.operand)) + + def visit_Tuple(self, node: ast.Tuple) -> str: + if node.elts: + return ", ".join(self.visit(e) for e in node.elts) + else: + return "()" + + if sys.version_info >= (3, 6): + def visit_Constant(self, node: ast.Constant) -> str: + if node.value is Ellipsis: + return "..." + else: + return repr(node.value) + + if sys.version_info < (3, 8): + # these ast nodes were deprecated in python 3.8 + def visit_Bytes(self, node: ast.Bytes) -> str: + return repr(node.s) + + def visit_Ellipsis(self, node: ast.Ellipsis) -> str: + return "..." + + def visit_NameConstant(self, node: ast.NameConstant) -> str: + return repr(node.value) + + def visit_Num(self, node: ast.Num) -> str: + return repr(node.n) + + def visit_Str(self, node: ast.Str) -> str: + return repr(node.s) + + def generic_visit(self, node): + raise NotImplementedError('Unable to parse %s object' % type(node).__name__)