2012-10-02 09:12:39 +02:00
|
|
|
/****************************************************************************
|
2011-04-15 16:19:23 +02:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2011-04-15 16:19:23 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2011-04-15 16:19:23 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2016-01-15 14:57:40 +01:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2011-04-15 16:19:23 +02:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** GNU General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
2011-04-15 16:19:23 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2011-04-15 16:19:23 +02:00
|
|
|
|
2016-03-18 07:55:01 +01:00
|
|
|
#pragma once
|
2011-04-15 16:19:23 +02:00
|
|
|
|
2015-09-01 17:34:07 +02:00
|
|
|
#include "builtineditordocumentparser.h"
|
2015-01-16 10:48:09 +01:00
|
|
|
#include "cppcompletionassistprocessor.h"
|
2012-02-21 10:00:32 +01:00
|
|
|
#include "cppcompletionassistprovider.h"
|
2014-09-15 00:12:27 +02:00
|
|
|
#include "cppmodelmanager.h"
|
2014-07-30 16:29:02 +02:00
|
|
|
#include "cppworkingcopy.h"
|
2012-02-21 10:00:32 +01:00
|
|
|
|
2011-04-15 16:19:23 +02:00
|
|
|
#include <cplusplus/Icons.h>
|
2014-08-28 17:44:24 +02:00
|
|
|
#include <cplusplus/Symbol.h>
|
2011-04-15 16:19:23 +02:00
|
|
|
#include <cplusplus/TypeOfExpression.h>
|
|
|
|
|
|
2014-09-26 09:14:03 +02:00
|
|
|
#include <texteditor/texteditor.h>
|
2014-09-04 00:04:18 +02:00
|
|
|
#include <texteditor/codeassist/genericproposalmodel.h>
|
|
|
|
|
#include <texteditor/codeassist/assistinterface.h>
|
2011-04-15 16:19:23 +02:00
|
|
|
#include <texteditor/codeassist/iassistprocessor.h>
|
|
|
|
|
#include <texteditor/snippets/snippetassistcollector.h>
|
|
|
|
|
|
2014-02-17 19:23:20 +02:00
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QStringList>
|
|
|
|
|
#include <QVariant>
|
2011-04-15 16:19:23 +02:00
|
|
|
|
|
|
|
|
namespace CPlusPlus {
|
|
|
|
|
class LookupItem;
|
2015-11-19 13:49:26 +01:00
|
|
|
class ClassOrNamespace;
|
2011-04-15 16:19:23 +02:00
|
|
|
class Function;
|
|
|
|
|
class LookupContext;
|
2013-04-02 11:28:11 +02:00
|
|
|
} // namespace CPlusPlus
|
2011-04-15 16:19:23 +02:00
|
|
|
|
|
|
|
|
namespace CppTools {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
class CppCompletionAssistInterface;
|
2013-01-30 09:58:09 +01:00
|
|
|
|
2014-09-04 00:04:18 +02:00
|
|
|
class CppAssistProposalModel : public TextEditor::GenericProposalModel
|
2013-01-30 09:58:09 +01:00
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CppAssistProposalModel()
|
2014-09-04 00:04:18 +02:00
|
|
|
: TextEditor::GenericProposalModel()
|
2013-01-30 09:58:09 +01:00
|
|
|
, m_typeOfExpression(new CPlusPlus::TypeOfExpression)
|
|
|
|
|
{
|
|
|
|
|
m_typeOfExpression->setExpandTemplates(true);
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-03 15:32:42 +02:00
|
|
|
bool isSortable(const QString &prefix) const override;
|
2016-02-01 14:51:01 +01:00
|
|
|
TextEditor::AssistProposalItemInterface *proposalItem(int index) const override;
|
2013-01-30 09:58:09 +01:00
|
|
|
|
2019-01-14 01:40:53 +01:00
|
|
|
unsigned m_completionOperator = CPlusPlus::T_EOF_SYMBOL;
|
|
|
|
|
bool m_replaceDotForArrow = false;
|
2013-01-30 09:58:09 +01:00
|
|
|
QSharedPointer<CPlusPlus::TypeOfExpression> m_typeOfExpression;
|
|
|
|
|
};
|
2011-04-15 16:19:23 +02:00
|
|
|
|
2018-02-14 14:32:51 +01:00
|
|
|
using CppAssistProposalModelPtr = QSharedPointer<CppAssistProposalModel>;
|
|
|
|
|
|
2012-02-21 10:00:32 +01:00
|
|
|
class InternalCompletionAssistProvider : public CppCompletionAssistProvider
|
2011-04-15 16:19:23 +02:00
|
|
|
{
|
2012-02-21 10:00:32 +01:00
|
|
|
Q_OBJECT
|
|
|
|
|
|
2011-04-15 16:19:23 +02:00
|
|
|
public:
|
2015-06-03 15:32:42 +02:00
|
|
|
TextEditor::IAssistProcessor *createProcessor() const override;
|
2013-08-30 13:13:44 +02:00
|
|
|
|
2014-09-04 00:04:18 +02:00
|
|
|
TextEditor::AssistInterface *createAssistInterface(
|
2014-08-19 15:59:29 +02:00
|
|
|
const QString &filePath,
|
2015-05-08 15:48:17 +02:00
|
|
|
const TextEditor::TextEditorWidget *textEditorWidget,
|
2015-02-26 08:42:05 +02:00
|
|
|
const CPlusPlus::LanguageFeatures &languageFeatures,
|
2014-02-17 19:23:20 +02:00
|
|
|
int position,
|
2015-06-03 15:32:42 +02:00
|
|
|
TextEditor::AssistReason reason) const override;
|
2011-04-15 16:19:23 +02:00
|
|
|
};
|
|
|
|
|
|
2015-01-16 10:48:09 +01:00
|
|
|
class InternalCppCompletionAssistProcessor : public CppCompletionAssistProcessor
|
2011-04-15 16:19:23 +02:00
|
|
|
{
|
|
|
|
|
public:
|
2015-01-16 10:35:23 +01:00
|
|
|
InternalCppCompletionAssistProcessor();
|
2019-01-14 01:40:53 +01:00
|
|
|
~InternalCppCompletionAssistProcessor() override;
|
2011-04-15 16:19:23 +02:00
|
|
|
|
2015-06-03 15:32:42 +02:00
|
|
|
TextEditor::IAssistProposal *perform(const TextEditor::AssistInterface *interface) override;
|
2011-04-15 16:19:23 +02:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
TextEditor::IAssistProposal *createContentProposal();
|
|
|
|
|
TextEditor::IAssistProposal *createHintProposal(QList<CPlusPlus::Function *> symbols) const;
|
|
|
|
|
bool accepts() const;
|
|
|
|
|
|
2016-03-29 13:53:55 +02:00
|
|
|
int startOfOperator(int positionInDocument, unsigned *kind, bool wantFunctionCall) const;
|
2011-04-15 16:19:23 +02:00
|
|
|
int findStartOfName(int pos = -1) const;
|
|
|
|
|
int startCompletionHelper();
|
|
|
|
|
bool tryObjCCompletion();
|
|
|
|
|
bool objcKeywordsWanted() const;
|
2014-05-05 17:13:54 +03:00
|
|
|
int startCompletionInternal(const QString &fileName,
|
2018-11-02 14:17:12 +01:00
|
|
|
unsigned line, unsigned positionInBlock,
|
2011-04-15 16:19:23 +02:00
|
|
|
const QString &expression,
|
|
|
|
|
int endOfExpression);
|
|
|
|
|
|
2015-11-19 13:49:26 +01:00
|
|
|
void completeObjCMsgSend(CPlusPlus::ClassOrNamespace *binding, bool staticClassAccess);
|
2011-04-15 16:19:23 +02:00
|
|
|
bool completeInclude(const QTextCursor &cursor);
|
2011-05-18 12:28:53 +02:00
|
|
|
void completeInclude(const QString &realPath, const QStringList &suffixes);
|
2011-04-15 16:19:23 +02:00
|
|
|
void completePreprocessor();
|
|
|
|
|
bool completeConstructorOrFunction(const QList<CPlusPlus::LookupItem> &results,
|
|
|
|
|
int endOfExpression,
|
|
|
|
|
bool toolTipOnly);
|
|
|
|
|
bool completeMember(const QList<CPlusPlus::LookupItem> &results);
|
|
|
|
|
bool completeScope(const QList<CPlusPlus::LookupItem> &results);
|
2015-11-19 13:49:26 +01:00
|
|
|
void completeNamespace(CPlusPlus::ClassOrNamespace *binding);
|
|
|
|
|
void completeClass(CPlusPlus::ClassOrNamespace *b, bool staticLookup = true);
|
2013-11-24 21:02:26 +01:00
|
|
|
void addClassMembersToCompletion(CPlusPlus::Scope *scope, bool staticLookup);
|
2015-02-16 11:49:07 +01:00
|
|
|
enum CompleteQtMethodMode {
|
|
|
|
|
CompleteQt4Signals,
|
|
|
|
|
CompleteQt4Slots,
|
|
|
|
|
CompleteQt5Signals,
|
|
|
|
|
CompleteQt5Slots,
|
|
|
|
|
};
|
|
|
|
|
bool completeQtMethod(const QList<CPlusPlus::LookupItem> &results, CompleteQtMethodMode type);
|
2015-02-17 17:47:41 +01:00
|
|
|
bool completeQtMethodClassName(const QList<CPlusPlus::LookupItem> &results,
|
|
|
|
|
CPlusPlus::Scope *cursorScope);
|
|
|
|
|
bool globalCompletion(CPlusPlus::Scope *scope);
|
2011-04-15 16:19:23 +02:00
|
|
|
|
|
|
|
|
void addCompletionItem(const QString &text,
|
|
|
|
|
const QIcon &icon = QIcon(),
|
|
|
|
|
int order = 0,
|
|
|
|
|
const QVariant &data = QVariant());
|
2012-10-14 19:36:00 +02:00
|
|
|
void addCompletionItem(CPlusPlus::Symbol *symbol,
|
|
|
|
|
int order = 0);
|
2011-04-15 16:19:23 +02:00
|
|
|
void addKeywords();
|
|
|
|
|
void addMacros(const QString &fileName, const CPlusPlus::Snapshot &snapshot);
|
|
|
|
|
void addMacros_helper(const CPlusPlus::Snapshot &snapshot,
|
|
|
|
|
const QString &fileName,
|
|
|
|
|
QSet<QString> *processed,
|
|
|
|
|
QSet<QString> *definedMacros);
|
|
|
|
|
|
2015-02-16 11:49:07 +01:00
|
|
|
enum {
|
2015-02-17 17:47:41 +01:00
|
|
|
CompleteQt5SignalOrSlotClassNameTrigger = CPlusPlus::T_LAST_TOKEN + 1,
|
|
|
|
|
CompleteQt5SignalTrigger,
|
|
|
|
|
CompleteQt5SlotTrigger
|
2015-02-16 11:49:07 +01:00
|
|
|
};
|
2015-02-17 17:47:41 +01:00
|
|
|
|
2011-04-15 16:19:23 +02:00
|
|
|
QScopedPointer<const CppCompletionAssistInterface> m_interface;
|
2018-02-14 14:32:51 +01:00
|
|
|
CppAssistProposalModelPtr m_model;
|
2011-04-15 16:19:23 +02:00
|
|
|
};
|
|
|
|
|
|
2014-09-04 00:04:18 +02:00
|
|
|
class CppCompletionAssistInterface : public TextEditor::AssistInterface
|
2011-04-15 16:19:23 +02:00
|
|
|
{
|
|
|
|
|
public:
|
2014-08-19 15:59:29 +02:00
|
|
|
CppCompletionAssistInterface(const QString &filePath,
|
2015-05-08 15:48:17 +02:00
|
|
|
const TextEditor::TextEditorWidget *textEditorWidget,
|
2015-09-01 17:34:07 +02:00
|
|
|
BuiltinEditorDocumentParser::Ptr parser,
|
2015-02-26 08:42:05 +02:00
|
|
|
const CPlusPlus::LanguageFeatures &languageFeatures,
|
2014-02-18 12:59:57 -03:00
|
|
|
int position,
|
2014-04-10 11:13:37 -04:00
|
|
|
TextEditor::AssistReason reason,
|
2014-07-30 16:29:02 +02:00
|
|
|
const WorkingCopy &workingCopy)
|
2015-05-08 15:48:17 +02:00
|
|
|
: TextEditor::AssistInterface(textEditorWidget->document(), position, filePath, reason)
|
2015-09-01 17:34:07 +02:00
|
|
|
, m_parser(parser)
|
2014-02-18 12:59:57 -03:00
|
|
|
, m_gotCppSpecifics(false)
|
2014-04-10 11:13:37 -04:00
|
|
|
, m_workingCopy(workingCopy)
|
2015-02-26 08:42:05 +02:00
|
|
|
, m_languageFeatures(languageFeatures)
|
2014-02-18 12:59:57 -03:00
|
|
|
{}
|
|
|
|
|
|
2014-08-19 15:59:29 +02:00
|
|
|
CppCompletionAssistInterface(const QString &filePath,
|
|
|
|
|
QTextDocument *textDocument,
|
2011-04-15 16:19:23 +02:00
|
|
|
int position,
|
|
|
|
|
TextEditor::AssistReason reason,
|
|
|
|
|
const CPlusPlus::Snapshot &snapshot,
|
2018-09-03 16:10:43 +02:00
|
|
|
const ProjectExplorer::HeaderPaths &headerPaths,
|
2015-02-26 08:42:05 +02:00
|
|
|
const CPlusPlus::LanguageFeatures &features)
|
2014-09-04 00:04:18 +02:00
|
|
|
: TextEditor::AssistInterface(textDocument, position, filePath, reason)
|
2014-02-18 12:59:57 -03:00
|
|
|
, m_gotCppSpecifics(true)
|
2011-04-15 16:19:23 +02:00
|
|
|
, m_snapshot(snapshot)
|
2014-06-25 17:23:19 +02:00
|
|
|
, m_headerPaths(headerPaths)
|
2015-02-26 08:42:05 +02:00
|
|
|
, m_languageFeatures(features)
|
2011-04-15 16:19:23 +02:00
|
|
|
{}
|
|
|
|
|
|
2014-02-18 12:59:57 -03:00
|
|
|
const CPlusPlus::Snapshot &snapshot() const { getCppSpecifics(); return m_snapshot; }
|
2018-09-03 16:10:43 +02:00
|
|
|
const ProjectExplorer::HeaderPaths &headerPaths() const
|
2014-06-25 17:23:19 +02:00
|
|
|
{ getCppSpecifics(); return m_headerPaths; }
|
2015-02-26 08:42:05 +02:00
|
|
|
CPlusPlus::LanguageFeatures languageFeatures() const
|
|
|
|
|
{ getCppSpecifics(); return m_languageFeatures; }
|
2011-04-15 16:19:23 +02:00
|
|
|
|
|
|
|
|
private:
|
2014-02-18 12:59:57 -03:00
|
|
|
void getCppSpecifics() const;
|
|
|
|
|
|
2015-09-01 17:34:07 +02:00
|
|
|
BuiltinEditorDocumentParser::Ptr m_parser;
|
2014-02-18 12:59:57 -03:00
|
|
|
mutable bool m_gotCppSpecifics;
|
2014-07-30 16:29:02 +02:00
|
|
|
WorkingCopy m_workingCopy;
|
2014-02-18 12:59:57 -03:00
|
|
|
mutable CPlusPlus::Snapshot m_snapshot;
|
2018-09-03 16:10:43 +02:00
|
|
|
mutable ProjectExplorer::HeaderPaths m_headerPaths;
|
2015-02-26 08:42:05 +02:00
|
|
|
mutable CPlusPlus::LanguageFeatures m_languageFeatures;
|
2011-04-15 16:19:23 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // Internal
|
|
|
|
|
} // CppTools
|
|
|
|
|
|
|
|
|
|
Q_DECLARE_METATYPE(CPlusPlus::Symbol *)
|