pylance-release
pylance-release copied to clipboard
Auto-indent too large when creating `def` after incomplete `for` loop
When pressing Enter after def isDigitOrComma(ch: str) -> bool:
below, the automatic indentation is 16 spaces rather than 4.
If you delete the incomplete for
loop then auto-indent works as expected.
I can understand that the "Unexpected indentation" errors after that for loop in the reduce
function could throw things off, but it looks like the def
for isDigitOrComma
actually got the parser back on track. The only error on that line is that there's no return statement. So why is the indentation logic confused?
I ran into this while doing some recreational coding over the weekend. I think we should be able to handle this. Stopping in the midst of implementing one function to write another one (presumably to be used in the first) seems like a common scenario to me.
def reduce(input: str) -> str:
depth = 0
for i in range(0, len(input)):
ch = input[i]
if ch == "[":
depth += 1
if depth >= 4 and isRegularNumberPair(input[i:]):
(left, right) = parseRegularNumberPair(input[i:])
for leftSearch in range(i, 0, -1):
leftCh = input[leftSearch]
if leftCh != "," and leftCh != "[" and leftCh != "]":
elif ch == "]":
depth -= 1
elif ch == ",":
pass
else:
pass
def isDigitOrComma(ch: str) -> bool:
Is this a parser recovery issue or a bug in the indentation logic? Does the parser believe that the isDigitOrComma
def
is a child of the for
loop?
Confirmed that the parser decides that isDigitOrComma
is a child of a suite within the reduce
function.
We'll first try to improve the parser recovery logic to handle this better.
This issue has been fixed in prerelease version 2022.10.11, which we've just released. You can find the changelog here: CHANGELOG.md