--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/icheck/parser/src/plugins/cpptools/cppmodelmanager.h Wed Aug 25 15:49:42 2010 +0300
@@ -0,0 +1,324 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, 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.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CPPMODELMANAGER_H
+#define CPPMODELMANAGER_H
+
+#include <cpptools/cppmodelmanagerinterface.h>
+#ifndef ICHECK_BUILD
+# include <projectexplorer/project.h>
+#endif
+#include <cplusplus/CppDocument.h>
+#include <cplusplus/PreprocessorClient.h>
+#ifndef ICHECK_BUILD
+# include <texteditor/basetexteditor.h>
+#endif
+#include <cplusplus/PreprocessorEnvironment.h>
+#include <cplusplus/pp-engine.h>
+#ifdef ICHECK_BUILD
+# include "parsemanager.h"
+#else
+# include <QtCore/QHash>
+# include <QtCore/QFutureInterface>
+# include <QtCore/QFutureSynchronizer>
+# include <QtCore/QMutex>
+# include <QtCore/QTimer>
+# include <QtGui/QTextEdit> // for QTextEdit::ExtraSelection
+#endif
+
+namespace Core {
+class ICore;
+class IEditor;
+}
+
+namespace TextEditor {
+class ITextEditor;
+class BaseTextEditor;
+}
+
+namespace ProjectExplorer {
+class ProjectExplorerPlugin;
+}
+
+namespace CPlusPlus {
+ class ParseManager;
+}
+
+namespace CppTools {
+
+namespace Internal {
+
+class CppEditorSupport;
+class CppPreprocessor;
+class CppFindReferences;
+
+#ifndef ICHECK_BUILD
+class CppModelManager : public CppModelManagerInterface
+{
+ Q_OBJECT
+
+public:
+ CppModelManager(QObject *parent);
+ virtual ~CppModelManager();
+
+ virtual void updateSourceFiles(const QStringList &sourceFiles);
+ virtual WorkingCopy workingCopy() const;
+
+ virtual QList<ProjectInfo> projectInfos() const;
+ virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
+ virtual void updateProjectInfo(const ProjectInfo &pinfo);
+
+ virtual QStringList includesInPath(const QString &path) const;
+
+ virtual CPlusPlus::Snapshot snapshot() const;
+ virtual void GC();
+
+ QFuture<void> refreshSourceFiles(const QStringList &sourceFiles);
+
+ inline Core::ICore *core() const { return m_core; }
+
+ bool isCppEditor(Core::IEditor *editor) const; // ### private
+
+ CppEditorSupport *editorSupport(TextEditor::ITextEditor *editor) const
+ { return m_editorSupport.value(editor); }
+
+ void emitDocumentUpdated(CPlusPlus::Document::Ptr doc);
+
+ void stopEditorSelectionsUpdate()
+ { m_updateEditorSelectionsTimer->stop(); }
+
+ virtual void addEditorSupport(AbstractEditorSupport *editorSupport);
+ virtual void removeEditorSupport(AbstractEditorSupport *editorSupport);
+
+ virtual QList<int> references(CPlusPlus::Symbol *symbol,
+ CPlusPlus::Document::Ptr doc,
+ const CPlusPlus::Snapshot &snapshot);
+
+ virtual void findUsages(CPlusPlus::Symbol *symbol);
+ virtual void renameUsages(CPlusPlus::Symbol *symbol);
+
+ virtual void findMacroUsages(const CPlusPlus::Macro ¯o);
+
+ void setHeaderSuffixes(const QStringList &suffixes)
+ { m_headerSuffixes = suffixes; }
+
+Q_SIGNALS:
+ void projectPathChanged(const QString &projectPath);
+
+ void documentUpdated(CPlusPlus::Document::Ptr doc);
+ void aboutToRemoveFiles(const QStringList &files);
+
+public Q_SLOTS:
+ void editorOpened(Core::IEditor *editor);
+ void editorAboutToClose(Core::IEditor *editor);
+
+private Q_SLOTS:
+ // this should be executed in the GUI thread.
+ void onDocumentUpdated(CPlusPlus::Document::Ptr doc);
+ void onAboutToRemoveProject(ProjectExplorer::Project *project);
+ void onAboutToUnloadSession();
+ void onProjectAdded(ProjectExplorer::Project *project);
+ void postEditorUpdate();
+ void updateEditorSelections();
+
+private:
+ WorkingCopy buildWorkingCopyList();
+
+ QStringList projectFiles()
+ {
+ ensureUpdated();
+ return m_projectFiles;
+ }
+
+ QStringList includePaths()
+ {
+ ensureUpdated();
+ return m_includePaths;
+ }
+
+ QStringList frameworkPaths()
+ {
+ ensureUpdated();
+ return m_frameworkPaths;
+ }
+
+ QByteArray definedMacros()
+ {
+ ensureUpdated();
+ return m_definedMacros;
+ }
+
+ void ensureUpdated();
+ QStringList internalProjectFiles() const;
+ QStringList internalIncludePaths() const;
+ QStringList internalFrameworkPaths() const;
+ QByteArray internalDefinedMacros() const;
+
+ void setIncludesInPaths(const QMap<QString, QStringList> &includesInPaths);
+
+ static void updateIncludesInPaths(QFutureInterface<void> &future,
+ CppModelManager *manager,
+ QStringList paths,
+ QStringList frameworkPaths,
+ QStringList suffixes);
+
+ static void parse(QFutureInterface<void> &future,
+ CppPreprocessor *preproc,
+ QStringList files);
+
+private:
+ Core::ICore *m_core;
+ CPlusPlus::Snapshot m_snapshot;
+
+ // cache
+ bool m_dirty;
+ QStringList m_projectFiles;
+ QStringList m_includePaths;
+ QStringList m_frameworkPaths;
+ QByteArray m_definedMacros;
+
+ QMap<QString, QStringList> m_includesInPaths;
+ QStringList m_headerSuffixes;
+
+ // editor integration
+ QMap<TextEditor::ITextEditor *, CppEditorSupport *> m_editorSupport;
+
+ QSet<AbstractEditorSupport *> m_addtionalEditorSupport;
+
+ // project integration
+ QMap<ProjectExplorer::Project *, ProjectInfo> m_projects;
+
+ mutable QMutex mutex;
+ mutable QMutex protectSnapshot;
+
+ struct Editor {
+ Editor()
+ : revision(-1) {}
+ int revision;
+ QPointer<TextEditor::ITextEditor> textEditor;
+ QList<QTextEdit::ExtraSelection> selections;
+ QList<TextEditor::BaseTextEditor::BlockRange> ifdefedOutBlocks;
+ };
+
+ QList<Editor> m_todo;
+
+ QTimer *m_updateEditorSelectionsTimer;
+
+ QFutureSynchronizer<void> m_synchronizer;
+ unsigned m_revision;
+
+ CppFindReferences *m_findReferences;
+ bool m_indexerEnabled;
+};
+#endif
+
+using namespace CPlusPlus;
+class CppPreprocessor: public CPlusPlus::Client
+{
+public:
+#ifndef ICHECK_BUILD
+ CppPreprocessor(QPointer<CppModelManager> modelManager);
+#else
+ CppPreprocessor(QPointer<CPlusPlus::ParseManager> modelManager);
+#endif
+ virtual ~CppPreprocessor();
+
+ void setRevision(unsigned revision);
+ void setWorkingCopy(const CppModelManagerInterface::WorkingCopy &workingCopy);
+ void setIncludePaths(const QStringList &includePaths);
+ void setFrameworkPaths(const QStringList &frameworkPaths);
+ void setProjectFiles(const QStringList &files);
+ void setTodo(const QStringList &files);
+
+ void run(const QString &fileName);
+
+ void resetEnvironment();
+
+ const QSet<QString> &todo() const
+ { return m_todo; }
+
+public: // attributes
+ Snapshot snapshot;
+
+protected:
+ CPlusPlus::Document::Ptr switchDocument(CPlusPlus::Document::Ptr doc);
+
+ bool includeFile(const QString &absoluteFilePath, QString *result, unsigned *revision);
+ QString tryIncludeFile(QString &fileName, IncludeType type, unsigned *revision);
+
+ void mergeEnvironment(CPlusPlus::Document::Ptr doc);
+
+ virtual void macroAdded(const Macro ¯o);
+ virtual void passedMacroDefinitionCheck(unsigned offset, const Macro ¯o);
+ virtual void failedMacroDefinitionCheck(unsigned offset, const QByteArray &name);
+ virtual void startExpandingMacro(unsigned offset,
+ const Macro ¯o,
+ const QByteArray &originalText,
+ bool inCondition,
+ const QVector<MacroArgumentReference> &actuals);
+ virtual void stopExpandingMacro(unsigned offset, const Macro ¯o);
+ virtual void startSkippingBlocks(unsigned offset);
+ virtual void stopSkippingBlocks(unsigned offset);
+ virtual void sourceNeeded(QString &fileName, IncludeType type,
+ unsigned line);
+
+private:
+#ifndef ICHECK_BUILD
+ QPointer<CppModelManager> m_modelManager;
+#endif
+ Environment env;
+ Preprocessor preprocess;
+ QStringList m_includePaths;
+ QStringList m_systemIncludePaths;
+ CppModelManagerInterface::WorkingCopy m_workingCopy;
+ QStringList m_projectFiles;
+ QStringList m_frameworkPaths;
+ QSet<QString> m_included;
+ Document::Ptr m_currentDoc;
+ QSet<QString> m_todo;
+ QSet<QString> m_processed;
+ unsigned m_revision;
+};
+
+} // namespace Internal
+} // namespace CppTools
+
+#endif // CPPMODELMANAGER_H