E126: Problem with bad hanging & visual indents
While trying to work out the kinks in my attempted fix for issue #667, I realised the indentation checks are more broken than I expected.
This test is in the test suite:
#: E126 E126
rv.update(dict.fromkeys((
'qualif_nr', 'reasonComment_en', 'reasonComment_fr',
'reasonComment_de', 'reasonComment_it'),
'?'),
"foo")
Currently this test passes, but it shouldn't. With the following line numbers (don't know how to make line nums show up in github code blocks?):
1 rv.update(dict.fromkeys((
2 'qualif_nr', 'reasonComment_en', 'reasonComment_fr',
3 'reasonComment_de', 'reasonComment_it'),
4 '?'),
5 "foo")
pycodestyle reports E126 (continuation line over-indented for hanging indent) for lines 2 and 4, and no other errors, and so the test passes. But looking at the PEP 8 guidelines on hanging indents:
When using a hanging indent the following should be considered; there should be no arguments on the first line...
Since three bracketed blocks are opened on line 1, only the innermost one should qualify as a possible hanging indent. So lines 2 and 3 are over-indented hanging indents and should report E126 (currently 2 does and 3 doesn't).
Lines 4 and 5 can't be hanging indents as each of their bracket-blocks' first arguments begin on the same line as their opening bracket (i.e. line 1). Hence line 4 is erroneously reported as E126, and both of these lines should be reported as under-indented visual indents (E128), which neither of them currently are (5 gets no report, 4 gets the erroneous E126 as mentioned).
As a sanity-check, I ran pylint on the above file, which flagged "wrong hanging indentation" for lines 2 and 3, and "wrong continued indentation" for lines 4 and 5, which matches with my reasoning above.
I think this might need a fairly substantial rewrite of the continued_indentation check and associated tests. I don't have any time in the next week, but if nobody else takes it on I would be happy to have a look at it when I have time.