diff options
Diffstat (limited to 'sphinx/pycode/parser.py')
-rw-r--r-- | sphinx/pycode/parser.py | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/sphinx/pycode/parser.py b/sphinx/pycode/parser.py index 8f6615b54..f943b7985 100644 --- a/sphinx/pycode/parser.py +++ b/sphinx/pycode/parser.py @@ -12,6 +12,7 @@ import ast import inspect import itertools import re +import sys import tokenize from token import NAME, NEWLINE, INDENT, DEDENT, NUMBER, OP, STRING from tokenize import COMMENT, NL @@ -27,6 +28,21 @@ indent_re = re.compile(u'^\\s*$') emptyline_re = re.compile(u'^\\s*(#.*)?$') +if sys.version_info >= (3, 6): + ASSIGN_NODES = (ast.Assign, ast.AnnAssign) +else: + ASSIGN_NODES = (ast.Assign) + + +def get_assign_targets(node): + # type: (ast.AST) -> List[ast.expr] + """Get list of targets from Assign and AnnAssign node.""" + if isinstance(node, ast.Assign): + return node.targets + else: + return [node.target] # type: ignore + + def get_lvar_names(node, self=None): # type: (ast.AST, ast.expr) -> List[unicode] """Convert assignment-AST to variable names. @@ -285,7 +301,8 @@ class VariableCommentPicker(ast.NodeVisitor): # type: (ast.Assign) -> None """Handles Assign node and pick up a variable comment.""" try: - varnames = sum([get_lvar_names(t, self=self.get_self()) for t in node.targets], []) + targets = get_assign_targets(node) + varnames = sum([get_lvar_names(t, self=self.get_self()) for t in targets], []) current_line = self.get_line(node.lineno) except TypeError: return # this assignment is not new definition! @@ -321,12 +338,18 @@ class VariableCommentPicker(ast.NodeVisitor): for varname in varnames: self.add_entry(varname) + def visit_AnnAssign(self, node): + # type: (ast.AST) -> None + """Handles AnnAssign node and pick up a variable comment.""" + self.visit_Assign(node) # type: ignore + def visit_Expr(self, node): # type: (ast.Expr) -> None """Handles Expr node and pick up a comment if string.""" - if (isinstance(self.previous, ast.Assign) and isinstance(node.value, ast.Str)): + if (isinstance(self.previous, ASSIGN_NODES) and isinstance(node.value, ast.Str)): try: - varnames = get_lvar_names(self.previous.targets[0], self.get_self()) + targets = get_assign_targets(self.previous) + varnames = get_lvar_names(targets[0], self.get_self()) for varname in varnames: if isinstance(node.value.s, text_type): docstring = node.value.s |