Merge CPlusPlus::NameId and CPlusPlus::Identifier.

This commit is contained in:
Roberto Raggi
2010-09-02 11:59:01 +02:00
parent 8b2eeb9c5f
commit c12866a467
25 changed files with 69 additions and 131 deletions

View File

@@ -303,7 +303,7 @@ const Name *Bind::objCSelectorArgument(ObjCSelectorArgumentAST *ast, bool *hasAr
if (ast->colon_token)
*hasArg = true;
return control()->nameId(identifier(ast->name_token));
return identifier(ast->name_token);
}
bool Bind::visit(AttributeAST *ast)
@@ -468,7 +468,7 @@ void Bind::enumerator(EnumeratorAST *ast, Enum *symbol)
ExpressionTy expression = this->expression(ast->expression);
if (ast->identifier_token) {
const Name *name = control()->nameId(identifier(ast->identifier_token));
const Name *name = identifier(ast->identifier_token);
Declaration *e = control()->newDeclaration(ast->identifier_token, name);
e->setType(control()->integerType(IntegerType::Int)); // ### introduce IntegerType::Enumerator
symbol->addMember(e);
@@ -1143,20 +1143,20 @@ bool Bind::visit(QtMemberDeclarationAST *ast)
const Name *name = 0;
if (tokenKind(ast->q_token) == T_Q_D)
name = control()->nameId(control()->identifier("d"));
name = control()->identifier("d");
else
name = control()->nameId(control()->identifier("q"));
name = control()->identifier("q");
FullySpecifiedType declTy = this->expression(ast->type_id);
if (tokenKind(ast->q_token) == T_Q_D) {
if (NamedType *namedTy = declTy->asNamedType()) {
if (const NameId *nameId = namedTy->name()->asNameId()) {
if (const Identifier *nameId = namedTy->name()->asNameId()) {
std::string privateClass;
privateClass += nameId->identifier()->chars();
privateClass += "Private";
const Name *privName = control()->nameId(control()->identifier(privateClass.c_str(), privateClass.size()));
const Name *privName = control()->identifier(privateClass.c_str(), privateClass.size());
declTy.setType(control()->namedType(privName));
}
}
@@ -1987,7 +1987,7 @@ bool Bind::visit(NamespaceAST *ast)
const Name *namespaceName = 0;
if (ast->identifier_token) {
sourceLocation = ast->identifier_token;
namespaceName = control()->nameId(identifier(ast->identifier_token));
namespaceName = identifier(ast->identifier_token);
}
Namespace *ns = control()->newNamespace(sourceLocation, namespaceName);
@@ -2008,7 +2008,7 @@ bool Bind::visit(NamespaceAliasDefinitionAST *ast)
const Name *name = 0;
if (ast->namespace_name_token) {
sourceLocation = ast->namespace_name_token;
name = control()->nameId(identifier(ast->namespace_name_token));
name = identifier(ast->namespace_name_token);
}
NamespaceAlias *namespaceAlias = control()->newNamespaceAlias(sourceLocation, name);
@@ -2444,14 +2444,16 @@ bool Bind::visit(ConversionFunctionIdAST *ast)
bool Bind::visit(SimpleNameAST *ast)
{
const Identifier *id = identifier(ast->identifier_token);
ast->name = _name = control()->nameId(id);
_name = id;
ast->name = _name;
return false;
}
bool Bind::visit(DestructorNameAST *ast)
{
const Identifier *id = identifier(ast->identifier_token);
ast->name = _name = control()->destructorNameId(id);
_name = control()->destructorNameId(id);
ast->name = _name;
return false;
}

View File

@@ -83,7 +83,7 @@ class SymbolTable;
// names
class NameVisitor;
class Name;
class NameId;
class Identifier;
class TemplateNameId;
class DestructorNameId;
class OperatorNameId;

View File

@@ -129,14 +129,6 @@ template <> struct Compare<ArrayType>
}
};
template <> struct Compare<NameId>
{
bool operator()(const NameId &name, const NameId &otherName) const
{
return name.identifier() < otherName.identifier();
}
};
template <> struct Compare<DestructorNameId>
{
bool operator()(const DestructorNameId &name, const DestructorNameId &otherName) const
@@ -256,14 +248,6 @@ public:
delete_array_entries(symbols);
}
const NameId *findOrInsertNameId(const Identifier *id)
{
if (! id)
return 0;
return nameIds.intern(NameId(id));
}
template <typename _Iterator>
const TemplateNameId *findOrInsertTemplateNameId(const Identifier *id, _Iterator first, _Iterator last)
{
@@ -498,7 +482,6 @@ public:
// ### replace std::map with lookup tables. ASAP!
// names
Table<NameId> nameIds;
Table<DestructorNameId> destructorNameIds;
Table<OperatorNameId> operatorNameIds;
Table<ConversionNameId> conversionNameIds;
@@ -616,9 +599,6 @@ const NumericLiteral *Control::numericLiteral(const char *chars)
return numericLiteral(chars, length);
}
const NameId *Control::nameId(const Identifier *id)
{ return d->findOrInsertNameId(id); }
const TemplateNameId *Control::templateNameId(const Identifier *id,
const FullySpecifiedType *const args,
unsigned argv)

View File

@@ -65,9 +65,6 @@ public:
DiagnosticClient *diagnosticClient() const;
void setDiagnosticClient(DiagnosticClient *diagnosticClient);
/// Returns the canonical name id.
const NameId *nameId(const Identifier *id);
/// Returns the canonical template name id.
const TemplateNameId *templateNameId(const Identifier *id,
const FullySpecifiedType *const args = 0,

View File

@@ -47,6 +47,7 @@
// THE SOFTWARE.
#include "Literals.h"
#include "NameVisitor.h"
#include <cstring>
#include <algorithm>
#include <iostream>
@@ -69,7 +70,7 @@ Literal::Literal(const char *chars, unsigned size)
Literal::~Literal()
{ delete[] _chars; }
bool Literal::isEqualTo(const Literal *other) const
bool Literal::equalTo(const Literal *other) const
{
if (! other)
return false;
@@ -212,3 +213,18 @@ Identifier::Identifier(const char *chars, unsigned size)
Identifier::~Identifier()
{ }
void Identifier::accept0(NameVisitor *visitor) const
{ visitor->visit(this); }
bool Identifier::isEqualTo(const Name *other) const
{
if (this == other)
return true;
else if (other) {
if (const Identifier *nameId = other->asNameId()) {
return equalTo(nameId);
}
}
return false;
}

View File

@@ -51,7 +51,7 @@
#include "CPlusPlusForwardDeclarations.h"
#include "Token.h"
#include "Name.h"
namespace CPlusPlus {
@@ -78,7 +78,7 @@ public:
unsigned hashCode() const;
static unsigned hashCode(const char *chars, unsigned size);
bool isEqualTo(const Literal *other) const;
bool equalTo(const Literal *other) const;
private:
char *_chars;
@@ -126,11 +126,21 @@ private:
};
};
class CPLUSPLUS_EXPORT Identifier: public Literal
class CPLUSPLUS_EXPORT Identifier: public Literal, public Name
{
public:
Identifier(const char *chars, unsigned size);
virtual ~Identifier();
virtual const Identifier *identifier() const { return this; }
virtual bool isEqualTo(const Name *other) const;
virtual const Identifier *asNameId() const
{ return this; }
protected:
virtual void accept0(NameVisitor *visitor) const;
};
} // end of namespace CPlusPlus

View File

@@ -70,7 +70,7 @@ public:
bool isQualifiedNameId() const;
bool isSelectorNameId() const;
virtual const NameId *asNameId() const { return 0; }
virtual const Identifier *asNameId() const { return 0; }
virtual const TemplateNameId *asTemplateNameId() const { return 0; }
virtual const DestructorNameId *asDestructorNameId() const { return 0; }
virtual const OperatorNameId *asOperatorNameId() const { return 0; }

View File

@@ -68,7 +68,7 @@ public:
virtual bool preVisit(const Name *) { return true; }
virtual void postVisit(const Name *) {}
virtual void visit(const NameId *) {}
virtual void visit(const Identifier *) {}
virtual void visit(const TemplateNameId *) {}
virtual void visit(const DestructorNameId *) {}
virtual void visit(const OperatorNameId *) {}

View File

@@ -90,32 +90,6 @@ bool QualifiedNameId::isEqualTo(const Name *other) const
return false;
}
NameId::NameId(const Identifier *identifier)
: _identifier(identifier)
{ }
NameId::~NameId()
{ }
void NameId::accept0(NameVisitor *visitor) const
{ visitor->visit(this); }
const Identifier *NameId::identifier() const
{ return _identifier; }
bool NameId::isEqualTo(const Name *other) const
{
if (other) {
const NameId *nameId = other->asNameId();
if (! nameId)
return false;
const Identifier *l = identifier();
const Identifier *r = nameId->identifier();
return l->isEqualTo(r);
}
return false;
}
DestructorNameId::DestructorNameId(const Identifier *identifier)
: _identifier(identifier)
{ }

View File

@@ -82,26 +82,6 @@ private:
const Name *_name;
};
class CPLUSPLUS_EXPORT NameId: public Name
{
public:
NameId(const Identifier *identifier);
virtual ~NameId();
virtual const Identifier *identifier() const;
virtual bool isEqualTo(const Name *other) const;
virtual const NameId *asNameId() const
{ return this; }
protected:
virtual void accept0(NameVisitor *visitor) const;
private:
const Identifier *_identifier;
};
class CPLUSPLUS_EXPORT DestructorNameId: public Name
{
public:

View File

@@ -94,7 +94,6 @@ public:
/// Returns the last Symbol in the scope.
iterator lastSymbol() const;
Symbol *lookat(const Name *name) const;
Symbol *lookat(const Identifier *id) const;
Symbol *lookat(int operatorId) const;
@@ -157,21 +156,6 @@ void SymbolTable::enterSymbol(Symbol *symbol)
}
}
Symbol *SymbolTable::lookat(const Name *name) const
{
if (! name)
return 0;
else if (const OperatorNameId *opId = name->asOperatorNameId())
return lookat(opId->kind());
else if (const Identifier *id = name->identifier())
return lookat(id);
else
return 0;
}
Symbol *SymbolTable::lookat(const Identifier *id) const
{
if (! _hash || ! id)
@@ -183,7 +167,7 @@ Symbol *SymbolTable::lookat(const Identifier *id) const
const Name *identity = symbol->unqualifiedName();
if (! identity) {
continue;
} else if (const NameId *nameId = identity->asNameId()) {
} else if (const Identifier *nameId = identity->asNameId()) {
if (nameId->identifier()->isEqualTo(id))
break;
} else if (const TemplateNameId *t = identity->asTemplateNameId()) {
@@ -303,9 +287,6 @@ Scope::iterator Scope::firstMember() const
Scope::iterator Scope::lastMember() const
{ return _members ? _members->lastSymbol() : 0; }
Symbol *Scope::find(const Name *name) const
{ return _members ? _members->lookat(name) : 0; }
Symbol *Scope::find(const Identifier *id) const
{ return _members ? _members->lookat(id) : 0; }

View File

@@ -80,7 +80,6 @@ public:
/// Returns the last Symbol in the scope.
iterator lastMember() const;
Symbol *find(const Name *name) const;
Symbol *find(const Identifier *id) const;
Symbol *find(int operatorId) const;

View File

@@ -85,7 +85,7 @@ protected:
return previousValue;
}
virtual void visit(const NameId *name)
virtual void visit(const Identifier *name)
{ _value = name->identifier()->hashCode(); }
virtual void visit(const TemplateNameId *name)