diff -r 000000000000 -r 876b1a06bc25 tools/icheck/parser/src/libs/cplusplus/CppDocument.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/icheck/parser/src/libs/cplusplus/CppDocument.h Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,396 @@ +/**************************************************************************** +** +** 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 CPPDOCUMENT_H +#define CPPDOCUMENT_H + +#include +#include "Macro.h" + +#include +#include +#include +#include + +namespace CPlusPlus { + +class Macro; +class MacroArgumentReference; +class NamespaceBinding; + +class CPLUSPLUS_EXPORT Document +{ + Document(const Document &other); + void operator =(const Document &other); + + Document(const QString &fileName); + +public: + typedef QSharedPointer Ptr; + +public: + ~Document(); + + unsigned revision() const; + void setRevision(unsigned revision); + + unsigned editorRevision() const; + void setEditorRevision(unsigned editorRevision); + + QDateTime lastModified() const; + void setLastModified(const QDateTime &lastModified); + + QString fileName() const; + + QStringList includedFiles() const; + void addIncludeFile(const QString &fileName, unsigned line); + + void appendMacro(const Macro ¯o); + void addMacroUse(const Macro ¯o, unsigned offset, unsigned length, + unsigned beginLine, const QVector &range, + bool inCondition); + void addUndefinedMacroUse(const QByteArray &name, unsigned offset); + + Control *control() const; + TranslationUnit *translationUnit() const; + + bool skipFunctionBody() const; + void setSkipFunctionBody(bool skipFunctionBody); + + unsigned globalSymbolCount() const; + Symbol *globalSymbolAt(unsigned index) const; + Scope *globalSymbols() const; // ### deprecate? + Namespace *globalNamespace() const; + + QList definedMacros() const + { return _definedMacros; } + + Symbol *findSymbolAt(unsigned line, unsigned column) const; + + QByteArray source() const; + void setSource(const QByteArray &source); + + void startSkippingBlocks(unsigned offset); + void stopSkippingBlocks(unsigned offset); + + enum ParseMode { // ### keep in sync with CPlusPlus::TranslationUnit + ParseTranlationUnit, + ParseDeclaration, + ParseExpression, + ParseDeclarator, + ParseStatement + }; + + bool isTokenized() const; + void tokenize(); + + bool isParsed() const; + bool parse(ParseMode mode = ParseTranlationUnit); + + enum CheckMode { + FullCheck, + FastCheck + }; + + void check(CheckMode mode = FullCheck); + + void releaseSource(); + void releaseTranslationUnit(); + + static Ptr create(const QString &fileName); + + class DiagnosticMessage + { + public: + enum Level { + Warning, + Error, + Fatal + }; + + public: + DiagnosticMessage(int level, const QString &fileName, + int line, int column, + const QString &text) + : _level(level), + _fileName(fileName), + _line(line), + _column(column), + _text(text) + { } + + int level() const + { return _level; } + + bool isWarning() const + { return _level == Warning; } + + bool isError() const + { return _level == Error; } + + bool isFatal() const + { return _level == Fatal; } + + QString fileName() const + { return _fileName; } + + unsigned line() const + { return _line; } + + unsigned column() const + { return _column; } + + QString text() const + { return _text; } + + private: + int _level; + QString _fileName; + unsigned _line; + unsigned _column; + QString _text; + }; + + void addDiagnosticMessage(const DiagnosticMessage &d) + { _diagnosticMessages.append(d); } + + QList diagnosticMessages() const + { return _diagnosticMessages; } + + class Block + { + unsigned _begin; + unsigned _end; + + public: + inline Block(unsigned begin = 0, unsigned end = 0) + : _begin(begin), _end(end) + { } + + inline bool isNull() const + { return length() == 0; } + + inline unsigned position() const + { return _begin; } + + inline unsigned length() const + { return _end - _begin; } + + inline unsigned begin() const + { return _begin; } + + inline unsigned end() const + { return _end; } + + bool contains(unsigned pos) const + { return pos >= _begin && pos < _end; } + }; + + class Include { + QString _fileName; + unsigned _line; + + public: + Include(const QString &fileName, unsigned line) + : _fileName(fileName), _line(line) + { } + + QString fileName() const + { return _fileName; } + + unsigned line() const + { return _line; } + + bool resolved() const + { return QFileInfo(_fileName).isAbsolute(); } + }; + + class MacroUse: public Block { + Macro _macro; + QVector _arguments; + bool _inCondition; + unsigned _beginLine; + + public: + inline MacroUse(const Macro ¯o, + unsigned begin, unsigned end, unsigned beginLine) + : Block(begin, end), + _macro(macro), + _inCondition(false), + _beginLine(beginLine) + { } + + const Macro ¯o() const + { return _macro; } + + bool isFunctionLike() const + { return _macro.isFunctionLike(); } + + QVector arguments() const + { return _arguments; } + + bool isInCondition() const + { return _inCondition; } + + unsigned beginLine() const + { return _beginLine; } + + private: + void setArguments(const QVector &arguments) + { _arguments = arguments; } + + void addArgument(const Block &block) + { _arguments.append(block); } + + void setInCondition(bool set) + { _inCondition = set; } + + friend class Document; + }; + + class UndefinedMacroUse: public Block { + QByteArray _name; + + public: + inline UndefinedMacroUse( + const QByteArray &name, + unsigned begin) + : Block(begin, begin + name.length()), + _name(name) + { } + + QByteArray name() const + { + return _name; + } + }; + + QList includes() const + { return _includes; } + + QList skippedBlocks() const + { return _skippedBlocks; } + + QList macroUses() const + { return _macroUses; } + + QList undefinedMacroUses() const + { return _undefinedMacroUses; } + + const Macro *findMacroDefinitionAt(unsigned line) const; + const MacroUse *findMacroUseAt(unsigned offset) const; + const UndefinedMacroUse *findUndefinedMacroUseAt(unsigned offset) const; + +private: + Symbol *findSymbolAt(unsigned line, unsigned column, Scope *scope) const; + +private: + QString _fileName; + Control *_control; + TranslationUnit *_translationUnit; + Namespace *_globalNamespace; + QList _diagnosticMessages; + QList _includes; + QList _definedMacros; + QList _skippedBlocks; + QList _macroUses; + QList _undefinedMacroUses; + QByteArray _source; + QDateTime _lastModified; + unsigned _revision; + unsigned _editorRevision; + + friend class Snapshot; +}; + +class CPLUSPLUS_EXPORT Snapshot +{ + typedef QHash _Base; + +public: + Snapshot(); + ~Snapshot(); + + typedef _Base::const_iterator iterator; + typedef _Base::const_iterator const_iterator; + + int size() const; // ### remove + bool isEmpty() const; + + void insert(Document::Ptr doc); // ### remove + void remove(const QString &fileName); // ### remove + + const_iterator begin() const { return _documents.begin(); } + const_iterator end() const { return _documents.end(); } + + bool contains(const QString &fileName) const; + Document::Ptr document(const QString &fileName) const; + Document::Ptr operator[](const QString &fileName) const; + + const_iterator find(const QString &fileName) const; + + Snapshot simplified(Document::Ptr doc) const; + + QByteArray preprocessedCode(const QString &source, + const QString &fileName) const; + + Document::Ptr documentFromSource(const QByteArray &preprocessedCode, + const QString &fileName) const; + + QSharedPointer globalNamespaceBinding(Document::Ptr doc) const; + + QStringList filesDependingOn(const QString &fileName) const; + QHash dependencyTable() const; + +private: + void simplified_helper(Document::Ptr doc, Snapshot *snapshot) const; + void dependency_helper(QVector &files, + QHash &fileIndex, + QHash > &includes, + QVector &includeMap) const; + +private: + _Base _documents; +}; + +} // end of namespace CPlusPlus + +#endif // CPPDOCUMENT_H