1 //===-- MSVCUndecoratedNameParser.cpp ---------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "MSVCUndecoratedNameParser.h"
13 MSVCUndecoratedNameParser::MSVCUndecoratedNameParser(llvm::StringRef name) {
14 std::size_t last_base_start = 0;
16 std::stack<std::size_t> stack;
17 unsigned int open_angle_brackets = 0;
18 for (size_t i = 0; i < name.size(); i++) {
21 // Do not treat `operator<' and `operator<<' as templates
22 // (sometimes they represented as `<' and `<<' in the name).
23 if (i == last_base_start ||
24 (i == last_base_start + 1 && name[last_base_start] == '<'))
28 open_angle_brackets++;
32 if (!stack.empty() && name[stack.top()] == '<') {
33 open_angle_brackets--;
43 while (!stack.empty()) {
44 std::size_t top = stack.top();
46 open_angle_brackets--;
56 if (open_angle_brackets)
58 if (i == 0 || name[i - 1] != ':')
61 m_specifiers.emplace_back(name.take_front(i - 1),
62 name.slice(last_base_start, i - 1));
64 last_base_start = i + 1;
71 m_specifiers.emplace_back(name, name.drop_front(last_base_start));
74 bool MSVCUndecoratedNameParser::IsMSVCUndecoratedName(llvm::StringRef name) {
75 return name.find('`') != llvm::StringRef::npos;
78 bool MSVCUndecoratedNameParser::ExtractContextAndIdentifier(
79 llvm::StringRef name, llvm::StringRef &context,
80 llvm::StringRef &identifier) {
81 MSVCUndecoratedNameParser parser(name);
82 llvm::ArrayRef<MSVCUndecoratedNameSpecifier> specs = parser.GetSpecifiers();
84 std::size_t count = specs.size();
85 identifier = count > 0 ? specs[count - 1].GetBaseName() : "";
86 context = count > 1 ? specs[count - 2].GetFullName() : "";
91 llvm::StringRef MSVCUndecoratedNameParser::DropScope(llvm::StringRef name) {
92 MSVCUndecoratedNameParser parser(name);
93 llvm::ArrayRef<MSVCUndecoratedNameSpecifier> specs = parser.GetSpecifiers();
97 return specs[specs.size() - 1].GetBaseName();