summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2021-09-30 17:17:21 +0100
committerAndreas Kling <kling@serenityos.org>2021-10-01 20:03:03 +0200
commit2ed0f880eee6f28958907b5da26590c106bb5fbb (patch)
tree5f0578eb9e95bf6a87eaf2e58d94827433efc577
parentc7cd4896890a92d4b4746abb9fb1660d0950b915 (diff)
downloadserenity-2ed0f880eee6f28958907b5da26590c106bb5fbb.zip
LibWeb: Add TokenStream::rewind_to_position()
Parsing media queries sometimes requires significant back-tracking, so `reconsume_current_input_token()` was not good enough. `rewind_to_position()` lets you reconsume an erbitrary number of tokens to return to an earlier point in the stream, which you previously saved from `TokenStream::position()`.
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp7
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.h3
2 files changed, 10 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
index 39be9f7d04..5599f2d5bd 100644
--- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
+++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
@@ -107,6 +107,13 @@ void TokenStream<T>::reconsume_current_input_token()
}
template<typename T>
+void TokenStream<T>::rewind_to_position(int position)
+{
+ VERIFY(position <= m_iterator_offset);
+ m_iterator_offset = position;
+}
+
+template<typename T>
void TokenStream<T>::skip_whitespace()
{
while (peek_token().is(Token::Type::Whitespace))
diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h
index fabe517920..0eace6cfc2 100644
--- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h
+++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h
@@ -61,6 +61,9 @@ public:
T const& current_token();
void reconsume_current_input_token();
+ int position() const { return m_iterator_offset; }
+ void rewind_to_position(int);
+
void skip_whitespace();
void dump_all_tokens();