diff options
author | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2011-05-16 10:53:42 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2011-05-16 11:05:30 +0200 |
commit | 67704b8b41b053eddbd4119a04115fb0fb2c9237 (patch) | |
tree | 094fb9bc849f2467d6389267d5613574a48f478f /src/libs/3rdparty/cplusplus/Symbol.cpp | |
parent | 5a39fba5805d34fbef16a50d20312b8a9de5bdfc (diff) |
move src/shared/cplusplus/ -> src/libs/3rdparty/cplusplus/
Approved-by: legal
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Symbol.cpp')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbol.cpp | 442 |
1 files changed, 442 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Symbol.cpp b/src/libs/3rdparty/cplusplus/Symbol.cpp new file mode 100644 index 0000000000..864415064c --- /dev/null +++ b/src/libs/3rdparty/cplusplus/Symbol.cpp @@ -0,0 +1,442 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (info@qt.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 info@qt.nokia.com. +** +**************************************************************************/ +// Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Symbol.h" +#include "Symbols.h" +#include "Control.h" +#include "Names.h" +#include "TranslationUnit.h" +#include "Literals.h" +#include "MemoryPool.h" +#include "SymbolVisitor.h" +#include "NameVisitor.h" +#include "Scope.h" +#include <cassert> + +using namespace CPlusPlus; + +class Symbol::HashCode: protected NameVisitor +{ +public: + HashCode() + : _value(0) + { } + + virtual ~HashCode() + { } + + unsigned operator()(const Name *name) + { + unsigned previousValue = switchValue(0); + accept(name); + return switchValue(previousValue); + } + +protected: + unsigned switchValue(unsigned value) + { + unsigned previousValue = _value; + _value = value; + return previousValue; + } + + virtual void visit(const Identifier *name) + { _value = name->identifier()->hashCode(); } + + virtual void visit(const TemplateNameId *name) + { _value = name->identifier()->hashCode(); } + + virtual void visit(const DestructorNameId *name) + { _value = name->identifier()->hashCode(); } + + virtual void visit(const OperatorNameId *name) + { _value = unsigned(name->kind()); } + + virtual void visit(const ConversionNameId *) + { _value = 0; } // ### TODO: implement me + + virtual void visit(const QualifiedNameId *name) + { _value = operator()(name->name()); } + + virtual void visit(const SelectorNameId *name) + { _value = name->identifier()->hashCode(); } + +private: + unsigned _value; +}; + +Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name) + : _name(0), + _scope(0), + _next(0), + _fileId(0), + _sourceLocation(0), + _hashCode(0), + _storage(Symbol::NoStorage), + _visibility(Symbol::Public), + _index(0), + _line(0), + _column(0), + _isGenerated(false), + _isDeprecated(false), + _isUnavailable(false) +{ + setSourceLocation(sourceLocation, translationUnit); + setName(name); +} + +Symbol::~Symbol() +{ } + +void Symbol::visitSymbol(SymbolVisitor *visitor) +{ + if (visitor->preVisit(this)) + visitSymbol0(visitor); + visitor->postVisit(this); +} + +void Symbol::visitSymbol(Symbol *symbol, SymbolVisitor *visitor) +{ + if (! symbol) + return; + + symbol->visitSymbol(visitor); +} + +unsigned Symbol::sourceLocation() const +{ return _sourceLocation; } + +bool Symbol::isGenerated() const +{ return _isGenerated; } + +bool Symbol::isDeprecated() const +{ return _isDeprecated; } + +void Symbol::setDeprecated(bool isDeprecated) +{ _isDeprecated = isDeprecated; } + +bool Symbol::isUnavailable() const +{ return _isUnavailable; } + +void Symbol::setUnavailable(bool isUnavailable) +{ _isUnavailable = isUnavailable; } + +void Symbol::setSourceLocation(unsigned sourceLocation, TranslationUnit *translationUnit) +{ + _sourceLocation = sourceLocation; + + if (translationUnit) { + const Token &tk = translationUnit->tokenAt(sourceLocation); + _isGenerated = tk.f.generated; + translationUnit->getPosition(tk.offset, &_line, &_column, &_fileId); + } else { + _isGenerated = false; + _line = 0; + _column = 0; + _fileId = 0; + } +} + +unsigned Symbol::line() const +{ + return _line; +} + +unsigned Symbol::column() const +{ + return _column; +} + +const StringLiteral *Symbol::fileId() const +{ + return _fileId; +} + +const char *Symbol::fileName() const +{ return fileId()->chars(); } + +unsigned Symbol::fileNameLength() const +{ return fileId()->size(); } + +const Name *Symbol::unqualifiedName() const +{ + if (! _name) + return 0; + + else if (const QualifiedNameId *q = _name->asQualifiedNameId()) + return q->name(); + + return _name; +} + +const Name *Symbol::name() const +{ return _name; } + +void Symbol::setName(const Name *name) +{ + _name = name; + + if (! _name) + _hashCode = 0; + else { + HashCode hh; + _hashCode = hh(unqualifiedName()); + } +} + +const Identifier *Symbol::identifier() const +{ + if (_name) + return _name->identifier(); + + return 0; +} + +Scope *Symbol::enclosingScope() const +{ return _scope; } + +void Symbol::setScope(Scope *scope) +{ + assert(! _scope); + _scope = scope; +} + +Namespace *Symbol::enclosingNamespace() const +{ + for (Scope *s = _scope; s; s = s->enclosingScope()) { + if (Namespace *ns = s->asNamespace()) + return ns; + } + return 0; +} + +Template *Symbol::enclosingTemplate() const +{ + for (Scope *s = _scope; s; s = s->enclosingScope()) { + if (Template *templ = s->asTemplate()) + return templ; + } + return 0; +} + +Class *Symbol::enclosingClass() const +{ + for (Scope *s = _scope; s; s = s->enclosingScope()) { + if (Class *klass = s->asClass()) + return klass; + } + return 0; +} + +Enum *Symbol::enclosingEnum() const +{ + for (Scope *s = _scope; s; s = s->enclosingScope()) { + if (Enum *e = s->asEnum()) + return e; + } + return 0; +} + +Function *Symbol::enclosingFunction() const +{ + for (Scope *s = _scope; s; s = s->enclosingScope()) { + if (Function *fun = s->asFunction()) + return fun; + } + return 0; +} + +Block *Symbol::enclosingBlock() const +{ + for (Scope *s = _scope; s; s = s->enclosingScope()) { + if (Block *block = s->asBlock()) + return block; + } + return 0; +} + +unsigned Symbol::index() const +{ return _index; } + +Symbol *Symbol::next() const +{ return _next; } + +unsigned Symbol::hashCode() const +{ return _hashCode; } + +int Symbol::storage() const +{ return _storage; } + +void Symbol::setStorage(int storage) +{ _storage = storage; } + +int Symbol::visibility() const +{ return _visibility; } + +void Symbol::setVisibility(int visibility) +{ _visibility = visibility; } + +bool Symbol::isFriend() const +{ return _storage == Friend; } + +bool Symbol::isRegister() const +{ return _storage == Register; } + +bool Symbol::isStatic() const +{ return _storage == Static; } + +bool Symbol::isExtern() const +{ return _storage == Extern; } + +bool Symbol::isMutable() const +{ return _storage == Mutable; } + +bool Symbol::isTypedef() const +{ return _storage == Typedef; } + +bool Symbol::isPublic() const +{ return _visibility == Public; } + +bool Symbol::isProtected() const +{ return _visibility == Protected; } + +bool Symbol::isPrivate() const +{ return _visibility == Private; } + +bool Symbol::isScope() const +{ return asScope() != 0; } + +bool Symbol::isEnum() const +{ return asEnum() != 0; } + +bool Symbol::isFunction() const +{ return asFunction() != 0; } + +bool Symbol::isNamespace() const +{ return asNamespace() != 0; } + +bool Symbol::isTemplate() const +{ return asTemplate() != 0; } + +bool Symbol::isClass() const +{ return asClass() != 0; } + +bool Symbol::isForwardClassDeclaration() const +{ return asForwardClassDeclaration() != 0; } + +bool Symbol::isQtPropertyDeclaration() const +{ return asQtPropertyDeclaration() != 0; } + +bool Symbol::isQtEnum() const +{ return asQtEnum() != 0; } + +bool Symbol::isBlock() const +{ return asBlock() != 0; } + +bool Symbol::isUsingNamespaceDirective() const +{ return asUsingNamespaceDirective() != 0; } + +bool Symbol::isUsingDeclaration() const +{ return asUsingDeclaration() != 0; } + +bool Symbol::isDeclaration() const +{ return asDeclaration() != 0; } + +bool Symbol::isArgument() const +{ return asArgument() != 0; } + +bool Symbol::isTypenameArgument() const +{ return asTypenameArgument() != 0; } + +bool Symbol::isBaseClass() const +{ return asBaseClass() != 0; } + +bool Symbol::isObjCBaseClass() const +{ return asObjCBaseClass() != 0; } + +bool Symbol::isObjCBaseProtocol() const +{ return asObjCBaseProtocol() != 0; } + +bool Symbol::isObjCClass() const +{ return asObjCClass() != 0; } + +bool Symbol::isObjCForwardClassDeclaration() const +{ return asObjCForwardClassDeclaration() != 0; } + +bool Symbol::isObjCProtocol() const +{ return asObjCProtocol() != 0; } + +bool Symbol::isObjCForwardProtocolDeclaration() const +{ return asObjCForwardProtocolDeclaration() != 0; } + +bool Symbol::isObjCMethod() const +{ return asObjCMethod() != 0; } + +bool Symbol::isObjCPropertyDeclaration() const +{ return asObjCPropertyDeclaration() != 0; } + +void Symbol::copy(Symbol *other) +{ + _sourceLocation = other->_sourceLocation; + _name = other->_name; + _hashCode = other->_hashCode; + _storage = other->_storage; + _visibility = other->_visibility; + _scope = other->_scope; + _index = other->_index; + _next = other->_next; + _fileId = other->_fileId; + _line = other->_line; + _column = other->_column; + + _isGenerated = other->_isGenerated; + _isDeprecated = other->_isDeprecated; +} |