diff --git a/src/plugins/clangcodemodel/clangcompletion.cpp b/src/plugins/clangcodemodel/clangcompletion.cpp index 7d0e53b3ce0f4a892df77d938cb386a45adaafe4..797d4acc1b27ace213ee775ebf496f0000ec8e84 100644 --- a/src/plugins/clangcodemodel/clangcompletion.cpp +++ b/src/plugins/clangcodemodel/clangcompletion.cpp @@ -200,15 +200,14 @@ IAssistProcessor *ClangCompletionAssistProvider::createProcessor() const } AssistInterface *ClangCompletionAssistProvider::createAssistInterface( - const QString &filePath, - QTextDocument *document, bool isObjCEnabled, int position, AssistReason reason) const + const QString &filePath, QTextDocument *document, + const LanguageFeatures &languageFeatures, int position, AssistReason reason) const { - Q_UNUSED(isObjCEnabled); - CppModelManager *modelManager = CppModelManager::instance(); QList parts = modelManager->projectPart(filePath); if (parts.isEmpty()) parts += modelManager->fallbackProjectPart(); + LanguageFeatures features = languageFeatures; ProjectPart::HeaderPaths headerPaths; QStringList options; PchInfo::Ptr pchInfo; @@ -220,13 +219,14 @@ AssistInterface *ClangCompletionAssistProvider::createAssistInterface( if (!pchInfo.isNull()) options.append(Utils::createPCHInclusionOptions(pchInfo->fileName())); headerPaths = part->headerPaths; + features = part->languageFeatures; break; } return new ClangCompletionAssistInterface( m_clangCompletionWrapper, document, position, filePath, reason, - options, headerPaths, pchInfo); + options, headerPaths, pchInfo, features); } // ------------------------ @@ -545,12 +545,14 @@ ClangCompletionAssistInterface::ClangCompletionAssistInterface(ClangCompleter::P AssistReason reason, const QStringList &options, const QList &headerPaths, - const PchInfo::Ptr &pchInfo) + const PchInfo::Ptr &pchInfo, + const LanguageFeatures &features) : AssistInterface(document, position, fileName, reason) , m_clangWrapper(clangWrapper) , m_options(options) , m_headerPaths(headerPaths) , m_savedPchPointer(pchInfo) + , m_languageFeatures(features) { Q_ASSERT(!clangWrapper.isNull()); @@ -711,10 +713,7 @@ int ClangCompletionAssistProcessor::startOfOperator(int pos, } SimpleLexer tokenize; - LanguageFeatures lf = tokenize.languageFeatures(); - lf.qtMocRunEnabled = true; - lf.objCEnabled = true; - tokenize.setLanguageFeatures(lf); + tokenize.setLanguageFeatures(m_interface->languageFeatures()); tokenize.setSkipComments(false); const Tokens &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); const int tokenIdx = SimpleLexer::tokenBefore(tokens, qMax(0, tc.positionInBlock() - 1)); // get the token at the left of the cursor diff --git a/src/plugins/clangcodemodel/clangcompletion.h b/src/plugins/clangcodemodel/clangcompletion.h index 65274ff19aeded711514e8e226903fdae6ae72bb..0a944a08abda53da0d81106e375c3725a1338802 100644 --- a/src/plugins/clangcodemodel/clangcompletion.h +++ b/src/plugins/clangcodemodel/clangcompletion.h @@ -58,9 +58,9 @@ public: virtual TextEditor::IAssistProcessor *createProcessor() const; virtual TextEditor::AssistInterface *createAssistInterface( - const QString &filePath, - QTextDocument *document, bool isObjCEnabled, int position, - TextEditor::AssistReason reason) const; + const QString &filePath, QTextDocument *document, + const CPlusPlus::LanguageFeatures &languageFeatures, + int position, TextEditor::AssistReason reason) const; private: ClangCodeModel::ClangCompleter::Ptr m_clangCompletionWrapper; @@ -78,7 +78,8 @@ public: TextEditor::AssistReason reason, const QStringList &options, const QList &headerPaths, - const Internal::PchInfo::Ptr &pchInfo); + const Internal::PchInfo::Ptr &pchInfo, + const CPlusPlus::LanguageFeatures &features); ClangCodeModel::ClangCompleter::Ptr clangWrapper() const { return m_clangWrapper; } @@ -94,12 +95,16 @@ public: const QList &headerPaths() const { return m_headerPaths; } + CPlusPlus::LanguageFeatures languageFeatures() const + { return m_languageFeatures; } + private: ClangCodeModel::ClangCompleter::Ptr m_clangWrapper; ClangCodeModel::Internal::UnsavedFiles m_unsavedFiles; QStringList m_options; QList m_headerPaths; Internal::PchInfo::Ptr m_savedPchPointer; + CPlusPlus::LanguageFeatures m_languageFeatures; }; class CLANG_EXPORT ClangCompletionAssistProcessor : public CppTools::CppCompletionAssistProcessor diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index f3be75c32a71a32224374d579a4406ad34b81df1..c88e42135869be6cc912f593675f35e648f1d02a 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -612,10 +612,14 @@ AssistInterface *CppEditorWidget::createAssistInterface(AssistKind kind, AssistR if (kind == Completion) { if (CppCompletionAssistProvider *cap = qobject_cast(cppEditorDocument()->completionAssistProvider())) { + LanguageFeatures features = LanguageFeatures::defaultFeatures(); + if (Document::Ptr doc = d->m_lastSemanticInfo.doc) + features = doc->languageFeatures(); + features.objCEnabled = cppEditorDocument()->isObjCEnabled(); return cap->createAssistInterface( textDocument()->filePath().toString(), document(), - cppEditorDocument()->isObjCEnabled(), + features, position(), reason); } diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 083cbd58130966fe9bf80d39bd42b91b0ccd119d..fe82a7a19630154aa2ca01028314705bb5ac986f 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -105,11 +105,14 @@ public: QStringList getCompletions(bool *replaceAccessOperator = 0) const { QStringList completions; + LanguageFeatures languageFeatures = LanguageFeatures::defaultFeatures(); + languageFeatures.objCEnabled = false; CppCompletionAssistInterface *ai = new CppCompletionAssistInterface(m_editorWidget->textDocument()->filePath().toString(), m_editorWidget->document(), m_position, ExplicitlyInvoked, m_snapshot, - ProjectPart::HeaderPaths()); + ProjectPart::HeaderPaths(), + languageFeatures); InternalCppCompletionAssistProcessor processor; const Tests::IAssistProposalScopedPointer proposal(processor.perform(ai)); diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index acdb6b04168924474aef7f5b97920340c716b15d..71294d0a0d45749562c4606fee020965e0842560 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -419,12 +419,12 @@ IAssistProcessor *InternalCompletionAssistProvider::createProcessor() const AssistInterface *InternalCompletionAssistProvider::createAssistInterface( const QString &filePath, QTextDocument *document, - bool isObjCEnabled, int position, AssistReason reason) const + const LanguageFeatures &languageFeatures, int position, AssistReason reason) const { QTC_ASSERT(document, return 0); CppModelManager *modelManager = CppModelManager::instance(); - return new CppCompletionAssistInterface(filePath, document, isObjCEnabled, position, reason, + return new CppCompletionAssistInterface(filePath, document, languageFeatures, position, reason, modelManager->workingCopy()); } @@ -803,11 +803,6 @@ const Name *minimalName(Symbol *symbol, Scope *targetScope, const LookupContext InternalCppCompletionAssistProcessor::InternalCppCompletionAssistProcessor() : m_model(new CppAssistProposalModel) { - // FIXME: C++11? - m_languageFeatures.objCEnabled = true; - m_languageFeatures.qtEnabled = true; - m_languageFeatures.qtKeywordsEnabled = true; - m_languageFeatures.qtMocRunEnabled = true; } InternalCppCompletionAssistProcessor::~InternalCppCompletionAssistProcessor() @@ -858,14 +853,8 @@ bool InternalCppCompletionAssistProcessor::accepts() const QTextCursor tc(m_interface->textDocument()); tc.setPosition(pos); - LanguageFeatures features; - features.qtEnabled = true; - features.qtMocRunEnabled = true; - features.qtKeywordsEnabled = true; - features.objCEnabled = true; - SimpleLexer tokenize; - tokenize.setLanguageFeatures(features); + tokenize.setLanguageFeatures(m_interface->languageFeatures()); tokenize.setSkipComments(false); const Tokens &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); @@ -885,7 +874,7 @@ bool InternalCppCompletionAssistProcessor::accepts() const idToken.utf16charsEnd() - idToken.utf16charsBegin()); if (identifier == QLatin1String("include") || identifier == QLatin1String("include_next") - || (m_languageFeatures.objCEnabled && identifier == QLatin1String("import"))) { + || (m_interface->languageFeatures().objCEnabled && identifier == QLatin1String("import"))) { return true; } } @@ -970,7 +959,7 @@ int InternalCppCompletionAssistProcessor::startOfOperator(int pos, } SimpleLexer tokenize; - tokenize.setLanguageFeatures(m_languageFeatures); + tokenize.setLanguageFeatures(m_interface->languageFeatures()); tokenize.setSkipComments(false); const Tokens &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); const int tokenIdx = SimpleLexer::tokenBefore(tokens, qMax(0, tc.positionInBlock() - 1)); // get the token at the left of the cursor @@ -1066,7 +1055,7 @@ int InternalCppCompletionAssistProcessor::findStartOfName(int pos) const int InternalCppCompletionAssistProcessor::startCompletionHelper() { - if (m_languageFeatures.objCEnabled) { + if (m_interface->languageFeatures().objCEnabled) { if (tryObjCCompletion()) return m_startPosition; } @@ -1387,7 +1376,7 @@ void InternalCppCompletionAssistProcessor::completePreprocessor() bool InternalCppCompletionAssistProcessor::objcKeywordsWanted() const { - if (!m_languageFeatures.objCEnabled) + if (!m_interface->languageFeatures().objCEnabled) return false; const QString fileName = m_interface->fileName(); @@ -1618,7 +1607,7 @@ bool InternalCppCompletionAssistProcessor::completeMember(const QListisObjCEnabled()) + if (!m_interface->languageFeatures().objCEnabled) replaceDotForArrow = &m_model->m_replaceDotForArrow; if (ClassOrNamespace *binding = @@ -2181,5 +2170,9 @@ void CppCompletionAssistInterface::getCppSpecifics() const parser->update(m_workingCopy); m_snapshot = parser->snapshot(); m_headerPaths = parser->headerPaths(); + if (Document::Ptr document = parser->document()) + m_languageFeatures = document->languageFeatures(); + else + m_languageFeatures = LanguageFeatures::defaultFeatures(); } } diff --git a/src/plugins/cpptools/cppcompletionassist.h b/src/plugins/cpptools/cppcompletionassist.h index 0b009e07ea89087ec4f6108d2bba14cb8a1f73e5..585d66eb0cf49fbcaf98bbd42bb148ef0e84103f 100644 --- a/src/plugins/cpptools/cppcompletionassist.h +++ b/src/plugins/cpptools/cppcompletionassist.h @@ -92,7 +92,7 @@ public: TextEditor::AssistInterface *createAssistInterface( const QString &filePath, QTextDocument *document, - bool isObjCEnabled, + const CPlusPlus::LanguageFeatures &languageFeatures, int position, TextEditor::AssistReason reason) const Q_DECL_OVERRIDE; }; @@ -162,7 +162,6 @@ private: CompleteQt5SlotTrigger }; - CPlusPlus::LanguageFeatures m_languageFeatures; QScopedPointer m_interface; QScopedPointer m_model; }; @@ -172,14 +171,14 @@ class CppCompletionAssistInterface : public TextEditor::AssistInterface public: CppCompletionAssistInterface(const QString &filePath, QTextDocument *textDocument, - bool isObjCEnabled, + const CPlusPlus::LanguageFeatures &languageFeatures, int position, TextEditor::AssistReason reason, const WorkingCopy &workingCopy) : TextEditor::AssistInterface(textDocument, position, filePath, reason) - , m_isObjCEnabled(isObjCEnabled) , m_gotCppSpecifics(false) , m_workingCopy(workingCopy) + , m_languageFeatures(languageFeatures) {} CppCompletionAssistInterface(const QString &filePath, @@ -187,28 +186,29 @@ public: int position, TextEditor::AssistReason reason, const CPlusPlus::Snapshot &snapshot, - const ProjectPart::HeaderPaths &headerPaths) + const ProjectPart::HeaderPaths &headerPaths, + const CPlusPlus::LanguageFeatures &features) : TextEditor::AssistInterface(textDocument, position, filePath, reason) - , m_isObjCEnabled(false) , m_gotCppSpecifics(true) , m_snapshot(snapshot) , m_headerPaths(headerPaths) + , m_languageFeatures(features) {} - bool isObjCEnabled() const { return m_isObjCEnabled; } - const CPlusPlus::Snapshot &snapshot() const { getCppSpecifics(); return m_snapshot; } const ProjectPart::HeaderPaths &headerPaths() const { getCppSpecifics(); return m_headerPaths; } + CPlusPlus::LanguageFeatures languageFeatures() const + { getCppSpecifics(); return m_languageFeatures; } private: void getCppSpecifics() const; - mutable bool m_isObjCEnabled; mutable bool m_gotCppSpecifics; WorkingCopy m_workingCopy; mutable CPlusPlus::Snapshot m_snapshot; mutable ProjectPart::HeaderPaths m_headerPaths; + mutable CPlusPlus::LanguageFeatures m_languageFeatures; }; } // Internal diff --git a/src/plugins/cpptools/cppcompletionassistprovider.h b/src/plugins/cpptools/cppcompletionassistprovider.h index fbc86bf2c10ad02f5fbc877369ecea3ce4b75ec3..34bc2ae97477550843053c7fd37ae3e58f3a8b23 100644 --- a/src/plugins/cpptools/cppcompletionassistprovider.h +++ b/src/plugins/cpptools/cppcompletionassistprovider.h @@ -36,6 +36,7 @@ #include #include +#include QT_BEGIN_NAMESPACE class QTextDocument; @@ -60,7 +61,9 @@ public: virtual TextEditor::AssistInterface *createAssistInterface( const QString &filePath, - QTextDocument *document, bool isObjCEnabled, int position, + QTextDocument *document, + const CPlusPlus::LanguageFeatures &languageFeatures, + int position, TextEditor::AssistReason reason) const = 0; static int activationSequenceChar(const QChar &ch, const QChar &ch2,