summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-05-05 10:18:11 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-05-05 16:36:45 +0200
commitc35bb4226bd809a3da3487a9db3f61ba34cce70d (patch)
tree40ccb6b51727d700d9276b315e61aa8123fb6d2d /src/shared/cplusplus
parentc8f03b46c1e1dddd63450d3db140b3deba6fcb69 (diff)
downloadqt-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.h1
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp21
-rw-r--r--src/shared/cplusplus/Control.cpp11
-rw-r--r--src/shared/cplusplus/Control.h3
-rw-r--r--src/shared/cplusplus/Scope.cpp7
-rw-r--r--src/shared/cplusplus/Scope.h3
-rw-r--r--src/shared/cplusplus/Symbol.cpp11
-rw-r--r--src/shared/cplusplus/Symbol.h4
-rw-r--r--src/shared/cplusplus/SymbolVisitor.h1
-rw-r--r--src/shared/cplusplus/Symbols.cpp21
-rw-r--r--src/shared/cplusplus/Symbols.h25
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: