| // Copyright 2018 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. |
| |
| #pragma once |
| |
| #include <string> |
| #include <vector> |
| |
| #include "garnet/bin/zxdb/common/err.h" |
| |
| namespace zxdb { |
| |
| class ExprToken; |
| |
| // C++ template types are mostly opaque to the debugger and we can't do many |
| // transformations on them. We don't attempt to fully parse or understand types |
| // and require the user to input things according to how the symbols represent |
| // the names. |
| // |
| // But one thing we do need to do is find where the end of a type is for |
| // certain expressions such as template parameters, and to perform limited |
| // canonicalization of those types. |
| // |
| // For example, to do a cast: |
| // static_cast<Foo::Bar<Something*>>(a) |
| // We need only understand what the type is enough to look it up in the |
| // symbols, and would prefer to allow the user flexibility in exactly matching |
| // the whitespace generated by the compiler. |
| // |
| // There are two parts: |
| // |
| // 1. Finding the end of a template type. This tracks things like brackets, |
| // parens, and quotes so we know where the end token of the type is. In the |
| // above example, this means knowing the second '>' is the terminator. |
| // |
| // 2. Canonicalization. The only canonicalization we do is whitespace |
| // canonicalization. This comes up most often in spaces after commas in |
| // type lists, and whether the ">>" at the end of the above example needs |
| // a space separating them or not. |
| |
| struct TemplateTypeResult { |
| bool success = false; |
| |
| // When success = false, this is the index of the token for which a |
| // terminator was not found. So if there was a '[" with no ']', this will |
| // reference the '[' token. |
| size_t unmatched_error_token = 0; |
| |
| // Token immediately following the extracted type on success. Will be one |
| // past the end of the input tokens if everything was consumed. |
| size_t end_token = 0; |
| |
| // Valid on success. |
| std::string canonical_name; |
| }; |
| |
| TemplateTypeResult ExtractTemplateType(const std::vector<ExprToken>& tokens, |
| size_t begin_token); |
| |
| } // namespace zxdb |