From b73aa1fd61909bcec4a34867173b997acf91b12e Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 6 Jun 2017 14:03:23 +0200 Subject: [PATCH] Add normalizer issues 711-714. --- parso/python/normalizer.py | 26 ++++++++- test/normalizer_issue_files/E71.py | 93 ++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 test/normalizer_issue_files/E71.py diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 729ac1e..b5fd907 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -119,7 +119,7 @@ class PEP8Normalizer(Normalizer): self.add_issue(743, message % 'function', leaf) else: self.add_issuadd_issue(741, message % 'variables', leaf) - elif leaf.value == ':': + if leaf.value == ':': from parso.python.tree import Flow, Scope if isinstance(leaf.parent, (Flow, Scope)) and leaf.parent.type != 'lambdef': next_leaf = leaf.get_next_leaf() @@ -128,11 +128,33 @@ class PEP8Normalizer(Normalizer): self.add_issue(704, 'Multiple statements on one line (def)', next_leaf) else: self.add_issue(701, 'Multiple statements on one line (colon)', next_leaf) - elif leaf.value == ';': + if leaf.value == ';': if leaf.get_next_leaf().type in ('newline', 'endmarker'): self.add_issue(703, 'Statement ends with a semicolon', leaf) else: self.add_issue(702, 'Multiple statements on one line (semicolon)', leaf) + if leaf.value in ('==', '!='): + comparison = leaf.parent + index = comparison.children.index(leaf) + left = comparison.children[index - 1] + right = comparison.children[index + 1] + for node in left, right: + if node.type == 'keyword' or node.type == 'name': + if node.value == 'None': + message = "comparison to None should be 'if cond is None:'" + self.add_issue(711, message, leaf) + break + elif node.value in ('True', 'False'): + message = "comparison to False/True should be 'if cond is True:' or 'if cond:'" + self.add_issue(712, message, leaf) + break + if leaf.value in ('in', 'is'): + comparison = leaf.parent + if comparison.type == 'comparison' and comparison.parent.type == 'not_test': + if leaf.value == 'in': + self.add_issue(713, "test for membership should be 'not in'", leaf) + else: + self.add_issue(714, "test for object identity should be 'is not'", leaf) for part in leaf._split_prefix(): part diff --git a/test/normalizer_issue_files/E71.py b/test/normalizer_issue_files/E71.py new file mode 100644 index 0000000..109dcd6 --- /dev/null +++ b/test/normalizer_issue_files/E71.py @@ -0,0 +1,93 @@ +#: E711:7 +if res == None: + pass +#: E711:7 +if res != None: + pass +#: E711:8 +if None == res: + pass +#: E711:8 +if None != res: + pass +#: E711:10 +if res[1] == None: + pass +#: E711:10 +if res[1] != None: + pass +#: E711:8 +if None != res[1]: + pass +#: E711:8 +if None == res[1]: + pass + +# +#: E712:7 +if res == True: + pass +#: E712:7 +if res != False: + pass +#: E712:8 +if True != res: + pass +#: E712:9 +if False == res: + pass +#: E712:10 +if res[1] == True: + pass +#: E712:10 +if res[1] != False: + pass + +if x is False: + pass + +# +#: E713:9 +if not X in Y: + pass +#: E713:11 +if not X.B in Y: + pass +#: E713:9 +if not X in Y and Z == "zero": + pass +#: E713:24 +if X == "zero" or not Y in Z: + pass + +# +#: E714:9 +if not X is Y: + pass +#: E714:11 +if not X.B is Y: + pass + +# +# Okay +if x not in y: + pass + +if not (X in Y or X is Z): + pass + +if not (X in Y): + pass + +if x is not y: + pass + +if TrueElement.get_element(True) == TrueElement.get_element(False): + pass + +if (True) == TrueElement or x == TrueElement: + pass + +assert (not foo) in bar +assert {'x': not foo} in bar +assert [42, not foo] in bar