From dbc3332b8e1442c0903e129586c08986ce752ff9 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Tue, 7 Feb 2012 15:09:08 +0100
Subject: [PATCH] C++: Moved completion/highlighting into the model manager.

This way the editor does not need to know all the details of
instantiating or maintaining classes for highlighting and/or completion,
it can just ask the model manager. The change also enables different
highlighting- or completion-engines without changes to the cppeditor.

Change-Id: I8000d9d9fe446b292defddb2295493cf77d0f14a
Reviewed-by: Leandro Melo <leandro.melo@nokia.com>
---
 src/libs/cplusplus/ModelManagerInterface.h    |  5 ++
 src/plugins/cppeditor/cppeditor.cpp           | 42 ++++------
 src/plugins/cppeditor/cppeditor.h             | 24 +++---
 src/plugins/cppeditor/cppeditor.pro           |  6 --
 .../cppeditor/cppfunctiondecldeflink.cpp      |  3 +-
 src/plugins/cppeditor/cppquickfixassistant.h  |  6 +-
 .../cppchecksymbols.cpp                       |  2 +-
 .../{cppeditor => cpptools}/cppchecksymbols.h |  8 +-
 src/plugins/cpptools/cppcompletionsupport.cpp | 72 +++++++++++++++++
 src/plugins/cpptools/cppcompletionsupport.h   | 77 +++++++++++++++++++
 .../cpptools/cpphighlightingsupport.cpp       | 52 +++++++++++++
 src/plugins/cpptools/cpphighlightingsupport.h | 62 +++++++++++++++
 .../cpplocalsymbols.cpp                       |  2 +-
 .../{cppeditor => cpptools}/cpplocalsymbols.h | 10 +--
 src/plugins/cpptools/cppmodelmanager.cpp      | 15 ++++
 src/plugins/cpptools/cppmodelmanager.h        |  4 +-
 .../cppsemanticinfo.cpp                       |  2 +-
 .../{cppeditor => cpptools}/cppsemanticinfo.h | 14 ++--
 src/plugins/cpptools/cpptools.pro             | 14 +++-
 .../cpptools/cpptoolseditorsupport.cpp        | 17 +++-
 src/plugins/cpptools/cpptoolseditorsupport.h  | 10 +++
 21 files changed, 376 insertions(+), 71 deletions(-)
 rename src/plugins/{cppeditor => cpptools}/cppchecksymbols.cpp (99%)
 rename src/plugins/{cppeditor => cpptools}/cppchecksymbols.h (95%)
 create mode 100644 src/plugins/cpptools/cppcompletionsupport.cpp
 create mode 100644 src/plugins/cpptools/cppcompletionsupport.h
 create mode 100644 src/plugins/cpptools/cpphighlightingsupport.cpp
 create mode 100644 src/plugins/cpptools/cpphighlightingsupport.h
 rename src/plugins/{cppeditor => cpptools}/cpplocalsymbols.cpp (99%)
 rename src/plugins/{cppeditor => cpptools}/cpplocalsymbols.h (93%)
 rename src/plugins/{cppeditor => cpptools}/cppsemanticinfo.cpp (97%)
 rename src/plugins/{cppeditor => cpptools}/cppsemanticinfo.h (93%)

diff --git a/src/libs/cplusplus/ModelManagerInterface.h b/src/libs/cplusplus/ModelManagerInterface.h
index 4397a82526d..564bbfae8c4 100644
--- a/src/libs/cplusplus/ModelManagerInterface.h
+++ b/src/libs/cplusplus/ModelManagerInterface.h
@@ -55,6 +55,8 @@ namespace ProjectExplorer {
 
 namespace CppTools {
     class AbstractEditorSupport;
+    class CppCompletionSupport;
+    class CppHighlightingSupport;
 }
 
 namespace CPlusPlus {
@@ -151,6 +153,9 @@ public:
     virtual QList<CPlusPlus::Document::DiagnosticMessage> extraDiagnostics(
             const QString &fileName, int key = AllExtraDiagnostics) const = 0;
 
+    virtual CppTools::CppCompletionSupport *completionSupport(Core::IEditor *editor) const = 0;
+    virtual CppTools::CppHighlightingSupport *highlightingSupport(Core::IEditor *editor) const = 0;
+
 Q_SIGNALS:
     void documentUpdated(CPlusPlus::Document::Ptr doc);
     void sourceFilesRefreshed(const QStringList &files);
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index cd2a7388871..9870716f0ba 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -34,8 +34,6 @@
 #include "cppeditorconstants.h"
 #include "cppplugin.h"
 #include "cpphighlighter.h"
-#include "cppchecksymbols.h"
-#include "cpplocalsymbols.h"
 #include "cppautocompleter.h"
 #include "cppquickfixassistant.h"
 
@@ -63,8 +61,11 @@
 
 #include <cpptools/cpptoolsplugin.h>
 #include <cpptools/cpptoolsconstants.h>
+#include <cpptools/cppchecksymbols.h>
 #include <cpptools/cppcodeformatter.h>
-#include <cpptools/cppcompletionassist.h>
+#include <cpptools/cppcompletionsupport.h>
+#include <cpptools/cpphighlightingsupport.h>
+#include <cpptools/cpplocalsymbols.h>
 #include <cpptools/cppqtstyleindenter.h>
 #include <cpptools/cppcodestylesettings.h>
 #include <cpptools/cpprefactoringchanges.h>
@@ -124,6 +125,7 @@ enum {
 };
 
 using namespace CPlusPlus;
+using namespace CppTools;
 using namespace CppEditor::Internal;
 
 namespace {
@@ -424,7 +426,7 @@ CPPEditorWidget::CPPEditorWidget(QWidget *parent)
     , m_commentsSettings(CppTools::CppToolsSettings::instance()->commentsSettings())
 {
     m_initialized = false;
-    qRegisterMetaType<CppEditor::Internal::SemanticInfo>("CppEditor::Internal::SemanticInfo");
+    qRegisterMetaType<SemanticInfo>("CppTools::SemanticInfo");
 
     m_semanticHighlighter = new SemanticHighlighter(this);
     m_semanticHighlighter->start();
@@ -552,8 +554,8 @@ void CPPEditorWidget::createToolBar(CPPEditor *editor)
     connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(updateUses()));
     connect(this, SIGNAL(textChanged()), this, SLOT(updateUses()));
 
-    connect(m_semanticHighlighter, SIGNAL(changed(CppEditor::Internal::SemanticInfo)),
-            this, SLOT(updateSemanticInfo(CppEditor::Internal::SemanticInfo)));
+    connect(m_semanticHighlighter, SIGNAL(changed(CppTools::SemanticInfo)),
+            this, SLOT(updateSemanticInfo(CppTools::SemanticInfo)));
 
     editor->insertExtraToolBarWidget(TextEditor::BaseTextEditor::Left, m_outlineCombo);
 }
@@ -1849,11 +1851,11 @@ void CPPEditorWidget::updateSemanticInfo(const SemanticInfo &semanticInfo)
 
         if (! semanticHighlighterDisabled && semanticInfo.doc) {
             if (Core::EditorManager::instance()->currentEditor() == editor()) {
-                LookupContext context(semanticInfo.doc, semanticInfo.snapshot);
-                CheckSymbols::Future f = CheckSymbols::go(semanticInfo.doc, context);
-                m_highlighter = f;
-                m_highlightRevision = semanticInfo.revision;
-                m_highlightWatcher.setFuture(m_highlighter);
+                if (CppTools::CppHighlightingSupport *hs = modelManager()->highlightingSupport(editor())) {
+                    m_highlighter = hs->highlightingFuture(semanticInfo.doc, semanticInfo.snapshot);
+                    m_highlightRevision = semanticInfo.revision;
+                    m_highlightWatcher.setFuture(m_highlighter);
+                }
             }
         }
 
@@ -2154,21 +2156,9 @@ TextEditor::IAssistInterface *CPPEditorWidget::createAssistInterface(
     TextEditor::AssistReason reason) const
 {
     if (kind == TextEditor::Completion) {
-        QStringList includePaths;
-        QStringList frameworkPaths;
-        if (ProjectExplorer::Project *project =
-                ProjectExplorer::ProjectExplorerPlugin::currentProject()) {
-            includePaths = m_modelManager->projectInfo(project).includePaths;
-            frameworkPaths = m_modelManager->projectInfo(project).frameworkPaths;
-        }
-        return new CppTools::Internal::CppCompletionAssistInterface(
-                    document(),
-                    position(),
-                    editor()->file(),
-                    reason,
-                    m_modelManager->snapshot(),
-                    includePaths,
-                    frameworkPaths);
+        if (CppTools::CppCompletionSupport *cs = m_modelManager->completionSupport(editor()))
+            return cs->createAssistInterface(ProjectExplorer::ProjectExplorerPlugin::currentProject(),
+                                             document(), position(), reason);
     } else if (kind == TextEditor::QuickFix) {
         if (!semanticInfo().doc || isOutdated())
             return 0;
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index 546d5ae1917..2f9b235e92e 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -34,7 +34,6 @@
 #define CPPEDITOR_H
 
 #include "cppeditorenums.h"
-#include "cppsemanticinfo.h"
 #include "cppfunctiondecldeflink.h"
 
 #include <cplusplus/ModelManagerInterface.h>
@@ -43,6 +42,7 @@
 #include <texteditor/basetexteditor.h>
 #include <texteditor/quickfix.h>
 #include <cpptools/commentssettings.h>
+#include <cpptools/cppsemanticinfo.h>
 
 #include <QtCore/QThread>
 #include <QtCore/QMutex>
@@ -124,12 +124,12 @@ public:
         }
     };
 
-    SemanticInfo semanticInfo(const Source &source);
+    CppTools::SemanticInfo semanticInfo(const Source &source);
 
     void rehighlight(const Source &source);
 
 Q_SIGNALS:
-    void changed(const CppEditor::Internal::SemanticInfo &semanticInfo);
+    void changed(const CppTools::SemanticInfo &semanticInfo);
 
 protected:
     virtual void run();
@@ -142,7 +142,7 @@ private:
     QWaitCondition m_condition;
     bool m_done;
     Source m_source;
-    SemanticInfo m_lastSemanticInfo;
+    CppTools::SemanticInfo m_lastSemanticInfo;
 };
 
 class CPPEditor : public TextEditor::BaseTextEditor
@@ -172,7 +172,7 @@ public:
 
     unsigned editorRevision() const;
     bool isOutdated() const;
-    SemanticInfo semanticInfo() const;
+    CppTools::SemanticInfo semanticInfo() const;
 
     CPlusPlus::OverviewModel *outlineModel() const;
     QModelIndex outlineModelIndex();
@@ -242,7 +242,7 @@ private Q_SLOTS:
     void onDocumentUpdated(CPlusPlus::Document::Ptr doc);
     void onContentsChanged(int position, int charsRemoved, int charsAdded);
 
-    void updateSemanticInfo(const CppEditor::Internal::SemanticInfo &semanticInfo);
+    void updateSemanticInfo(const CppTools::SemanticInfo &semanticInfo);
     void highlightSymbolUsages(int from, int to);
     void finishHighlightSymbolUsages();
 
@@ -255,7 +255,7 @@ private Q_SLOTS:
     void onCommentsSettingsChanged(const CppTools::CommentsSettings &settings);
 
 private:
-    void markSymbols(const QTextCursor &tc, const SemanticInfo &info);
+    void markSymbols(const QTextCursor &tc, const CppTools::SemanticInfo &info);
     bool sortedOutline() const;
     CPlusPlus::Symbol *findDefinition(CPlusPlus::Symbol *symbol, const CPlusPlus::Snapshot &snapshot) const;
 
@@ -264,8 +264,8 @@ private:
 
     SemanticHighlighter::Source currentSource(bool force = false);
 
-    void highlightUses(const QList<SemanticInfo::Use> &uses,
-                       const SemanticInfo &semanticInfo,
+    void highlightUses(const QList<TextEditor::SemanticHighlighter::Result> &uses,
+                       const CppTools::SemanticInfo &semanticInfo,
                        QList<QTextEdit::ExtraSelection> *selections);
 
     void createToolBar(CPPEditor *editable);
@@ -315,13 +315,13 @@ private:
     QTextCursor m_currentRenameSelectionEnd;
 
     SemanticHighlighter *m_semanticHighlighter;
-    SemanticInfo m_lastSemanticInfo;
+    CppTools::SemanticInfo m_lastSemanticInfo;
     QList<TextEditor::QuickFixOperation::Ptr> m_quickFixes;
     bool m_objcEnabled;
     bool m_initialized;
 
-    QFuture<SemanticInfo::Use> m_highlighter;
-    QFutureWatcher<SemanticInfo::Use> m_highlightWatcher;
+    QFuture<TextEditor::SemanticHighlighter::Result> m_highlighter;
+    QFutureWatcher<TextEditor::SemanticHighlighter::Result> m_highlightWatcher;
     unsigned m_highlightRevision; // the editor revision that requested the highlight
 
     QFuture<QList<int> > m_references;
diff --git a/src/plugins/cppeditor/cppeditor.pro b/src/plugins/cppeditor/cppeditor.pro
index d90fc0a0523..1178b5f70b3 100644
--- a/src/plugins/cppeditor/cppeditor.pro
+++ b/src/plugins/cppeditor/cppeditor.pro
@@ -14,11 +14,8 @@ HEADERS += cppplugin.h \
     cppeditorenums.h \
     cppeditor_global.h \
     cppclasswizard.h \
-    cppchecksymbols.h \
-    cppsemanticinfo.h \
     cppoutline.h \
     cppinsertdecldef.h \
-    cpplocalsymbols.h \
     cpptypehierarchy.h \
     cppelementevaluator.h \
     cppautocompleter.h \
@@ -36,11 +33,8 @@ SOURCES += cppplugin.cpp \
     cppfilewizard.cpp \
     cppclasswizard.cpp \
     cppquickfixes.cpp \
-    cppchecksymbols.cpp \
-    cppsemanticinfo.cpp \
     cppoutline.cpp \
     cppinsertdecldef.cpp \
-    cpplocalsymbols.cpp \
     cpptypehierarchy.cpp \
     cppelementevaluator.cpp \
     cppautocompleter.cpp \
diff --git a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp
index a39ba82bd0d..3c79791d36e 100644
--- a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp
+++ b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp
@@ -34,7 +34,6 @@
 
 #include "cppeditor.h"
 #include "cppquickfixassistant.h"
-#include "cpplocalsymbols.h"
 
 #include <cplusplus/CppRewriter.h>
 #include <cplusplus/ASTPath.h>
@@ -44,6 +43,7 @@
 #include <cplusplus/TranslationUnit.h>
 #include <cplusplus/LookupContext.h>
 #include <cplusplus/Overview.h>
+#include <cpptools/cpplocalsymbols.h>
 #include <cpptools/cpprefactoringchanges.h>
 #include <cpptools/symbolfinder.h>
 #include <texteditor/refactoroverlay.h>
@@ -61,6 +61,7 @@
 using namespace CPlusPlus;
 using namespace CppEditor;
 using namespace CppEditor::Internal;
+using namespace CppTools;
 
 FunctionDeclDefLinkFinder::FunctionDeclDefLinkFinder(QObject *parent)
     : QObject(parent)
diff --git a/src/plugins/cppeditor/cppquickfixassistant.h b/src/plugins/cppeditor/cppquickfixassistant.h
index 03bafe8b273..ca5bdd810ff 100644
--- a/src/plugins/cppeditor/cppquickfixassistant.h
+++ b/src/plugins/cppeditor/cppquickfixassistant.h
@@ -33,7 +33,7 @@
 #ifndef CPPQUICKFIXASSISTANT_H
 #define CPPQUICKFIXASSISTANT_H
 
-#include "cppsemanticinfo.h"
+#include <cpptools/cppsemanticinfo.h>
 
 #include <ASTfwd.h>
 #include <cplusplus/CppDocument.h>
@@ -59,7 +59,7 @@ public:
 
     const QList<CPlusPlus::AST *> &path() const;
     CPlusPlus::Snapshot snapshot() const;
-    CppEditor::Internal::SemanticInfo semanticInfo() const;
+    CppTools::SemanticInfo semanticInfo() const;
     const CPlusPlus::LookupContext &context() const;
     CPPEditorWidget *editor() const;
 
@@ -70,7 +70,7 @@ public:
 
 private:
     CPPEditorWidget *m_editor;
-    CppEditor::Internal::SemanticInfo m_semanticInfo;
+    CppTools::SemanticInfo m_semanticInfo;
     CPlusPlus::Snapshot m_snapshot;
     CppTools::CppRefactoringFilePtr m_currentFile;
     CPlusPlus::LookupContext m_context;
diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cpptools/cppchecksymbols.cpp
similarity index 99%
rename from src/plugins/cppeditor/cppchecksymbols.cpp
rename to src/plugins/cpptools/cppchecksymbols.cpp
index a5749445a53..d1bdb3c2814 100644
--- a/src/plugins/cppeditor/cppchecksymbols.cpp
+++ b/src/plugins/cpptools/cppchecksymbols.cpp
@@ -52,7 +52,7 @@
 #include <qtconcurrent/runextensions.h>
 
 using namespace CPlusPlus;
-using namespace CppEditor::Internal;
+using namespace CppTools;
 
 namespace {
 
diff --git a/src/plugins/cppeditor/cppchecksymbols.h b/src/plugins/cpptools/cppchecksymbols.h
similarity index 95%
rename from src/plugins/cppeditor/cppchecksymbols.h
rename to src/plugins/cpptools/cppchecksymbols.h
index 6bcf4933bdb..fb50fcfd52a 100644
--- a/src/plugins/cppeditor/cppchecksymbols.h
+++ b/src/plugins/cpptools/cppchecksymbols.h
@@ -39,6 +39,8 @@
 #include <cplusplus/LookupContext.h>
 #include <cplusplus/TypeOfExpression.h>
 
+#include <texteditor/semantichighlighter.h>
+
 #include <ASTVisitor.h>
 #include <QtCore/QSet>
 #include <QtCore/QFuture>
@@ -49,13 +51,13 @@ namespace CPlusPlus {
 class CheckSymbols:
         protected ASTVisitor,
         public QRunnable,
-        public QFutureInterface<CppEditor::Internal::SemanticInfo::Use>
+        public QFutureInterface<TextEditor::SemanticHighlighter::Result>
 {
 public:
     virtual ~CheckSymbols();
 
-    typedef CppEditor::Internal::SemanticInfo::Use Use;
-    typedef CppEditor::Internal::SemanticInfo::UseKind UseKind;
+    typedef TextEditor::SemanticHighlighter::Result Use;
+    typedef CppTools::SemanticInfo::UseKind UseKind;
 
     virtual void run();
 
diff --git a/src/plugins/cpptools/cppcompletionsupport.cpp b/src/plugins/cpptools/cppcompletionsupport.cpp
new file mode 100644
index 00000000000..9246708c11f
--- /dev/null
+++ b/src/plugins/cpptools/cppcompletionsupport.cpp
@@ -0,0 +1,72 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "cppcompletionassist.h"
+#include "cppcompletionsupport.h"
+#include "cppmodelmanager.h"
+#include "cpptoolseditorsupport.h"
+
+#include <coreplugin/ifile.h>
+#include <projectexplorer/project.h>
+#include <texteditor/codeassist/iassistinterface.h>
+
+using namespace CPlusPlus;
+using namespace CppTools;
+using namespace CppTools::Internal;
+
+CppCompletionSupport::CppCompletionSupport(CppEditorSupport *editorSupport)
+    : m_editorSupport(editorSupport)
+{
+    Q_ASSERT(editorSupport);
+}
+
+TextEditor::IAssistInterface *CppCompletionSupport::createAssistInterface(ProjectExplorer::Project *project,
+                                                                          QTextDocument *document,
+                                                                          int position,
+                                                                          TextEditor::AssistReason reason) const
+{
+    CppModelManagerInterface *modelManager = CppModelManagerInterface::instance();
+    QStringList includePaths;
+    QStringList frameworkPaths;
+    if (project) {
+        includePaths = modelManager->projectInfo(project).includePaths;
+        frameworkPaths = modelManager->projectInfo(project).frameworkPaths;
+    }
+    return new CppTools::Internal::CppCompletionAssistInterface(
+                document,
+                position,
+                m_editorSupport->textEditor()->file(),
+                reason,
+                modelManager->snapshot(),
+                includePaths,
+                frameworkPaths);
+}
diff --git a/src/plugins/cpptools/cppcompletionsupport.h b/src/plugins/cpptools/cppcompletionsupport.h
new file mode 100644
index 00000000000..0435c8a700d
--- /dev/null
+++ b/src/plugins/cpptools/cppcompletionsupport.h
@@ -0,0 +1,77 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef CPPTOOLS_CPPCOMPLETIONSUPPORT_H
+#define CPPTOOLS_CPPCOMPLETIONSUPPORT_H
+
+#include "cpptools_global.h"
+
+#include <texteditor/codeassist/assistenums.h>
+
+QT_BEGIN_NAMESPACE
+class QTextDocument;
+QT_END_NAMESPACE
+
+namespace Core {
+class IFile;
+}
+
+namespace ProjectExplorer {
+class Project;
+}
+
+namespace TextEditor {
+class IAssistInterface;
+}
+
+namespace CppTools {
+namespace Internal {
+class CppEditorSupport;
+}
+
+class CPPTOOLS_EXPORT CppCompletionSupport
+{
+public:
+    CppCompletionSupport(Internal::CppEditorSupport *editorSupport);
+
+    TextEditor::IAssistInterface *createAssistInterface(ProjectExplorer::Project *project,
+                                                        QTextDocument *document,
+                                                        int position,
+                                                        TextEditor::AssistReason reason) const;
+
+private:
+    Internal::CppEditorSupport *m_editorSupport;
+};
+
+} // namespace CppTools
+
+#endif // CPPTOOLS_CPPCOMPLETIONSUPPORT_H
diff --git a/src/plugins/cpptools/cpphighlightingsupport.cpp b/src/plugins/cpptools/cpphighlightingsupport.cpp
new file mode 100644
index 00000000000..6326b623044
--- /dev/null
+++ b/src/plugins/cpptools/cpphighlightingsupport.cpp
@@ -0,0 +1,52 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "cppchecksymbols.h"
+#include "cpphighlightingsupport.h"
+#include "cpptoolseditorsupport.h"
+
+#include <cplusplus/LookupContext.h>
+
+using namespace CPlusPlus;
+using namespace CppTools;
+using namespace CppTools::Internal;
+
+CppHighlightingSupport::CppHighlightingSupport()
+{
+}
+
+QFuture<CppHighlightingSupport::Use> CppHighlightingSupport::highlightingFuture(
+        const Document::Ptr &doc, const Snapshot &snapshot) const
+{
+    LookupContext context(doc, snapshot);
+    return CheckSymbols::go(doc, context);
+}
diff --git a/src/plugins/cpptools/cpphighlightingsupport.h b/src/plugins/cpptools/cpphighlightingsupport.h
new file mode 100644
index 00000000000..e5ef29d3a25
--- /dev/null
+++ b/src/plugins/cpptools/cpphighlightingsupport.h
@@ -0,0 +1,62 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef CPPTOOLS_CPPHIGHLIGHTINGSUPPORT_H
+#define CPPTOOLS_CPPHIGHLIGHTINGSUPPORT_H
+
+#include "cpptools_global.h"
+
+#include <cplusplus/CppDocument.h>
+#include <texteditor/semantichighlighter.h>
+
+#include <QtCore/QFuture>
+
+namespace CppTools {
+namespace Internal {
+class CppEditorSupport;
+}
+
+class CPPTOOLS_EXPORT CppHighlightingSupport
+{
+public:
+    typedef TextEditor::SemanticHighlighter::Result Use;
+
+public:
+    CppHighlightingSupport();
+
+    QFuture<Use> highlightingFuture(const CPlusPlus::Document::Ptr &doc,
+                                    const CPlusPlus::Snapshot &snapshot) const;
+};
+
+} // namespace CppTools
+
+#endif // CPPTOOLS_CPPHIGHLIGHTINGSUPPORT_H
diff --git a/src/plugins/cppeditor/cpplocalsymbols.cpp b/src/plugins/cpptools/cpplocalsymbols.cpp
similarity index 99%
rename from src/plugins/cppeditor/cpplocalsymbols.cpp
rename to src/plugins/cpptools/cpplocalsymbols.cpp
index b6880644335..fc4933ef171 100644
--- a/src/plugins/cppeditor/cpplocalsymbols.cpp
+++ b/src/plugins/cpptools/cpplocalsymbols.cpp
@@ -43,7 +43,7 @@
 #include <Literals.h>
 
 using namespace CPlusPlus;
-using namespace CppEditor::Internal;
+using namespace CppTools;
 
 namespace {
 
diff --git a/src/plugins/cppeditor/cpplocalsymbols.h b/src/plugins/cpptools/cpplocalsymbols.h
similarity index 93%
rename from src/plugins/cppeditor/cpplocalsymbols.h
rename to src/plugins/cpptools/cpplocalsymbols.h
index 670fcaaa248..c4325f6d9f4 100644
--- a/src/plugins/cppeditor/cpplocalsymbols.h
+++ b/src/plugins/cpptools/cpplocalsymbols.h
@@ -33,14 +33,15 @@
 #ifndef CPPLOCALSYMBOLS_H
 #define CPPLOCALSYMBOLS_H
 
+#include "cpptools_global.h"
 #include "cppsemanticinfo.h"
+
 #include <cplusplus/CppDocument.h>
 #include <ASTfwd.h>
 
-namespace CppEditor {
-namespace Internal {
+namespace CppTools {
 
-class LocalSymbols
+class CPPTOOLS_EXPORT LocalSymbols
 {
     Q_DISABLE_COPY(LocalSymbols)
 
@@ -52,7 +53,6 @@ public:
     SemanticInfo::LocalUseMap uses;
 };
 
-} // namespace Internal
-} // namespace CppEditor
+} // namespace CppTools
 
 #endif // CPPLOCALSYMBOLS_H
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 4000228aae1..7e82347594e 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -1308,6 +1308,21 @@ void CppModelManager::finishedRefreshingSourceFiles(const QStringList &files)
     emit sourceFilesRefreshed(files);
 }
 
+CppCompletionSupport *CppModelManager::completionSupport(Core::IEditor *editor) const
+{
+    if (CppEditorSupport *es = editorSupport(qobject_cast<TextEditor::ITextEditor *>(editor)))
+        return es->completionSupport();
+    else
+        return 0;
+}
+
+CppHighlightingSupport *CppModelManager::highlightingSupport(Core::IEditor *editor) const
+{
+    if (CppEditorSupport *es = editorSupport(qobject_cast<TextEditor::ITextEditor *>(editor)))
+        return es->highlightingSupport();
+    else
+        return 0;
+}
 
 void CppModelManager::setExtraDiagnostics(const QString &fileName, int kind,
                                           const QList<Document::DiagnosticMessage> &diagnostics)
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 6b8374524b3..e7d0675de11 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -131,9 +131,11 @@ public:
     virtual QList<CPlusPlus::Document::DiagnosticMessage> extraDiagnostics(
             const QString &fileName, int key = AllExtraDiagnostics) const;
 
-
     void finishedRefreshingSourceFiles(const QStringList &files);
 
+    virtual CppCompletionSupport *completionSupport(Core::IEditor *editor) const;
+    virtual CppHighlightingSupport *highlightingSupport(Core::IEditor *editor) const;
+
 Q_SIGNALS:
     void projectPathChanged(const QString &projectPath);
 
diff --git a/src/plugins/cppeditor/cppsemanticinfo.cpp b/src/plugins/cpptools/cppsemanticinfo.cpp
similarity index 97%
rename from src/plugins/cppeditor/cppsemanticinfo.cpp
rename to src/plugins/cpptools/cppsemanticinfo.cpp
index 14231028a92..761138459a5 100644
--- a/src/plugins/cppeditor/cppsemanticinfo.cpp
+++ b/src/plugins/cpptools/cppsemanticinfo.cpp
@@ -32,7 +32,7 @@
 
 #include "cppsemanticinfo.h"
 
-using namespace CppEditor::Internal;
+using namespace CppTools;
 
 SemanticInfo::SemanticInfo()
     : revision(0), hasQ(false), hasD(false), forced(false)
diff --git a/src/plugins/cppeditor/cppsemanticinfo.h b/src/plugins/cpptools/cppsemanticinfo.h
similarity index 93%
rename from src/plugins/cppeditor/cppsemanticinfo.h
rename to src/plugins/cpptools/cppsemanticinfo.h
index d177d4c5a64..915ffad1f55 100644
--- a/src/plugins/cppeditor/cppsemanticinfo.h
+++ b/src/plugins/cpptools/cppsemanticinfo.h
@@ -33,20 +33,18 @@
 #ifndef CPPSEMANTICINFO_H
 #define CPPSEMANTICINFO_H
 
+#include "cpptools_global.h"
+
 #include <cplusplus/CppDocument.h>
 #include <cplusplus/LookupContext.h>
 #include <texteditor/semantichighlighter.h>
 #include <QtCore/QHash>
 
-namespace CppEditor {
-namespace Internal {
-
-class CPPEditorWidget;
+namespace CppTools {
 
-class SemanticInfo
+class CPPTOOLS_EXPORT SemanticInfo
 {
 public:
-    typedef TextEditor::SemanticHighlighter::Result Use;
     enum UseKind {
         TypeUse = 0,
         LocalUse,
@@ -54,6 +52,7 @@ public:
         StaticUse,
         VirtualMethodUse
     };
+    typedef TextEditor::SemanticHighlighter::Result Use;
 
     typedef QHash<CPlusPlus::Symbol *, QList<Use> > LocalUseMap;
     typedef QHashIterator<CPlusPlus::Symbol *, QList<Use> > LocalUseIterator;
@@ -70,7 +69,6 @@ public:
     QList<Use> objcKeywords;
 };
 
-} // namespace Internal
-} // namespace CppEditor;
+} // namespace CppTools
 
 #endif // CPPSEMANTICINFO_H
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index 8bce1abd05d..e685f307b7b 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -38,7 +38,12 @@ HEADERS += completionsettingspage.h \
     cpptoolsreuse.h \
     doxygengenerator.h \
     commentssettings.h \
-    symbolfinder.h
+    symbolfinder.h \
+    cppcompletionsupport.h \
+    cpphighlightingsupport.h \
+    cppchecksymbols.h \
+    cpplocalsymbols.h \
+    cppsemanticinfo.h
 
 SOURCES += completionsettingspage.cpp \
     cppclassesfilter.cpp \
@@ -68,7 +73,12 @@ SOURCES += completionsettingspage.cpp \
     cpptoolsreuse.cpp \
     doxygengenerator.cpp \
     commentssettings.cpp \
-    symbolfinder.cpp
+    symbolfinder.cpp \
+    cppcompletionsupport.cpp \
+    cpphighlightingsupport.cpp \
+    cppchecksymbols.cpp \
+    cpplocalsymbols.cpp \
+    cppsemanticinfo.cpp
 
 FORMS += completionsettingspage.ui \
     cppfilesettingspage.ui \
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp
index ee69b4fabfe..3f3c3c8a50c 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.cpp
+++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp
@@ -30,6 +30,8 @@
 **
 **************************************************************************/
 
+#include "cppcompletionsupport.h"
+#include "cpphighlightingsupport.h"
 #include "cpptoolseditorsupport.h"
 #include "cppmodelmanager.h"
 
@@ -44,13 +46,16 @@
 
 #include <QtCore/QTimer>
 
+using namespace CppTools;
 using namespace CppTools::Internal;
 using namespace CPlusPlus;
 
 CppEditorSupport::CppEditorSupport(CppModelManager *modelManager)
     : QObject(modelManager),
       _modelManager(modelManager),
-      _updateDocumentInterval(UPDATE_DOCUMENT_DEFAULT_INTERVAL)
+      _updateDocumentInterval(UPDATE_DOCUMENT_DEFAULT_INTERVAL),
+      m_completionSupport(new CppCompletionSupport(this)),
+      m_highlightingSupport(new CppHighlightingSupport)
 {
     _revision = 0;
 
@@ -98,6 +103,16 @@ unsigned CppEditorSupport::editorRevision() const
     return 0;
 }
 
+CppTools::CppCompletionSupport *CppEditorSupport::completionSupport() const
+{
+    return m_completionSupport.data();
+}
+
+CppHighlightingSupport *CppEditorSupport::highlightingSupport() const
+{
+    return m_highlightingSupport.data();
+}
+
 int CppEditorSupport::updateDocumentInterval() const
 { return _updateDocumentInterval; }
 
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.h b/src/plugins/cpptools/cpptoolseditorsupport.h
index 2c2199d00fb..353dd7bdcd3 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.h
+++ b/src/plugins/cpptools/cpptoolseditorsupport.h
@@ -36,6 +36,7 @@
 #include <QtCore/QObject>
 #include <QtCore/QPointer>
 #include <QtCore/QFuture>
+#include <QtCore/QScopedPointer>
 #include <QtCore/QSharedPointer>
 
 #include <QtGui/QTextCursor>
@@ -56,6 +57,10 @@ namespace TextEditor {
 } // namespace TextEditor
 
 namespace CppTools {
+
+class CppCompletionSupport;
+class CppHighlightingSupport;
+
 namespace Internal {
 
 class CppModelManager;
@@ -77,6 +82,9 @@ public:
     QString contents();
     unsigned editorRevision() const;
 
+    CppCompletionSupport *completionSupport() const;
+    CppHighlightingSupport *highlightingSupport() const;
+
 Q_SIGNALS:
     void contentsChanged();
 
@@ -94,6 +102,8 @@ private:
     QFuture<void> _documentParser;
     QString _cachedContents;
     unsigned _revision;
+    QScopedPointer<CppCompletionSupport> m_completionSupport;
+    QScopedPointer<CppHighlightingSupport> m_highlightingSupport;
 };
 
 } // namespace Internal
-- 
GitLab