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"