|
30 | 30 | #include "absl/strings/str_cat.h" |
31 | 31 | #include "absl/strings/string_view.h" |
32 | 32 | #include "base/kind.h" |
| 33 | +#include "internal/lexis.h" |
33 | 34 | #include "internal/status_macros.h" |
34 | 35 | #include "internal/strings.h" |
35 | 36 |
|
@@ -133,14 +134,61 @@ struct AttributeQualifierToString { |
133 | 134 | } |
134 | 135 |
|
135 | 136 | void operator()(absl::string_view value) const { |
136 | | - absl::StrAppend(&output, internal::FormatStringLiteral(value)); |
| 137 | + if (internal::LexisIsIdentifier(value)) { |
| 138 | + absl::StrAppend(&output, value); |
| 139 | + } else { |
| 140 | + internal::FormatStringLiteralTo(value, &output); |
| 141 | + } |
| 142 | + } |
| 143 | + |
| 144 | + void operator()(common_internal::WildcardType) const { |
| 145 | + output.push_back('*'); |
| 146 | + } |
| 147 | + |
| 148 | + std::string& output; |
| 149 | +}; |
| 150 | + |
| 151 | +struct AttributeQualifierJoinString { |
| 152 | + void operator()(std::monostate) const {} |
| 153 | + |
| 154 | + void operator()(bool value) const { |
| 155 | + output.push_back('['); |
| 156 | + output.append(value ? "true" : "false"); |
| 157 | + output.push_back(']'); |
| 158 | + } |
| 159 | + |
| 160 | + void operator()(int64_t value) const { |
| 161 | + absl::StrAppend(&output, "[", value, "]"); |
137 | 162 | } |
138 | 163 |
|
139 | | - void operator()(common_internal::WildcardType) const { output.append("*"); } |
| 164 | + void operator()(uint64_t value) const { |
| 165 | + absl::StrAppend(&output, "[", value, "u", "]"); |
| 166 | + } |
| 167 | + |
| 168 | + void operator()(absl::string_view value) const { |
| 169 | + if (internal::LexisIsIdentifier(value)) { |
| 170 | + absl::StrAppend(&output, ".", value); |
| 171 | + } else { |
| 172 | + output.push_back('['); |
| 173 | + internal::FormatStringLiteralTo(value, &output); |
| 174 | + output.push_back(']'); |
| 175 | + } |
| 176 | + } |
| 177 | + |
| 178 | + void operator()(common_internal::WildcardType) const { output.append(".*"); } |
140 | 179 |
|
141 | 180 | std::string& output; |
142 | 181 | }; |
143 | 182 |
|
| 183 | +template <typename Q> |
| 184 | +void AttributeQualifierAppendJoinString(std::string* out, |
| 185 | + absl::Span<const Q> qualifiers) { |
| 186 | + for (const auto& qualifier : qualifiers) { |
| 187 | + std::visit(AttributeQualifierJoinString{*out}, |
| 188 | + common_internal::AsVariant(qualifier)); |
| 189 | + } |
| 190 | +} |
| 191 | + |
144 | 192 | } // namespace |
145 | 193 |
|
146 | 194 | Kind AttributeQualifier::kind() const { |
@@ -218,34 +266,61 @@ absl::StatusOr<std::string> Attribute::AsString() const { |
218 | 266 | std::string Attribute::ToString() const { |
219 | 267 | std::string result; |
220 | 268 | result.append(variable_name()); |
221 | | - for (const auto& qualifier : qualifier_path()) { |
222 | | - result.push_back('['); |
223 | | - std::visit(AttributeQualifierToString{result}, |
224 | | - common_internal::AsVariant(qualifier)); |
225 | | - result.push_back(']'); |
226 | | - } |
| 269 | + AttributeQualifier::AppendJoinString(&result, qualifier_path()); |
227 | 270 | return result; |
228 | 271 | } |
229 | 272 |
|
230 | 273 | std::string AttributePattern::ToString() const { |
231 | 274 | std::string result; |
232 | 275 | result.append(variable()); |
233 | | - for (const auto& qualifier : qualifier_path()) { |
234 | | - result.push_back('['); |
235 | | - std::visit(AttributeQualifierToString{result}, |
236 | | - common_internal::AsVariant(qualifier)); |
237 | | - result.push_back(']'); |
238 | | - } |
| 276 | + AttributeQualifierPattern::AppendJoinString(&result, qualifier_path()); |
239 | 277 | return result; |
240 | 278 | } |
241 | 279 |
|
242 | | -std::string AttributeQualifier::ToString() const { |
243 | | - std::string result; |
244 | | - absl::Status status = |
245 | | - std::visit(AttributeQualifierStringPrinter{&result}, value_); |
246 | | - ABSL_DCHECK_OK(status) << "bad attribute qualifier"; |
247 | | - status.IgnoreError(); |
248 | | - return result; |
| 280 | +void AttributeQualifier::AppendToString(std::string* absl_nonnull out) const { |
| 281 | + std::visit(AttributeQualifierToString{*out}, value_); |
| 282 | +} |
| 283 | + |
| 284 | +void AttributeQualifierView::AppendToString( |
| 285 | + std::string* absl_nonnull out) const { |
| 286 | + std::visit(AttributeQualifierToString{*out}, value_); |
| 287 | +} |
| 288 | + |
| 289 | +void AttributeQualifierPattern::AppendToString( |
| 290 | + std::string* absl_nonnull out) const { |
| 291 | + std::visit(AttributeQualifierToString{*out}, value_); |
| 292 | +} |
| 293 | + |
| 294 | +void AttributeQualifier::AppendJoinString(std::string* absl_nonnull out) const { |
| 295 | + std::visit(AttributeQualifierJoinString{*out}, value_); |
| 296 | +} |
| 297 | + |
| 298 | +void AttributeQualifierView::AppendJoinString( |
| 299 | + std::string* absl_nonnull out) const { |
| 300 | + std::visit(AttributeQualifierJoinString{*out}, value_); |
| 301 | +} |
| 302 | + |
| 303 | +void AttributeQualifierPattern::AppendJoinString( |
| 304 | + std::string* absl_nonnull out) const { |
| 305 | + std::visit(AttributeQualifierJoinString{*out}, value_); |
| 306 | +} |
| 307 | + |
| 308 | +void AttributeQualifier::AppendJoinString( |
| 309 | + std::string* absl_nonnull out, |
| 310 | + absl::Span<const AttributeQualifier> qualifiers) { |
| 311 | + AttributeQualifierAppendJoinString(out, qualifiers); |
| 312 | +} |
| 313 | + |
| 314 | +void AttributeQualifierView::AppendJoinString( |
| 315 | + std::string* absl_nonnull out, |
| 316 | + absl::Span<const AttributeQualifierView> qualifiers) { |
| 317 | + AttributeQualifierAppendJoinString(out, qualifiers); |
| 318 | +} |
| 319 | + |
| 320 | +void AttributeQualifierPattern::AppendJoinString( |
| 321 | + std::string* absl_nonnull out, |
| 322 | + absl::Span<const AttributeQualifierPattern> qualifiers) { |
| 323 | + AttributeQualifierAppendJoinString(out, qualifiers); |
249 | 324 | } |
250 | 325 |
|
251 | 326 | bool AttributeQualifier::IsMatch(const AttributeQualifier& other) const { |
|
0 commit comments