blob: b9f06eaa3de2e9d9650484a0d224b6ca39c582aa [file] [log] [blame]
// 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