forked from qt-creator/qt-creator
Introduce Namespace aliases and store the TranslationUnit instead of the Control.
This commit is contained in:
@@ -119,6 +119,7 @@ class Argument;
|
|||||||
class TypenameArgument;
|
class TypenameArgument;
|
||||||
class Function;
|
class Function;
|
||||||
class Namespace;
|
class Namespace;
|
||||||
|
class NamespaceAlias;
|
||||||
class BaseClass;
|
class BaseClass;
|
||||||
class Block;
|
class Block;
|
||||||
class Class;
|
class Class;
|
||||||
|
@@ -409,8 +409,27 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
|
|||||||
return false;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -385,6 +385,14 @@ public:
|
|||||||
return ns;
|
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 *newUsingNamespaceDirective(unsigned sourceLocation, const Name *name)
|
||||||
{
|
{
|
||||||
UsingNamespaceDirective *u = new UsingNamespaceDirective(translationUnit,
|
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)
|
Namespace *Control::newNamespace(unsigned sourceLocation, const Name *name)
|
||||||
{ return d->newNamespace(sourceLocation, 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)
|
BaseClass *Control::newBaseClass(unsigned sourceLocation, const Name *name)
|
||||||
{ return d->newBaseClass(sourceLocation, name); }
|
{ return d->newBaseClass(sourceLocation, name); }
|
||||||
|
|
||||||
|
@@ -131,6 +131,9 @@ public:
|
|||||||
/// Creates a new Namespace symbol.
|
/// Creates a new Namespace symbol.
|
||||||
Namespace *newNamespace(unsigned sourceLocation, const Name *name = 0);
|
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.
|
/// Creates a new BaseClass symbol.
|
||||||
BaseClass *newBaseClass(unsigned sourceLocation, const Name *name = 0);
|
BaseClass *newBaseClass(unsigned sourceLocation, const Name *name = 0);
|
||||||
|
|
||||||
|
@@ -179,6 +179,13 @@ bool Scope::isObjCClassScope() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Scope::isObjCProtocolScope() const
|
||||||
|
{
|
||||||
|
if (_owner)
|
||||||
|
return _owner->isObjCProtocol();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool Scope::isFunctionScope() const
|
bool Scope::isFunctionScope() const
|
||||||
{
|
{
|
||||||
Function *f = 0;
|
Function *f = 0;
|
||||||
|
@@ -114,6 +114,9 @@ public:
|
|||||||
/// Returns true if this scope's owner is an ObjCClass Symbol.
|
/// Returns true if this scope's owner is an ObjCClass Symbol.
|
||||||
bool isObjCClassScope() const;
|
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.
|
/// Returns true if this scope's owner is an ObjCMethod symbol.
|
||||||
bool isObjCMethodScope() const;
|
bool isObjCMethodScope() const;
|
||||||
|
|
||||||
|
@@ -161,7 +161,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
|
||||||
: _control(translationUnit->control()),
|
: _translationUnit(translationUnit),
|
||||||
_sourceLocation(sourceLocation),
|
_sourceLocation(sourceLocation),
|
||||||
_sourceOffset(0),
|
_sourceOffset(0),
|
||||||
_startOffset(0),
|
_startOffset(0),
|
||||||
@@ -183,10 +183,15 @@ Symbol::~Symbol()
|
|||||||
{ }
|
{ }
|
||||||
|
|
||||||
Control *Symbol::control() const
|
Control *Symbol::control() const
|
||||||
{ return _control; }
|
{
|
||||||
|
if (_translationUnit)
|
||||||
|
return _translationUnit->control();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
TranslationUnit *Symbol::translationUnit() const
|
TranslationUnit *Symbol::translationUnit() const
|
||||||
{ return _control->translationUnit(); }
|
{ return _translationUnit; }
|
||||||
|
|
||||||
void Symbol::visitSymbol(SymbolVisitor *visitor)
|
void Symbol::visitSymbol(SymbolVisitor *visitor)
|
||||||
{
|
{
|
||||||
|
@@ -239,6 +239,7 @@ public:
|
|||||||
virtual const Enum *asEnum() const { return 0; }
|
virtual const Enum *asEnum() const { return 0; }
|
||||||
virtual const Function *asFunction() const { return 0; }
|
virtual const Function *asFunction() const { return 0; }
|
||||||
virtual const Namespace *asNamespace() 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 Class *asClass() const { return 0; }
|
||||||
virtual const Block *asBlock() const { return 0; }
|
virtual const Block *asBlock() const { return 0; }
|
||||||
virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const { return 0; }
|
virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const { return 0; }
|
||||||
@@ -261,6 +262,7 @@ public:
|
|||||||
virtual Enum *asEnum() { return 0; }
|
virtual Enum *asEnum() { return 0; }
|
||||||
virtual Function *asFunction() { return 0; }
|
virtual Function *asFunction() { return 0; }
|
||||||
virtual Namespace *asNamespace() { return 0; }
|
virtual Namespace *asNamespace() { return 0; }
|
||||||
|
virtual NamespaceAlias *asNamespaceAlias() { return 0; }
|
||||||
virtual Class *asClass() { return 0; }
|
virtual Class *asClass() { return 0; }
|
||||||
virtual Block *asBlock() { return 0; }
|
virtual Block *asBlock() { return 0; }
|
||||||
virtual UsingNamespaceDirective *asUsingNamespaceDirective() { return 0; }
|
virtual UsingNamespaceDirective *asUsingNamespaceDirective() { return 0; }
|
||||||
@@ -324,7 +326,7 @@ protected:
|
|||||||
TranslationUnit *translationUnit() const;
|
TranslationUnit *translationUnit() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Control *_control;
|
TranslationUnit *_translationUnit;
|
||||||
unsigned _sourceLocation;
|
unsigned _sourceLocation;
|
||||||
unsigned _sourceOffset;
|
unsigned _sourceOffset;
|
||||||
unsigned _startOffset;
|
unsigned _startOffset;
|
||||||
|
@@ -70,6 +70,7 @@ public:
|
|||||||
|
|
||||||
virtual bool visit(UsingNamespaceDirective *) { return true; }
|
virtual bool visit(UsingNamespaceDirective *) { return true; }
|
||||||
virtual bool visit(UsingDeclaration *) { return true; }
|
virtual bool visit(UsingDeclaration *) { return true; }
|
||||||
|
virtual bool visit(NamespaceAlias *) { return true; }
|
||||||
virtual bool visit(Declaration *) { return true; }
|
virtual bool visit(Declaration *) { return true; }
|
||||||
virtual bool visit(Argument *) { return true; }
|
virtual bool visit(Argument *) { return true; }
|
||||||
virtual bool visit(TypenameArgument *) { return true; }
|
virtual bool visit(TypenameArgument *) { return true; }
|
||||||
|
@@ -89,6 +89,27 @@ FullySpecifiedType UsingNamespaceDirective::type() const
|
|||||||
void UsingNamespaceDirective::visitSymbol0(SymbolVisitor *visitor)
|
void UsingNamespaceDirective::visitSymbol0(SymbolVisitor *visitor)
|
||||||
{ visitor->visit(this); }
|
{ 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,
|
UsingDeclaration::UsingDeclaration(TranslationUnit *translationUnit,
|
||||||
unsigned sourceLocation, const Name *name)
|
unsigned sourceLocation, const Name *name)
|
||||||
: Symbol(translationUnit, sourceLocation, name)
|
: Symbol(translationUnit, sourceLocation, name)
|
||||||
|
@@ -110,6 +110,31 @@ protected:
|
|||||||
virtual void visitSymbol0(SymbolVisitor *visitor);
|
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
|
class CPLUSPLUS_EXPORT Declaration: public Symbol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Reference in New Issue
Block a user