diff -r 000000000000 -r 876b1a06bc25 tools/icheck/parser/src/libs/cplusplus/LookupContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/icheck/parser/src/libs/cplusplus/LookupContext.h Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,253 @@ +/**************************************************************************** +** +** 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 CPLUSPLUS_LOOKUPCONTEXT_H +#define CPLUSPLUS_LOOKUPCONTEXT_H + +#include "CppDocument.h" +#include + +namespace CPlusPlus { + +class CPLUSPLUS_EXPORT LookupItem +{ +public: + LookupItem() + : _lastVisibleSymbol(0) {} + + LookupItem(const FullySpecifiedType &type, Symbol *lastVisibleSymbol) + : _type(type), _lastVisibleSymbol(lastVisibleSymbol) {} + + FullySpecifiedType type() const { return _type; } + void setType(const FullySpecifiedType &type) { _type = type; } + + Symbol *lastVisibleSymbol() const { return _lastVisibleSymbol; } + void setLastVisibleSymbol(Symbol *symbol) { _lastVisibleSymbol = symbol; } + + bool operator == (const LookupItem &other) const + { + if (_type == other._type) + return _lastVisibleSymbol == other._lastVisibleSymbol; + + return false; + } + + bool operator != (const LookupItem &result) const + { return ! operator == (result); } + +private: + FullySpecifiedType _type; + Symbol *_lastVisibleSymbol; +}; + +class CPLUSPLUS_EXPORT LookupContext +{ +public: + LookupContext(Control *control = 0); + + LookupContext(Symbol *symbol, + Document::Ptr expressionDocument, + Document::Ptr thisDocument, + const Snapshot &snapshot); + + bool isValid() const; + + Control *control() const; + Symbol *symbol() const; + Document::Ptr expressionDocument() const; + Document::Ptr thisDocument() const; + Document::Ptr document(const QString &fileName) const; + Snapshot snapshot() const; + + static Symbol *canonicalSymbol(const QList &candidates, + NamespaceBinding *globalNamespaceBinding); + + static Symbol *canonicalSymbol(Symbol *symbol, + NamespaceBinding *globalNamespaceBinding); + + static Symbol *canonicalSymbol(const QList &candidates, + NamespaceBinding *globalNamespaceBinding); + + QList resolve(const Name *name) const + { return resolve(name, visibleScopes()); } + + QList resolveNamespace(const Name *name) const + { return resolveNamespace(name, visibleScopes()); } + + QList resolveClass(const Name *name) const + { return resolveClass(name, visibleScopes()); } + + QList resolveClassOrNamespace(const Name *name) const + { return resolveClassOrNamespace(name, visibleScopes()); } + + QList resolveObjCClass(const Name *name) const + { return resolveObjCClass(name, visibleScopes()); } + + QList resolveObjCProtocol(const Name *name) const + { return resolveObjCProtocol(name, visibleScopes()); } + + enum ResolveMode { + ResolveSymbol = 0x01, + ResolveClass = 0x02, + ResolveNamespace = 0x04, + ResolveClassOrNamespace = ResolveClass | ResolveNamespace, + ResolveObjCClass = 0x08, + ResolveObjCProtocol = 0x10, + ResolveAll = ResolveSymbol | ResolveClassOrNamespace | ResolveObjCClass | ResolveObjCProtocol + }; + + QList resolve(const Name *name, const QList &visibleScopes, + ResolveMode mode = ResolveAll) const; + + QList resolveNamespace(const Name *name, const QList &visibleScopes) const + { return resolve(name, visibleScopes, ResolveNamespace); } + + QList resolveClass(const Name *name, const QList &visibleScopes) const + { return resolve(name, visibleScopes, ResolveClass); } + + QList resolveClassOrNamespace(const Name *name, const QList &visibleScopes) const + { return resolve(name, visibleScopes, ResolveClassOrNamespace); } + + QList resolveObjCClass(const Name *name, const QList &visibleScopes) const + { return resolve(name, visibleScopes, ResolveObjCClass); } + + QList resolveObjCProtocol(const Name *name, const QList &visibleScopes) const + { return resolve(name, visibleScopes, ResolveObjCProtocol); } + + QList visibleScopes() const + { return _visibleScopes; } + + QList visibleScopes(Symbol *symbol) const; + QList visibleScopes(const LookupItem &result) const; + + QList expand(const QList &scopes) const; + + void expand(const QList &scopes, QList *expandedScopes) const; + + void expand(Scope *scope, const QList &visibleScopes, + QList *expandedScopes) const; + + void expandNamespace(Namespace *namespaceSymbol, + const QList &visibleScopes, + QList *expandedScopes) const; + + void expandClass(Class *classSymbol, + const QList &visibleScopes, + QList *expandedScopes) const; + + void expandBlock(Block *blockSymbol, + const QList &visibleScopes, + QList *expandedScopes) const; + + void expandFunction(Function *functionSymbol, + const QList &visibleScopes, + QList *expandedScopes) const; + + void expandObjCMethod(ObjCMethod *method, + const QList &visibleScopes, + QList *expandedScopes) const; + + void expandObjCClass(ObjCClass *klass, + const QList &visibleScopes, + QList *expandedScopes) const; + + void expandObjCProtocol(ObjCProtocol *protocol, + const QList &visibleScopes, + QList *expandedScopes) const; + + void expandEnumOrAnonymousSymbol(ScopedSymbol *scopedSymbol, + QList *expandedScopes) const; + +private: + static Symbol *canonicalSymbol(Symbol *symbol); + + QList resolveQualifiedNameId(const QualifiedNameId *q, + const QList &visibleScopes, + ResolveMode mode) const; + + QList resolveOperatorNameId(const OperatorNameId *opId, + const QList &visibleScopes, + ResolveMode mode) const; + + QList resolveNestedNameSpecifier(const QualifiedNameId *q, + const QList &visibleScopes) const; + + const Identifier *identifier(const Name *name) const; + + QList buildVisibleScopes(); + + void buildVisibleScopes_helper(Document::Ptr doc, QList *scopes, + QSet *processed); + + static bool maybeValidSymbol(Symbol *symbol, + ResolveMode mode, + const QList &candidates); + +private: + Control *_control; + + // The current symbol. + Symbol *_symbol; + + // The current expression. + Document::Ptr _expressionDocument; + + // The current document. + Document::Ptr _thisDocument; + + // All documents. + Snapshot _snapshot; + + // Visible scopes. + QList _visibleScopes; +}; + +uint qHash(const CPlusPlus::LookupItem &result); + +} // end of namespace CPlusPlus + +#if defined(Q_CC_MSVC) && _MSC_VER <= 1300 +//this ensures that code outside QmlJS can use the hash function +//it also a workaround for some compilers +inline uint qHash(const CPlusPlus::LookupItem &item) { return CPlusPlus::qHash(item); } +#endif + +#endif // CPLUSPLUS_LOOKUPCONTEXT_H