diff -r 000000000000 -r 876b1a06bc25 tools/icheck/parser/src/plugins/cpptools/cppmodelmanager.h --- /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 +#ifndef ICHECK_BUILD +# include +#endif +#include +#include +#ifndef ICHECK_BUILD +# include +#endif +#include +#include +#ifdef ICHECK_BUILD +# include "parsemanager.h" +#else +# include +# include +# include +# include +# include +# include // 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 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 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 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 &includesInPaths); + + static void updateIncludesInPaths(QFutureInterface &future, + CppModelManager *manager, + QStringList paths, + QStringList frameworkPaths, + QStringList suffixes); + + static void parse(QFutureInterface &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 m_includesInPaths; + QStringList m_headerSuffixes; + + // editor integration + QMap m_editorSupport; + + QSet m_addtionalEditorSupport; + + // project integration + QMap m_projects; + + mutable QMutex mutex; + mutable QMutex protectSnapshot; + + struct Editor { + Editor() + : revision(-1) {} + int revision; + QPointer textEditor; + QList selections; + QList ifdefedOutBlocks; + }; + + QList m_todo; + + QTimer *m_updateEditorSelectionsTimer; + + QFutureSynchronizer 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 modelManager); +#else + CppPreprocessor(QPointer 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 &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 &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 m_modelManager; +#endif + Environment env; + Preprocessor preprocess; + QStringList m_includePaths; + QStringList m_systemIncludePaths; + CppModelManagerInterface::WorkingCopy m_workingCopy; + QStringList m_projectFiles; + QStringList m_frameworkPaths; + QSet m_included; + Document::Ptr m_currentDoc; + QSet m_todo; + QSet m_processed; + unsigned m_revision; +}; + +} // namespace Internal +} // namespace CppTools + +#endif // CPPMODELMANAGER_H