| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/developer/debug/zxdb/expr/parsed_identifier.h" |
| |
| #include "src/developer/debug/zxdb/expr/expr_parser.h" |
| |
| namespace zxdb { |
| |
| std::string ParsedIdentifierComponent::GetName(bool include_debug) const { |
| std::string result; |
| |
| if (include_debug) |
| result.push_back('"'); |
| |
| if (special_ == SpecialIdentifier::kNone) { |
| result += name_; |
| } else { |
| result.append(SpecialIdentifierToString(special_)); |
| if (SpecialIdentifierHasData(special_)) { |
| result.push_back('('); |
| result += name_; |
| result.push_back(')'); |
| } |
| } |
| |
| if (include_debug) |
| result.push_back('"'); |
| |
| if (has_template()) { |
| if (include_debug) |
| result.push_back(','); |
| result.push_back('<'); |
| |
| for (size_t i = 0; i < template_contents().size(); i++) { |
| if (i > 0) |
| result += ", "; |
| |
| // Template parameter string. |
| if (include_debug) |
| result.push_back('"'); |
| result += template_contents()[i]; |
| if (include_debug) |
| result.push_back('"'); |
| } |
| result.push_back('>'); |
| } |
| return result; |
| } |
| |
| Identifier ToIdentifier(const ParsedIdentifier& parsed) { |
| Identifier ret(parsed.qualification()); |
| ret.components().reserve(parsed.components().size()); |
| |
| // Just convert each component to its simple name. |
| for (const auto& c : parsed.components()) { |
| // Assume components either are special or have templates, but not both. |
| if (c.special() == SpecialIdentifier::kNone) { |
| ret.AppendComponent(IdentifierComponent(c.GetName(false))); |
| } else { |
| FX_DCHECK(!c.has_template()); |
| ret.AppendComponent(IdentifierComponent(c.special(), c.name())); |
| } |
| } |
| return ret; |
| } |
| |
| // We want to keep the same component structure regardless of what arbitrary strings were contained |
| // in the original. So go one component at a time. |
| ParsedIdentifier ToParsedIdentifier(const Identifier& ident) { |
| ParsedIdentifier ret(ident.qualification()); |
| ret.components().reserve(ident.components().size()); |
| |
| Err err; |
| ParsedIdentifier parsed; |
| for (const auto& c : ident.components()) { |
| if (c.special() != SpecialIdentifier::kNone) { |
| // Assume special components don't have templates and can be copied as-is. |
| ret.AppendComponent(ParsedIdentifierComponent(c.special(), c.name())); |
| continue; |
| } |
| |
| // All normal components: try to parse. |
| std::string c_name = c.GetName(false); |
| err = ExprParser::ParseIdentifier(c_name, &parsed); |
| if (err.has_error() || parsed.components().size() != 1) { |
| // Give up and use the literal string. |
| ret.AppendComponent(ParsedIdentifierComponent(c_name)); |
| } else { |
| ret.AppendComponent(std::move(parsed.components()[0])); |
| } |
| } |
| return ret; |
| } |
| |
| } // namespace zxdb |