File indexing completed on 2024-05-12 04:39:08

0001 /*
0002     SPDX-FileCopyrightText: 2014 Milian Wolff <mail@milianw.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #ifndef CLANGCODECOMPLETIONCONTEXT_H
0008 #define CLANGCODECOMPLETIONCONTEXT_H
0009 
0010 #include "duchain/parsesession.h"
0011 
0012 #include <language/codecompletion/codecompletioncontext.h>
0013 
0014 #include <clang-c/Index.h>
0015 
0016 #include <memory>
0017 
0018 #include "completionhelper.h"
0019 #include "clangprivateexport.h"
0020 
0021 class KDEVCLANGPRIVATE_EXPORT ClangCodeCompletionContext : public KDevelop::CodeCompletionContext
0022 {
0023 public:
0024     enum ContextFilter
0025     {
0026         NoFilter        = 0,        ///< Show everything
0027         NoBuiltins      = 1 << 0,   ///< Hide builtin completion items
0028         NoMacros        = 1 << 1,   ///< Hide macro completion items
0029         NoDeclarations  = 1 << 2,   ///< Hide declaration completion items
0030         NoClangCompletion = NoBuiltins | NoMacros | NoDeclarations
0031     };
0032     Q_DECLARE_FLAGS(ContextFilters, ContextFilter)
0033 
0034     ClangCodeCompletionContext(const KDevelop::DUContextPointer& context,
0035                                const ParseSessionData::Ptr& sessionData,
0036                                const QUrl& url,
0037                                const KTextEditor::Cursor& position,
0038                                const QString& text,
0039                                const QString& followingText = {});
0040     ~ClangCodeCompletionContext() override;
0041 
0042     QList<KDevelop::CompletionTreeItemPointer> completionItems(bool& abort, bool fullCompletion = true) override;
0043 
0044     QList<KDevelop::CompletionTreeElementPointer> ungroupedElements() override;
0045 
0046     ContextFilters filters() const;
0047     void setFilters(const ContextFilters& filters);
0048 
0049 private:
0050     void addOverwritableItems();
0051     void addImplementationHelperItems();
0052 
0053     /// Creates the group named @p name and adds it to m_ungrouped if items @p items is not empty
0054     void eventuallyAddGroup(const QString& name, int priority, const QList<KDevelop::CompletionTreeItemPointer>& items);
0055 
0056     /// Returns whether the we are at a valid completion-position
0057     bool isValidPosition(CXTranslationUnit unit, CXFile file) const;
0058 
0059     std::unique_ptr<CXCodeCompleteResults, void(*)(CXCodeCompleteResults*)> m_results;
0060     QList<KDevelop::CompletionTreeElementPointer> m_ungrouped;
0061     CompletionHelper m_completionHelper;
0062     ParseSessionData::Ptr m_parseSessionData;
0063     ContextFilters m_filters = NoFilter;
0064 };
0065 
0066 #endif // CLANGCODECOMPLETIONCONTEXT_H