diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h index 1d6dd6f7e4accab5a96de8897789c6f569ba744e..5dc0609670ab582f9e562538ac1bc0429196fada 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 01a10222c98921d814e94b6931ecc04ba43fb684..00f66ae6e01c0b23f12501f4cb64df4bee379d67 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 20f622a127bd4f3f2d81fe6d839c04dfc7847246..a456bcc20969c6aad6b3932f67917ecca7491ea0 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 791d24ca3459907d93bf5307dafc6aad6e273bf6..d46c7093aefad32507aba95215fa27a5695ec8dd 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 792cbb8778265d2511a38569734976de6568a96e..22eddedd415b7e8e3e2395a629c263e1a182617c 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 2ffd145af913b4db1838632bd61bb1763923175a..7ad6ecf2324243011478c0a939b64df1a86db6cd 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 2da2aa9c23767232b212e609735f64df7b42bc1d..29865c9922e62eda05712b148ee8d7b4540e54b3 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 46d81ede610892c544744fcebea49bd047a6429e..f45ce88c0c4e93cdccdc935358a23e89862efd8e 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 a249f529263ce48ffa04d7f790e1ad41923d0dd9..9e66b4597051e2b34ad33c6bfb538f296a1e13fb 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 c7226bd7153052b2a054bc1c0d49835adb5e1916..e82a60ae199e92cd9bd25bf0d388412b67f61d6c 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 48356b2a3a32e97d0cd8cd0994fbeaa568734e4e..46be950121c490754e79440a08e743182ef047f5 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: