Path: blob/main/contrib/llvm-project/lldb/source/Core/DemangledNameInfo.cpp
213765 views
//===-- DemangledNameInfo.cpp ---------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Core/DemangledNameInfo.h"910using namespace llvm::itanium_demangle;1112namespace lldb_private {1314bool TrackingOutputBuffer::shouldTrack() const {15if (!isPrintingTopLevelFunctionType())16return false;1718if (isGtInsideTemplateArgs())19return false;2021if (NameInfo.ArgumentsRange.first > 0)22return false;2324return true;25}2627bool TrackingOutputBuffer::canFinalize() const {28if (!isPrintingTopLevelFunctionType())29return false;3031if (isGtInsideTemplateArgs())32return false;3334if (NameInfo.ArgumentsRange.first == 0)35return false;3637return true;38}3940void TrackingOutputBuffer::updateBasenameEnd() {41if (!shouldTrack())42return;4344NameInfo.BasenameRange.second = getCurrentPosition();45}4647void TrackingOutputBuffer::updateScopeStart() {48if (!shouldTrack())49return;5051NameInfo.ScopeRange.first = getCurrentPosition();52}5354void TrackingOutputBuffer::updateScopeEnd() {55if (!shouldTrack())56return;5758NameInfo.ScopeRange.second = getCurrentPosition();59}6061void TrackingOutputBuffer::finalizeArgumentEnd() {62if (!canFinalize())63return;6465NameInfo.ArgumentsRange.second = getCurrentPosition();66}6768void TrackingOutputBuffer::finalizeQualifiersStart() {69if (!canFinalize())70return;7172NameInfo.QualifiersRange.first = getCurrentPosition();73}7475void TrackingOutputBuffer::finalizeQualifiersEnd() {76if (!canFinalize())77return;7879NameInfo.QualifiersRange.second = getCurrentPosition();80}8182void TrackingOutputBuffer::finalizeStart() {83if (!shouldTrack())84return;8586NameInfo.ArgumentsRange.first = getCurrentPosition();8788// If nothing has set the end of the basename yet (for example when89// printing templates), then the beginning of the arguments is the end of90// the basename.91if (NameInfo.BasenameRange.second == 0)92NameInfo.BasenameRange.second = getCurrentPosition();9394assert(!shouldTrack());95assert(canFinalize());96}9798void TrackingOutputBuffer::finalizeEnd() {99if (!canFinalize())100return;101102if (NameInfo.ScopeRange.first > NameInfo.ScopeRange.second)103NameInfo.ScopeRange.second = NameInfo.ScopeRange.first;104NameInfo.BasenameRange.first = NameInfo.ScopeRange.second;105}106107ScopedOverride<unsigned> TrackingOutputBuffer::enterFunctionTypePrinting() {108return {FunctionPrintingDepth, FunctionPrintingDepth + 1};109}110111bool TrackingOutputBuffer::isPrintingTopLevelFunctionType() const {112return FunctionPrintingDepth == 1;113}114115void TrackingOutputBuffer::printLeft(const Node &N) {116switch (N.getKind()) {117case Node::KFunctionType:118printLeftImpl(static_cast<const FunctionType &>(N));119break;120case Node::KFunctionEncoding:121printLeftImpl(static_cast<const FunctionEncoding &>(N));122break;123case Node::KNestedName:124printLeftImpl(static_cast<const NestedName &>(N));125break;126case Node::KNameWithTemplateArgs:127printLeftImpl(static_cast<const NameWithTemplateArgs &>(N));128break;129default:130OutputBuffer::printLeft(N);131}132}133134void TrackingOutputBuffer::printRight(const Node &N) {135switch (N.getKind()) {136case Node::KFunctionType:137printRightImpl(static_cast<const FunctionType &>(N));138break;139case Node::KFunctionEncoding:140printRightImpl(static_cast<const FunctionEncoding &>(N));141break;142default:143OutputBuffer::printRight(N);144}145}146147void TrackingOutputBuffer::printLeftImpl(const FunctionType &N) {148auto Scoped = enterFunctionTypePrinting();149OutputBuffer::printLeft(N);150}151152void TrackingOutputBuffer::printRightImpl(const FunctionType &N) {153auto Scoped = enterFunctionTypePrinting();154OutputBuffer::printRight(N);155}156157void TrackingOutputBuffer::printLeftImpl(const FunctionEncoding &N) {158auto Scoped = enterFunctionTypePrinting();159160const Node *Ret = N.getReturnType();161if (Ret) {162printLeft(*Ret);163if (!Ret->hasRHSComponent(*this))164*this += " ";165}166167updateScopeStart();168169N.getName()->print(*this);170}171172void TrackingOutputBuffer::printRightImpl(const FunctionEncoding &N) {173auto Scoped = enterFunctionTypePrinting();174finalizeStart();175176printOpen();177N.getParams().printWithComma(*this);178printClose();179180finalizeArgumentEnd();181182const Node *Ret = N.getReturnType();183184if (Ret)185printRight(*Ret);186187finalizeQualifiersStart();188189auto CVQuals = N.getCVQuals();190auto RefQual = N.getRefQual();191auto *Attrs = N.getAttrs();192auto *Requires = N.getRequires();193194if (CVQuals & QualConst)195*this += " const";196if (CVQuals & QualVolatile)197*this += " volatile";198if (CVQuals & QualRestrict)199*this += " restrict";200if (RefQual == FrefQualLValue)201*this += " &";202else if (RefQual == FrefQualRValue)203*this += " &&";204if (Attrs != nullptr)205Attrs->print(*this);206if (Requires != nullptr) {207*this += " requires ";208Requires->print(*this);209}210211finalizeQualifiersEnd();212finalizeEnd();213}214215void TrackingOutputBuffer::printLeftImpl(const NestedName &N) {216N.Qual->print(*this);217*this += "::";218updateScopeEnd();219N.Name->print(*this);220updateBasenameEnd();221}222223void TrackingOutputBuffer::printLeftImpl(const NameWithTemplateArgs &N) {224N.Name->print(*this);225updateBasenameEnd();226N.TemplateArgs->print(*this);227}228229} // namespace lldb_private230231232