diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-05-05 10:18:11 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-05-05 16:36:45 +0200 |
commit | c35bb4226bd809a3da3487a9db3f61ba34cce70d (patch) | |
tree | 40ccb6b51727d700d9276b315e61aa8123fb6d2d /src/shared/cplusplus | |
parent | c8f03b46c1e1dddd63450d3db140b3deba6fcb69 (diff) | |
download | qt-creator-c35bb4226bd809a3da3487a9db3f61ba34cce70d.tar.gz |
Introduce Namespace aliases and store the TranslationUnit instead of the Control.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/CPlusPlusForwardDeclarations.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/CheckDeclaration.cpp | 21 | ||||
-rw-r--r-- | src/shared/cplusplus/Control.cpp | 11 | ||||
-rw-r--r-- | src/shared/cplusplus/Control.h | 3 | ||||
-rw-r--r-- | src/shared/cplusplus/Scope.cpp | 7 | ||||
-rw-r--r-- | src/shared/cplusplus/Scope.h | 3 | ||||
-rw-r--r-- | src/shared/cplusplus/Symbol.cpp | 11 | ||||
-rw-r--r-- | src/shared/cplusplus/Symbol.h | 4 | ||||
-rw-r--r-- | src/shared/cplusplus/SymbolVisitor.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/Symbols.cpp | 21 | ||||
-rw-r--r-- | src/shared/cplusplus/Symbols.h | 25 |
11 files changed, 103 insertions, 5 deletions
diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h index 1d6dd6f7e4..5dc0609670 100644 --- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h +++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h @@ -119,6 +119,7 @@ class Argument; class TypenameArgument; class Function; class Namespace; +class NamespaceAlias; class BaseClass; class Block; class Class; diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 01a10222c9..00f66ae6e0 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -409,8 +409,27 @@ bool CheckDeclaration::visit(NamespaceAST *ast) return false; } -bool CheckDeclaration::visit(NamespaceAliasDefinitionAST *) +bool CheckDeclaration::visit(NamespaceAliasDefinitionAST *ast) { + const Name *name = 0; + + if (const Identifier *id = identifier(ast->namespace_name_token)) + name = control()->nameId(id); + + unsigned sourceLocation = ast->firstToken(); + + if (ast->namespace_name_token) + sourceLocation = ast->namespace_name_token; + + const Name *namespaceName = semantic()->check(ast->name, _scope); + + NamespaceAlias *namespaceAlias = control()->newNamespaceAlias(sourceLocation, name); + namespaceAlias->setNamespaceName(namespaceName); + namespaceAlias->setStartOffset(tokenAt(ast->firstToken()).offset); + namespaceAlias->setEndOffset(tokenAt(ast->lastToken()).offset); + //ast->symbol = namespaceAlias; + _scope->enterSymbol(namespaceAlias); + return false; } diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index 20f622a127..a456bcc209 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -385,6 +385,14 @@ public: return ns; } + NamespaceAlias *newNamespaceAlias(unsigned sourceLocation, const Name *name) + { + NamespaceAlias *ns = new NamespaceAlias(translationUnit, + sourceLocation, name); + symbols.push_back(ns); + return ns; + } + UsingNamespaceDirective *newUsingNamespaceDirective(unsigned sourceLocation, const Name *name) { UsingNamespaceDirective *u = new UsingNamespaceDirective(translationUnit, @@ -672,6 +680,9 @@ Function *Control::newFunction(unsigned sourceLocation, const Name *name) Namespace *Control::newNamespace(unsigned sourceLocation, const Name *name) { return d->newNamespace(sourceLocation, name); } +NamespaceAlias *Control::newNamespaceAlias(unsigned sourceLocation, const Name *name) +{ return d->newNamespaceAlias(sourceLocation, name); } + BaseClass *Control::newBaseClass(unsigned sourceLocation, const Name *name) { return d->newBaseClass(sourceLocation, name); } diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h index 791d24ca34..d46c7093ae 100644 --- a/src/shared/cplusplus/Control.h +++ b/src/shared/cplusplus/Control.h @@ -131,6 +131,9 @@ public: /// Creates a new Namespace symbol. Namespace *newNamespace(unsigned sourceLocation, const Name *name = 0); + /// Creates a new Namespace symbol. + NamespaceAlias *newNamespaceAlias(unsigned sourceLocation, const Name *name = 0); + /// Creates a new BaseClass symbol. BaseClass *newBaseClass(unsigned sourceLocation, const Name *name = 0); diff --git a/src/shared/cplusplus/Scope.cpp b/src/shared/cplusplus/Scope.cpp index 792cbb8778..22eddedd41 100644 --- a/src/shared/cplusplus/Scope.cpp +++ b/src/shared/cplusplus/Scope.cpp @@ -179,6 +179,13 @@ bool Scope::isObjCClassScope() const return false; } +bool Scope::isObjCProtocolScope() const +{ + if (_owner) + return _owner->isObjCProtocol(); + return false; +} + bool Scope::isFunctionScope() const { Function *f = 0; diff --git a/src/shared/cplusplus/Scope.h b/src/shared/cplusplus/Scope.h index 2ffd145af9..7ad6ecf232 100644 --- a/src/shared/cplusplus/Scope.h +++ b/src/shared/cplusplus/Scope.h @@ -114,6 +114,9 @@ public: /// Returns true if this scope's owner is an ObjCClass Symbol. bool isObjCClassScope() const; + /// Returns true if this scope's owner is an ObjCProtocol Symbol. + bool isObjCProtocolScope() const; + /// Returns true if this scope's owner is an ObjCMethod symbol. bool isObjCMethodScope() const; diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp index 2da2aa9c23..29865c9922 100644 --- a/src/shared/cplusplus/Symbol.cpp +++ b/src/shared/cplusplus/Symbol.cpp @@ -161,7 +161,7 @@ private: }; Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name) - : _control(translationUnit->control()), + : _translationUnit(translationUnit), _sourceLocation(sourceLocation), _sourceOffset(0), _startOffset(0), @@ -183,10 +183,15 @@ Symbol::~Symbol() { } Control *Symbol::control() const -{ return _control; } +{ + if (_translationUnit) + return _translationUnit->control(); + + return 0; +} TranslationUnit *Symbol::translationUnit() const -{ return _control->translationUnit(); } +{ return _translationUnit; } void Symbol::visitSymbol(SymbolVisitor *visitor) { diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h index 46d81ede61..f45ce88c0c 100644 --- a/src/shared/cplusplus/Symbol.h +++ b/src/shared/cplusplus/Symbol.h @@ -239,6 +239,7 @@ public: virtual const Enum *asEnum() const { return 0; } virtual const Function *asFunction() const { return 0; } virtual const Namespace *asNamespace() const { return 0; } + virtual const NamespaceAlias *asNamespaceAlias() const { return 0; } virtual const Class *asClass() const { return 0; } virtual const Block *asBlock() const { return 0; } virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const { return 0; } @@ -261,6 +262,7 @@ public: virtual Enum *asEnum() { return 0; } virtual Function *asFunction() { return 0; } virtual Namespace *asNamespace() { return 0; } + virtual NamespaceAlias *asNamespaceAlias() { return 0; } virtual Class *asClass() { return 0; } virtual Block *asBlock() { return 0; } virtual UsingNamespaceDirective *asUsingNamespaceDirective() { return 0; } @@ -324,7 +326,7 @@ protected: TranslationUnit *translationUnit() const; private: - Control *_control; + TranslationUnit *_translationUnit; unsigned _sourceLocation; unsigned _sourceOffset; unsigned _startOffset; diff --git a/src/shared/cplusplus/SymbolVisitor.h b/src/shared/cplusplus/SymbolVisitor.h index a249f52926..9e66b45970 100644 --- a/src/shared/cplusplus/SymbolVisitor.h +++ b/src/shared/cplusplus/SymbolVisitor.h @@ -70,6 +70,7 @@ public: virtual bool visit(UsingNamespaceDirective *) { return true; } virtual bool visit(UsingDeclaration *) { return true; } + virtual bool visit(NamespaceAlias *) { return true; } virtual bool visit(Declaration *) { return true; } virtual bool visit(Argument *) { return true; } virtual bool visit(TypenameArgument *) { return true; } diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index c7226bd715..e82a60ae19 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -89,6 +89,27 @@ FullySpecifiedType UsingNamespaceDirective::type() const void UsingNamespaceDirective::visitSymbol0(SymbolVisitor *visitor) { visitor->visit(this); } +NamespaceAlias::NamespaceAlias(TranslationUnit *translationUnit, + unsigned sourceLocation, const Name *name) + : Symbol(translationUnit, sourceLocation, name), _namespaceName(0) +{ } + +NamespaceAlias::~NamespaceAlias() +{ } + +const Name *NamespaceAlias::namespaceName() const +{ return _namespaceName; } + +void NamespaceAlias::setNamespaceName(const Name *namespaceName) +{ _namespaceName = namespaceName; } + +FullySpecifiedType NamespaceAlias::type() const +{ return FullySpecifiedType(); } + +void NamespaceAlias::visitSymbol0(SymbolVisitor *visitor) +{ visitor->visit(this); } + + UsingDeclaration::UsingDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name) : Symbol(translationUnit, sourceLocation, name) diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h index 48356b2a3a..46be950121 100644 --- a/src/shared/cplusplus/Symbols.h +++ b/src/shared/cplusplus/Symbols.h @@ -110,6 +110,31 @@ protected: virtual void visitSymbol0(SymbolVisitor *visitor); }; +class CPLUSPLUS_EXPORT NamespaceAlias: public Symbol +{ +public: + NamespaceAlias(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name); + virtual ~NamespaceAlias(); + + const Name *namespaceName() const; + void setNamespaceName(const Name *namespaceName); + + // Symbol's interface + virtual FullySpecifiedType type() const; + + virtual const NamespaceAlias *asNamespaceAlias() const + { return this; } + + virtual NamespaceAlias *asNamespaceAlias() + { return this; } + +protected: + virtual void visitSymbol0(SymbolVisitor *visitor); + +private: + const Name *_namespaceName; +}; + class CPLUSPLUS_EXPORT Declaration: public Symbol { public: |