Coverage Report

Created: 2025-11-02 07:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Userland/Libraries/LibWeb/CSS/Parser/Token.cpp
Line
Count
Source
1
/*
2
 * Copyright (c) 2020-2021, the SerenityOS developers.
3
 * Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
4
 *
5
 * SPDX-License-Identifier: BSD-2-Clause
6
 */
7
8
#include <LibWeb/CSS/Parser/Token.h>
9
#include <LibWeb/CSS/Serialize.h>
10
11
namespace Web::CSS::Parser {
12
13
String Token::to_string() const
14
0
{
15
0
    StringBuilder builder;
16
17
0
    switch (m_type) {
18
0
    case Type::EndOfFile:
19
0
        return String {};
20
0
    case Type::Ident:
21
0
        return serialize_an_identifier(ident());
22
0
    case Type::Function:
23
0
        return MUST(String::formatted("{}(", serialize_an_identifier(function())));
24
0
    case Type::AtKeyword:
25
0
        return MUST(String::formatted("@{}", serialize_an_identifier(at_keyword())));
26
0
    case Type::Hash: {
27
0
        switch (m_hash_type) {
28
0
        case HashType::Id:
29
0
            return MUST(String::formatted("#{}", serialize_an_identifier(hash_value())));
30
0
        case HashType::Unrestricted:
31
0
            return MUST(String::formatted("#{}", hash_value()));
32
0
        }
33
0
        VERIFY_NOT_REACHED();
34
0
    }
35
0
    case Type::String:
36
0
        return serialize_a_string(string());
37
0
    case Type::BadString:
38
0
        return String {};
39
0
    case Type::Url:
40
0
        return serialize_a_url(url());
41
0
    case Type::BadUrl:
42
0
        return "url()"_string;
43
0
    case Type::Delim:
44
0
        return String { m_value };
45
0
    case Type::Number:
46
0
        return String::number(m_number_value.value());
47
0
    case Type::Percentage:
48
0
        return MUST(String::formatted("{}%", m_number_value.value()));
49
0
    case Type::Dimension:
50
0
        return MUST(String::formatted("{}{}", m_number_value.value(), dimension_unit()));
51
0
    case Type::Whitespace:
52
0
        return " "_string;
53
0
    case Type::CDO:
54
0
        return "<!--"_string;
55
0
    case Type::CDC:
56
0
        return "-->"_string;
57
0
    case Type::Colon:
58
0
        return ":"_string;
59
0
    case Type::Semicolon:
60
0
        return ";"_string;
61
0
    case Type::Comma:
62
0
        return ","_string;
63
0
    case Type::OpenSquare:
64
0
        return "["_string;
65
0
    case Type::CloseSquare:
66
0
        return "]"_string;
67
0
    case Type::OpenParen:
68
0
        return "("_string;
69
0
    case Type::CloseParen:
70
0
        return ")"_string;
71
0
    case Type::OpenCurly:
72
0
        return "{"_string;
73
0
    case Type::CloseCurly:
74
0
        return "}"_string;
75
0
    case Type::Invalid:
76
0
    default:
77
0
        VERIFY_NOT_REACHED();
78
0
    }
79
0
}
80
81
String Token::to_debug_string() const
82
0
{
83
0
    switch (m_type) {
84
0
    case Type::Invalid:
85
0
        VERIFY_NOT_REACHED();
86
87
0
    case Type::EndOfFile:
88
0
        return "__EOF__"_string;
89
0
    case Type::Ident:
90
0
        return MUST(String::formatted("Ident: {}", ident()));
91
0
    case Type::Function:
92
0
        return MUST(String::formatted("Function: {}", function()));
93
0
    case Type::AtKeyword:
94
0
        return MUST(String::formatted("AtKeyword: {}", at_keyword()));
95
0
    case Type::Hash:
96
0
        return MUST(String::formatted("Hash: {} (hash_type: {})", hash_value(), m_hash_type == HashType::Unrestricted ? "Unrestricted" : "Id"));
97
0
    case Type::String:
98
0
        return MUST(String::formatted("String: {}", string()));
99
0
    case Type::BadString:
100
0
        return "BadString"_string;
101
0
    case Type::Url:
102
0
        return MUST(String::formatted("Url: {}", url()));
103
0
    case Type::BadUrl:
104
0
        return "BadUrl"_string;
105
0
    case Type::Delim:
106
0
        return MUST(String::formatted("Delim: {}", m_value));
107
0
    case Type::Number:
108
0
        return MUST(String::formatted("Number: {}{} (number_type: {})", m_number_value.value() > 0 && m_number_value.is_integer_with_explicit_sign() ? "+" : "", m_number_value.value(), m_number_value.is_integer() ? "Integer" : "Number"));
109
0
    case Type::Percentage:
110
0
        return MUST(String::formatted("Percentage: {}% (number_type: {})", percentage(), m_number_value.is_integer() ? "Integer" : "Number"));
111
0
    case Type::Dimension:
112
0
        return MUST(String::formatted("Dimension: {}{} (number_type: {})", dimension_value(), dimension_unit(), m_number_value.is_integer() ? "Integer" : "Number"));
113
0
    case Type::Whitespace:
114
0
        return "Whitespace"_string;
115
0
    case Type::CDO:
116
0
        return "CDO"_string;
117
0
    case Type::CDC:
118
0
        return "CDC"_string;
119
0
    case Type::Colon:
120
0
        return "Colon"_string;
121
0
    case Type::Semicolon:
122
0
        return "Semicolon"_string;
123
0
    case Type::Comma:
124
0
        return "Comma"_string;
125
0
    case Type::OpenSquare:
126
0
        return "OpenSquare"_string;
127
0
    case Type::CloseSquare:
128
0
        return "CloseSquare"_string;
129
0
    case Type::OpenParen:
130
0
        return "OpenParen"_string;
131
0
    case Type::CloseParen:
132
0
        return "CloseParen"_string;
133
0
    case Type::OpenCurly:
134
0
        return "OpenCurly"_string;
135
0
    case Type::CloseCurly:
136
0
        return "CloseCurly"_string;
137
0
    }
138
0
    VERIFY_NOT_REACHED();
139
0
}
140
141
Token::Type Token::mirror_variant() const
142
0
{
143
0
    if (is(Token::Type::OpenCurly)) {
144
0
        return Type::CloseCurly;
145
0
    }
146
147
0
    if (is(Token::Type::OpenSquare)) {
148
0
        return Type::CloseSquare;
149
0
    }
150
151
0
    if (is(Token::Type::OpenParen)) {
152
0
        return Type::CloseParen;
153
0
    }
154
155
0
    return Type::Invalid;
156
0
}
157
158
StringView Token::bracket_string() const
159
0
{
160
0
    if (is(Token::Type::OpenCurly)) {
161
0
        return "{"sv;
162
0
    }
163
164
0
    if (is(Token::Type::CloseCurly)) {
165
0
        return "}"sv;
166
0
    }
167
168
0
    if (is(Token::Type::OpenSquare)) {
169
0
        return "["sv;
170
0
    }
171
172
0
    if (is(Token::Type::CloseSquare)) {
173
0
        return "]"sv;
174
0
    }
175
176
0
    if (is(Token::Type::OpenParen)) {
177
0
        return "("sv;
178
0
    }
179
180
0
    if (is(Token::Type::CloseParen)) {
181
0
        return ")"sv;
182
0
    }
183
184
0
    return ""sv;
185
0
}
186
187
StringView Token::bracket_mirror_string() const
188
0
{
189
0
    if (is(Token::Type::OpenCurly)) {
190
0
        return "}"sv;
191
0
    }
192
193
0
    if (is(Token::Type::CloseCurly)) {
194
0
        return "{"sv;
195
0
    }
196
197
0
    if (is(Token::Type::OpenSquare)) {
198
0
        return "]"sv;
199
0
    }
200
201
0
    if (is(Token::Type::CloseSquare)) {
202
0
        return "["sv;
203
0
    }
204
205
0
    if (is(Token::Type::OpenParen)) {
206
0
        return ")"sv;
207
0
    }
208
209
0
    if (is(Token::Type::CloseParen)) {
210
0
        return "("sv;
211
0
    }
212
213
0
    return ""sv;
214
0
}
215
216
}