Parcourir la source

CppLexer: Support raw string literals

Handles prefixes and delimiters (`R"(text)", `u8R"f(text)f"`, ...).
Nico Weber il y a 5 ans
Parent
commit
9ee1edae2a

+ 22 - 0
Libraries/LibGUI/CppLexer.cpp

@@ -636,6 +636,28 @@ Vector<CppToken> CppLexer::lex()
             commit_token(CppToken::Type::DoubleQuotedString);
             continue;
         }
+        if (size_t prefix = match_string_prefix('R'); prefix > 0 && peek(prefix) == '"') {
+            begin_token();
+            for (size_t i = 0; i < prefix + 1; ++i)
+                consume();
+            size_t prefix_start = m_index;
+            while (peek() && peek() != '(')
+                consume();
+            StringView prefix_string = m_input.substring_view(prefix_start, m_index - prefix_start);
+            while (peek()) {
+                if (consume() == '"') {
+                    ASSERT(m_index >= prefix_string.length() + 2);
+                    ASSERT(m_input[m_index - 1] == '"');
+                    if (m_input[m_index - 1 - prefix_string.length() - 1] == ')') {
+                        StringView suffix_string = m_input.substring_view(m_index - 1 - prefix_string.length(), prefix_string.length());
+                        if (prefix_string == suffix_string)
+                            break;
+                    }
+                }
+            }
+            commit_token(CppToken::Type::DoubleQuotedString);
+            continue;
+        }
         if (size_t prefix = match_string_prefix('\''); prefix > 0) {
             begin_token();
             for (size_t i = 0; i < prefix; ++i)

+ 1 - 0
Libraries/LibGUI/CppLexer.h

@@ -89,6 +89,7 @@ namespace GUI {
     __TOKEN(ArrowAsterisk)         \
     __TOKEN(DoubleQuotedString)    \
     __TOKEN(SingleQuotedString)    \
+    __TOKEN(RawString)             \
     __TOKEN(EscapeSequence)        \
     __TOKEN(Comment)               \
     __TOKEN(Integer)               \

+ 1 - 0
Libraries/LibGUI/CppSyntaxHighlighter.cpp

@@ -43,6 +43,7 @@ static TextStyle style_for_token_type(Gfx::Palette palette, CppToken::Type type)
         return { palette.syntax_identifier() };
     case CppToken::Type::DoubleQuotedString:
     case CppToken::Type::SingleQuotedString:
+    case CppToken::Type::RawString:
         return { palette.syntax_string() };
     case CppToken::Type::Integer:
     case CppToken::Type::Float: