File indexing completed on 2024-05-12 04:39:13
0001 /* 0002 SPDX-FileCopyrightText: 2014 Milian Wolff <mail@milianw.de> 0003 SPDX-FileCopyrightText: 2014 Kevin Funk <kfunk@kde.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #include "navigationwidget.h" 0009 0010 #include "macronavigationcontext.h" 0011 #include "types/classspecializationtype.h" 0012 0013 #include <language/duchain/navigation/abstractdeclarationnavigationcontext.h> 0014 #include <language/duchain/navigation/abstractincludenavigationcontext.h> 0015 #include <language/util/includeitem.h> 0016 0017 using namespace KDevelop; 0018 0019 class DeclarationNavigationContext : public AbstractDeclarationNavigationContext 0020 { 0021 Q_OBJECT 0022 public: 0023 using AbstractDeclarationNavigationContext::AbstractDeclarationNavigationContext; 0024 0025 void htmlIdentifiedType(AbstractType::Ptr type, const IdentifiedType* idType) override 0026 { 0027 AbstractDeclarationNavigationContext::htmlIdentifiedType(type, idType); 0028 0029 if (auto cst = dynamic_cast<const ClassSpecializationType*>(type.data())) { 0030 modifyHtml() += QStringLiteral("< ").toHtmlEscaped(); 0031 0032 bool first = true; 0033 const auto& templateParameters = cst->templateParameters(); 0034 for (const auto& type : templateParameters) { 0035 if (first) { 0036 first = false; 0037 } else { 0038 modifyHtml() += QStringLiteral(", "); 0039 } 0040 0041 eventuallyMakeTypeLinks(type.abstractType()); 0042 } 0043 0044 modifyHtml() += QStringLiteral(" >").toHtmlEscaped(); 0045 } 0046 } 0047 }; 0048 0049 class IncludeNavigationContext : public KDevelop::AbstractIncludeNavigationContext 0050 { 0051 Q_OBJECT 0052 public: 0053 IncludeNavigationContext(const KDevelop::IncludeItem& item, const KDevelop::TopDUContextPointer& topContext); 0054 0055 protected: 0056 bool filterDeclaration(KDevelop::Declaration* decl) override; 0057 }; 0058 0059 IncludeNavigationContext::IncludeNavigationContext(const IncludeItem& item, const KDevelop::TopDUContextPointer& topContext) 0060 : AbstractIncludeNavigationContext(item, topContext, StandardParsingEnvironment) 0061 {} 0062 0063 bool IncludeNavigationContext::filterDeclaration(Declaration* decl) 0064 { 0065 //filter out forward-declarations and macro-expansions without a range 0066 //And filter out declarations with reserved identifiers 0067 return !decl->qualifiedIdentifier().toString().isEmpty() && !decl->range().isEmpty() 0068 && !decl->isForwardDeclaration() && !decl->identifier().isReserved(); 0069 } 0070 0071 ClangNavigationWidget::ClangNavigationWidget(const DeclarationPointer& declaration, KDevelop::AbstractNavigationWidget::DisplayHints hints) 0072 : AbstractNavigationWidget() 0073 { 0074 setDisplayHints(hints); 0075 if (auto macro = declaration.dynamicCast<MacroDefinition>()) { 0076 initBrowser(200); 0077 0078 setContext(NavigationContextPointer(new MacroNavigationContext(macro))); 0079 } else { 0080 initBrowser(400); 0081 0082 setContext(NavigationContextPointer(new DeclarationNavigationContext(declaration, {}))); 0083 } 0084 } 0085 0086 ClangNavigationWidget::ClangNavigationWidget(const MacroDefinition::Ptr& macro, const KDevelop::DocumentCursor& expansionLocation, 0087 KDevelop::AbstractNavigationWidget::DisplayHints hints) 0088 : AbstractNavigationWidget() 0089 { 0090 setDisplayHints(hints); 0091 initBrowser(400); 0092 0093 setContext(NavigationContextPointer(new MacroNavigationContext(macro, expansionLocation))); 0094 } 0095 0096 ClangNavigationWidget::ClangNavigationWidget(const IncludeItem& includeItem, const KDevelop::TopDUContextPointer& topContext, 0097 KDevelop::AbstractNavigationWidget::DisplayHints hints) 0098 : AbstractNavigationWidget() 0099 { 0100 setDisplayHints(hints); 0101 initBrowser(200); 0102 0103 //The first context is registered so it is kept alive by the shared-pointer mechanism 0104 auto context = new IncludeNavigationContext(includeItem, topContext); 0105 setContext(NavigationContextPointer(context)); 0106 } 0107 0108 QString ClangNavigationWidget::shortDescription(const IncludeItem& includeItem) 0109 { 0110 IncludeNavigationContext ctx(includeItem, {}); 0111 return ctx.html(true); 0112 } 0113 0114 #include "navigationwidget.moc" 0115 #include "moc_navigationwidget.cpp"