Make sure dedents are emitted for inputs without trailing newlines (#573)

This commit is contained in:
Zsolt Dollenstein 2022-01-04 20:04:21 +00:00 committed by GitHub
parent cff47b767b
commit 86431eea89
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 1 deletions

View file

@ -342,7 +342,20 @@ impl<'t> TokState<'t> {
self.missing_nl_before_eof = false;
Ok(TokType::Newline)
} else {
Ok(TokType::EndMarker)
let hanging_indents = self.indent_stack.len() as i32;
if self.pending_indents == 0 && hanging_indents != 0 {
// We've reached EOF but there are still pending indents not
// accounted for. Flush them out.
self.pending_indents = -hanging_indents;
self.indent_stack.clear();
self.alt_indent_stack.clear();
self.missing_nl_before_eof = false;
}
if let Some(t) = self.process_pending_indents() {
Ok(t)
} else {
Ok(TokType::EndMarker)
}
}
}

View file

@ -687,3 +687,43 @@ fn test_add_dedents_after_fake_newline() {
])
);
}
#[test]
fn test_add_dedents_for_dangling_indent() {
assert_eq!(
tokenize_with_end_marker("if 1:\n if 2:\n ", &default_config()),
Ok(vec![
(TokType::Name, "if"),
(TokType::Number, "1"),
(TokType::Op, ":"),
(TokType::Newline, "\n"),
(TokType::Indent, ""),
(TokType::Name, "if"),
(TokType::Number, "2"),
(TokType::Op, ":"),
(TokType::Newline, "\n"),
(TokType::Dedent, ""),
(TokType::EndMarker, "")
])
);
}
#[test]
fn test_add_dedents_for_dangling_indent_with_comment() {
assert_eq!(
tokenize_with_end_marker("if 1:\n if 2:\n # foo", &default_config()),
Ok(vec![
(TokType::Name, "if"),
(TokType::Number, "1"),
(TokType::Op, ":"),
(TokType::Newline, "\n"),
(TokType::Indent, ""),
(TokType::Name, "if"),
(TokType::Number, "2"),
(TokType::Op, ":"),
(TokType::Newline, "\n"),
(TokType::Dedent, ""),
(TokType::EndMarker, "")
])
);
}

View file

@ -0,0 +1,3 @@
if 1:
pass