From 0f6c763d9e5c8b2ab6b44de5cc2dcaeb41e9d62c Mon Sep 17 00:00:00 2001 From: Mahmoud Al-Qudsi Date: Mon, 12 Mar 2018 08:35:09 -0500 Subject: [PATCH] Revert "Restore sanity to line continuations" This reverts commit 2cdacbdce4c9909f294dce5d350b9cf3130eddb0. Our fish scripts need to be audited for compliance before this can be safely merged. cc @faho --- src/tokenizer.cpp | 16 +++++++++------- src/tokenizer.h | 2 ++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 1cd4adc0c..65e262204 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -416,12 +416,11 @@ maybe_t tokenizer_t::tok_next() { return none(); } - bool line_continued = false; // Consume non-newline whitespace. If we get an escaped newline, mark it and continue past it. for (;;) { if (this->buff[0] == L'\\' && this->buff[1] == L'\n') { - line_continued = true; this->buff += 2; + this->continue_line_after_comment = true; } else if (iswspace_not_nl(this->buff[0])) { this->buff++; } else { @@ -429,12 +428,15 @@ maybe_t tokenizer_t::tok_next() { } } - if (*this->buff == L'#') { + while (*this->buff == L'#') { // We have a comment, walk over the comment. const wchar_t *comment_start = this->buff; while (this->buff[0] != L'\n' && this->buff[0] != L'\0') this->buff++; size_t comment_len = this->buff - comment_start; + // If we are going to continue after the comment, skip any trailing newline. + if (this->buff[0] == L'\n' && this->continue_line_after_comment) this->buff++; + // Maybe return the comment. if (this->show_comments) { tok_t result; @@ -443,12 +445,11 @@ maybe_t tokenizer_t::tok_next() { result.length = comment_len; return result; } - if (line_continued) { - return none(); - } while (iswspace_not_nl(this->buff[0])) this->buff++; } + // We made it past the comments and ate any trailing newlines we wanted to ignore. + this->continue_line_after_comment = false; size_t start_pos = this->buff - this->start; tok_t result; @@ -467,7 +468,8 @@ maybe_t tokenizer_t::tok_next() { // Hack: when we get a newline, swallow as many as we can. This compresses multiple // subsequent newlines into a single one. if (!this->show_blank_lines) { - while (is_whitespace(*this->buff)) { + while (*this->buff == L'\n' || *this->buff == 13 /* CR */ || *this->buff == ' ' || + *this->buff == '\t') { this->buff++; } } diff --git a/src/tokenizer.h b/src/tokenizer.h index a3e6ef782..8ce6618a7 100644 --- a/src/tokenizer.h +++ b/src/tokenizer.h @@ -104,6 +104,8 @@ class tokenizer_t { bool show_comments{false}; /// Whether all blank lines are returned. bool show_blank_lines{false}; + /// Whether to continue the previous line after the comment. + bool continue_line_after_comment{false}; tok_t call_error(tokenizer_error *error_type, const wchar_t *token_start, const wchar_t *error_loc);