Reimplemented Type::as*Type() using virtual methods.

This commit is contained in:
Roberto Raggi
2009-02-09 17:44:06 +01:00
parent ce22a96041
commit d01795d933
15 changed files with 175 additions and 181 deletions

View File

@@ -63,11 +63,13 @@ Icons::Icons()
QIcon Icons::iconForSymbol(const Symbol *symbol) const QIcon Icons::iconForSymbol(const Symbol *symbol) const
{ {
if (symbol->isFunction() || (symbol->isDeclaration() && symbol->type()->isFunction())) FullySpecifiedType symbolType = symbol->type();
if (symbol->isFunction() || (symbol->isDeclaration() && symbolType &&
symbolType->isFunctionType()))
{ {
const Function *function = symbol->asFunction(); const Function *function = symbol->asFunction();
if (!function) if (!function)
function = symbol->type()->asFunction(); function = symbol->type()->asFunctionType();
if (function->isSlot()) { if (function->isSlot()) {
if (function->isPublic()) { if (function->isPublic()) {

View File

@@ -171,7 +171,7 @@ QVariant OverviewModel::data(const QModelIndex &index, int role) const
if (! symbol->isScopedSymbol() || symbol->isFunction()) { if (! symbol->isScopedSymbol() || symbol->isFunction()) {
QString type = _overview.prettyType(symbol->type()); QString type = _overview.prettyType(symbol->type());
if (! type.isEmpty()) { if (! type.isEmpty()) {
if (! symbol->type()->isFunction()) if (! symbol->type()->isFunctionType())
name += QLatin1String(": "); name += QLatin1String(": ");
name += type; name += type;
} }

View File

@@ -512,7 +512,7 @@ bool ResolveExpression::visit(CallAST *ast)
_results.clear(); _results.clear();
foreach (Result p, baseResults) { foreach (Result p, baseResults) {
if (Function *funTy = p.first->asFunction()) { if (Function *funTy = p.first->asFunctionType()) {
unsigned minNumberArguments = 0; unsigned minNumberArguments = 0;
for (; minNumberArguments < funTy->argumentCount(); ++minNumberArguments) { for (; minNumberArguments < funTy->argumentCount(); ++minNumberArguments) {
Argument *arg = funTy->argumentAt(minNumberArguments)->asArgument(); Argument *arg = funTy->argumentAt(minNumberArguments)->asArgument();
@@ -528,7 +528,7 @@ bool ResolveExpression::visit(CallAST *ast)
p.first = funTy->returnType(); p.first = funTy->returnType();
addResult(p); addResult(p);
} }
} else if (Class *classTy = p.first->asClass()) { } else if (Class *classTy = p.first->asClassType()) {
// Constructor call // Constructor call
p.first = control()->namedType(classTy->name()); p.first = control()->namedType(classTy->name());
addResult(p); addResult(p);
@@ -566,7 +566,7 @@ bool ResolveExpression::visit(ArrayAccessAST *ast)
resolveArrayOperator(p, namedTy, classObject->asClass()); resolveArrayOperator(p, namedTy, classObject->asClass());
foreach (Result r, overloads) { foreach (Result r, overloads) {
FullySpecifiedType ty = r.first; FullySpecifiedType ty = r.first;
Function *funTy = ty->asFunction(); Function *funTy = ty->asFunctionType();
if (! funTy) if (! funTy)
continue; continue;
@@ -621,7 +621,7 @@ ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults,
classObject->asClass()); classObject->asClass());
foreach (Result r, overloads) { foreach (Result r, overloads) {
FullySpecifiedType ty = r.first; FullySpecifiedType ty = r.first;
Function *funTy = ty->asFunction(); Function *funTy = ty->asFunctionType();
if (! funTy) if (! funTy)
continue; continue;
@@ -651,7 +651,7 @@ ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults,
if (NamedType *namedTy = ty->asNamedType()) if (NamedType *namedTy = ty->asNamedType())
results += resolveMember(p, memberName, namedTy); results += resolveMember(p, memberName, namedTy);
else if (Function *fun = ty->asFunction()) { else if (Function *fun = ty->asFunctionType()) {
if (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope()) { if (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope()) {
ty = fun->returnType(); ty = fun->returnType();
@@ -849,7 +849,7 @@ QList<Symbol *> ResolveClass::resolveClass(NamedType *namedTy,
resolvedSymbols.append(klass); resolvedSymbols.append(klass);
} else if (candidate->isTypedef()) { } else if (candidate->isTypedef()) {
if (Declaration *decl = candidate->asDeclaration()) { if (Declaration *decl = candidate->asDeclaration()) {
if (Class *asClass = decl->type()->asClass()) { if (Class *asClass = decl->type()->asClassType()) {
// typedef struct { } Point; // typedef struct { } Point;
// Point pt; // Point pt;
// pt. // pt.
@@ -863,7 +863,7 @@ QList<Symbol *> ResolveClass::resolveClass(NamedType *namedTy,
} }
} }
} else if (Declaration *decl = candidate->asDeclaration()) { } else if (Declaration *decl = candidate->asDeclaration()) {
if (Function *funTy = decl->type()->asFunction()) { if (Function *funTy = decl->type()->asFunctionType()) {
// QString foo("ciao"); // QString foo("ciao");
// foo. // foo.
if (funTy->scope()->isBlockScope() || funTy->scope()->isNamespaceScope()) { if (funTy->scope()->isBlockScope() || funTy->scope()->isNamespaceScope()) {

View File

@@ -424,7 +424,7 @@ static bool isCompatible(Name *name, Name *otherName)
static bool isCompatible(Function *definition, Symbol *declaration, QualifiedNameId *declarationName) static bool isCompatible(Function *definition, Symbol *declaration, QualifiedNameId *declarationName)
{ {
Function *declTy = declaration->type()->asFunction(); Function *declTy = declaration->type()->asFunctionType();
if (! declTy) if (! declTy)
return false; return false;
@@ -507,7 +507,7 @@ void CPPEditor::switchDeclarationDefinition()
if (declaration) if (declaration)
openEditorAt(declaration); openEditorAt(declaration);
} else if (lastSymbol->type()->isFunction()) { } else if (lastSymbol->type()->isFunctionType()) {
if (Symbol *def = findDefinition(lastSymbol)) if (Symbol *def = findDefinition(lastSymbol))
openEditorAt(def); openEditorAt(def);
} }
@@ -594,7 +594,7 @@ Symbol *CPPEditor::findDefinition(Symbol *symbol)
if (symbol->isFunction()) if (symbol->isFunction())
return 0; // symbol is a function definition. return 0; // symbol is a function definition.
Function *funTy = symbol->type()->asFunction(); Function *funTy = symbol->type()->asFunctionType();
if (! funTy) if (! funTy)
return 0; // symbol does not have function type. return 0; // symbol does not have function type.

View File

@@ -147,13 +147,13 @@ static QString buildHelpId(const FullySpecifiedType &type,
Name *name = 0; Name *name = 0;
Scope *scope = 0; Scope *scope = 0;
if (const Function *f = type->asFunction()) { if (const Function *f = type->asFunctionType()) {
name = f->name(); name = f->name();
scope = f->scope(); scope = f->scope();
} else if (const Class *c = type->asClass()) { } else if (const Class *c = type->asClassType()) {
name = c->name(); name = c->name();
scope = c->scope(); scope = c->scope();
} else if (const Enum *e = type->asEnum()) { } else if (const Enum *e = type->asEnumType()) {
name = e->name(); name = e->name();
scope = e->scope(); scope = e->scope();
} else if (const NamedType *t = type->asNamedType()) { } else if (const NamedType *t = type->asNamedType()) {
@@ -270,7 +270,7 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
m_helpId = buildHelpId(docType, symbol); m_helpId = buildHelpId(docType, symbol);
QString displayName = buildHelpId(firstType, symbol); QString displayName = buildHelpId(firstType, symbol);
if (!firstType->isClass() && !firstType->isNamedType()) { if (!firstType->isClassType() && !firstType->isNamedType()) {
Overview overview; Overview overview;
overview.setShowArgumentNames(true); overview.setShowArgumentNames(true);
overview.setShowReturnTypes(true); overview.setShowReturnTypes(true);

View File

@@ -512,7 +512,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
context = typeOfExpression.lookupContext(); context = typeOfExpression.lookupContext();
} }
if (! resolvedTypes.isEmpty()) { if (! resolvedTypes.isEmpty() && resolvedTypes.first().first) {
FullySpecifiedType exprTy = resolvedTypes.first().first; FullySpecifiedType exprTy = resolvedTypes.first().first;
if (exprTy->isReferenceType()) if (exprTy->isReferenceType())
@@ -549,9 +549,9 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
// If it's a class, add completions for the constructors // If it's a class, add completions for the constructors
foreach (const TypeOfExpression::Result &result, results) { foreach (const TypeOfExpression::Result &result, results) {
if (result.first->isClass()) { if (result.first->isClassType()) {
FullySpecifiedType exprTy = result.first; FullySpecifiedType exprTy = result.first;
if (completeConstructors(exprTy->asClass())) if (completeConstructors(exprTy->asClassType()))
return m_startPosition; return m_startPosition;
break; break;
} }
@@ -567,7 +567,7 @@ bool CppCodeCompletion::completeFunction(FullySpecifiedType exprTy,
const QList<TypeOfExpression::Result> &resolvedTypes, const QList<TypeOfExpression::Result> &resolvedTypes,
const LookupContext &) const LookupContext &)
{ {
if (Class *klass = exprTy->asClass()) { if (Class *klass = exprTy->asClassType()) {
completeConstructors(klass); completeConstructors(klass);
} else { } else {
ConvertToCompletionItem toCompletionItem(this); ConvertToCompletionItem toCompletionItem(this);
@@ -578,7 +578,7 @@ bool CppCodeCompletion::completeFunction(FullySpecifiedType exprTy,
QSet<QString> signatures; QSet<QString> signatures;
foreach (TypeOfExpression::Result p, resolvedTypes) { foreach (TypeOfExpression::Result p, resolvedTypes) {
FullySpecifiedType ty = p.first; FullySpecifiedType ty = p.first;
if (Function *fun = ty->asFunction()) { if (Function *fun = ty->asFunctionType()) {
if (TextEditor::CompletionItem item = toCompletionItem(fun)) { if (TextEditor::CompletionItem item = toCompletionItem(fun)) {
QString signature; QString signature;
signature += overview.prettyName(fun->name()); signature += overview.prettyName(fun->name());
@@ -612,7 +612,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
if (ReferenceType *refTy = ty->asReferenceType()) if (ReferenceType *refTy = ty->asReferenceType())
ty = refTy->elementType(); ty = refTy->elementType();
if (Class *classTy = ty->asClass()) { if (Class *classTy = ty->asClassType()) {
Symbol *symbol = result.second; Symbol *symbol = result.second;
if (symbol && ! symbol->isClass()) if (symbol && ! symbol->isClass())
classObjectCandidates.append(classTy); classObjectCandidates.append(classTy);
@@ -641,7 +641,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
foreach (TypeOfExpression::Result r, overloads) { foreach (TypeOfExpression::Result r, overloads) {
FullySpecifiedType ty = r.first; FullySpecifiedType ty = r.first;
Function *funTy = ty->asFunction(); Function *funTy = ty->asFunctionType();
if (! funTy) if (! funTy)
continue; continue;
@@ -674,7 +674,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
if (! classObjectCandidates.contains(c)) if (! classObjectCandidates.contains(c))
classObjectCandidates.append(c); classObjectCandidates.append(c);
} }
} else if (Class *classTy = ptrTy->elementType()->asClass()) { } else if (Class *classTy = ptrTy->elementType()->asClassType()) {
// typedef struct { int x } *Ptr; // typedef struct { int x } *Ptr;
// Ptr p; // Ptr p;
// p-> // p->
@@ -715,14 +715,14 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
++m_startPosition; ++m_startPosition;
namedTy = ptrTy->elementType()->asNamedType(); namedTy = ptrTy->elementType()->asNamedType();
} }
} else if (Class *classTy = ty->asClass()) { } else if (Class *classTy = ty->asClassType()) {
Symbol *symbol = result.second; Symbol *symbol = result.second;
if (symbol && ! symbol->isClass()) if (symbol && ! symbol->isClass())
classObjectCandidates.append(classTy); classObjectCandidates.append(classTy);
} else { } else {
namedTy = ty->asNamedType(); namedTy = ty->asNamedType();
if (! namedTy) { if (! namedTy) {
Function *fun = ty->asFunction(); Function *fun = ty->asFunctionType();
if (fun && (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope())) if (fun && (fun->scope()->isBlockScope() || fun->scope()->isNamespaceScope()))
namedTy = fun->returnType()->asNamedType(); namedTy = fun->returnType()->asNamedType();
} }
@@ -759,24 +759,24 @@ bool CppCodeCompletion::completeScope(const QList<TypeOfExpression::Result> &res
foreach (result, results) { foreach (result, results) {
FullySpecifiedType ty = result.first; FullySpecifiedType ty = result.first;
if (ty->isClass() || ty->isNamespace()) if (ty->isClassType() || ty->isNamespaceType())
break; break;
} }
FullySpecifiedType exprTy = result.first; FullySpecifiedType exprTy = result.first;
if (! exprTy) { if (! exprTy) {
return false; return false;
} else if (exprTy->asNamespace()) { } else if (exprTy->isNamespaceType()) {
QList<Symbol *> candidates; QList<Symbol *> candidates;
foreach (TypeOfExpression::Result p, results) { foreach (TypeOfExpression::Result p, results) {
if (Namespace *ns = p.first->asNamespace()) if (Namespace *ns = p.first->asNamespaceType())
candidates.append(ns); candidates.append(ns);
} }
completeNamespace(candidates, context); completeNamespace(candidates, context);
} else if (exprTy->isClass()) { } else if (exprTy->isClassType()) {
QList<Symbol *> candidates; QList<Symbol *> candidates;
foreach (TypeOfExpression::Result p, results) { foreach (TypeOfExpression::Result p, results) {
if (Class *k = p.first->asClass()) if (Class *k = p.first->asClassType())
candidates.append(k); candidates.append(k);
} }
completeClass(candidates, context); completeClass(candidates, context);
@@ -896,7 +896,7 @@ bool CppCodeCompletion::completeConstructors(Class *klass)
for (unsigned i = 0; i < klass->memberCount(); ++i) { for (unsigned i = 0; i < klass->memberCount(); ++i) {
Symbol *member = klass->memberAt(i); Symbol *member = klass->memberAt(i);
if (! member->type()->isFunction()) if (! member->type()->isFunctionType())
continue; continue;
else if (! member->identity()) else if (! member->identity())
continue; continue;
@@ -959,7 +959,7 @@ bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType,
for (unsigned i = 0; i < scope->symbolCount(); ++i) { for (unsigned i = 0; i < scope->symbolCount(); ++i) {
Symbol *member = scope->symbolAt(i); Symbol *member = scope->symbolAt(i);
Function *fun = member->type()->asFunction(); Function *fun = member->type()->asFunctionType();
if (! fun) if (! fun)
continue; continue;
if (wantSignals && ! fun->isSignal()) if (wantSignals && ! fun->isSignal())
@@ -1075,7 +1075,7 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
if (m_completionOperator == T_LPAREN) { if (m_completionOperator == T_LPAREN) {
if (symbol) { if (symbol) {
Function *function = symbol->type()->asFunction(); Function *function = symbol->type()->asFunctionType();
QTC_ASSERT(function, return); QTC_ASSERT(function, return);
m_functionArgumentWidget = new FunctionArgumentWidget(); m_functionArgumentWidget = new FunctionArgumentWidget();
@@ -1094,8 +1094,8 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
//qDebug() << "current symbol:" << overview.prettyName(symbol->name()) //qDebug() << "current symbol:" << overview.prettyName(symbol->name())
//<< overview.prettyType(symbol->type()); //<< overview.prettyType(symbol->type());
if (m_autoInsertBraces && symbol) { if (m_autoInsertBraces && symbol && symbol->type()) {
if (Function *function = symbol->type()->asFunction()) { if (Function *function = symbol->type()->asFunctionType()) {
// If the member is a function, automatically place the opening parenthesis, // If the member is a function, automatically place the opening parenthesis,
// except when it might take template parameters. // except when it might take template parameters.
const bool hasReturnType = function->returnType().isValid() || const bool hasReturnType = function->returnType().isValid() ||

View File

@@ -195,7 +195,7 @@ static const Function *findDeclaration(const Class *cl, const QString &functionN
const Overview overview; const Overview overview;
for (unsigned j = 0; j < mCount; j++) { // go through all members for (unsigned j = 0; j < mCount; j++) { // go through all members
if (const Declaration *decl = cl->memberAt(j)->asDeclaration()) if (const Declaration *decl = cl->memberAt(j)->asDeclaration())
if (const Function *fun = decl->type()->asFunction()) { if (const Function *fun = decl->type()->asFunctionType()) {
// Format signature // Format signature
QString memberFunction = overview.prettyName(fun->name()); QString memberFunction = overview.prettyName(fun->name());
memberFunction += QLatin1Char('('); memberFunction += QLatin1Char('(');
@@ -233,7 +233,7 @@ static bool isCompatible(const Name *name, const Name *otherName)
// TODO: remove me, see below // TODO: remove me, see below
static bool isCompatible(const Function *definition, const Symbol *declaration, const QualifiedNameId *declarationName) static bool isCompatible(const Function *definition, const Symbol *declaration, const QualifiedNameId *declarationName)
{ {
Function *declTy = declaration->type()->asFunction(); Function *declTy = declaration->type()->asFunctionType();
if (! declTy) if (! declTy)
return false; return false;
@@ -385,7 +385,7 @@ static void addDeclaration(const QString &docFileName, const Class *cl, const QS
const unsigned mCount = cl->memberCount(); const unsigned mCount = cl->memberCount();
for (unsigned j = 0; j < mCount; j++) { // go through all members for (unsigned j = 0; j < mCount; j++) { // go through all members
if (const Declaration *decl = cl->memberAt(j)->asDeclaration()) if (const Declaration *decl = cl->memberAt(j)->asDeclaration())
if (const Function *fun = decl->type()->asFunction()) { if (const Function *fun = decl->type()->asFunctionType()) {
// we are only interested in declarations of methods. // we are only interested in declarations of methods.
// fun->column() returns always 0, what can cause trouble in case in one // fun->column() returns always 0, what can cause trouble in case in one
// line if there is: "private slots: void foo();" // line if there is: "private slots: void foo();"

View File

@@ -130,8 +130,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
FullySpecifiedType ty = semantic()->check(ast->decl_specifier_seq, _scope); FullySpecifiedType ty = semantic()->check(ast->decl_specifier_seq, _scope);
FullySpecifiedType qualTy = ty.qualifiedType(); FullySpecifiedType qualTy = ty.qualifiedType();
if (_templateParameters) { if (_templateParameters && ty) {
if (Class *klass = ty->asClass()) { if (Class *klass = ty->asClassType()) {
klass->setTemplateParameters(_templateParameters); klass->setTemplateParameters(_templateParameters);
} }
} }
@@ -142,7 +142,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
FullySpecifiedType declTy = semantic()->check(it->declarator, qualTy, FullySpecifiedType declTy = semantic()->check(it->declarator, qualTy,
_scope, &name); _scope, &name);
if (Function *fun = declTy->asFunction()) { Function *fun = 0;
if (declTy && 0 != (fun = declTy->asFunctionType())) {
fun->setScope(_scope); fun->setScope(_scope);
fun->setName(name); fun->setName(name);
fun->setMethodKey(semantic()->currentMethodKey()); fun->setMethodKey(semantic()->currentMethodKey());
@@ -162,7 +163,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast)
symbol->setType(control()->integerType(IntegerType::Int)); symbol->setType(control()->integerType(IntegerType::Int));
symbol->setType(declTy); symbol->setType(declTy);
if (_templateParameters && it == ast->declarators && ! ty->asClass()) if (_templateParameters && it == ast->declarators && ty && ! ty->isClassType())
symbol->setTemplateParameters(_templateParameters); symbol->setTemplateParameters(_templateParameters);
symbol->setVisibility(semantic()->currentVisibility()); symbol->setVisibility(semantic()->currentVisibility());
@@ -225,13 +226,13 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
Name *name = 0; Name *name = 0;
FullySpecifiedType funTy = semantic()->check(ast->declarator, qualTy, FullySpecifiedType funTy = semantic()->check(ast->declarator, qualTy,
_scope, &name); _scope, &name);
Function *fun = funTy->asFunction(); if (! (funTy && funTy->isFunctionType())) {
if (! fun) {
translationUnit()->error(ast->firstToken(), translationUnit()->error(ast->firstToken(),
"expected a function prototype"); "expected a function prototype");
return false; return false;
} }
Function *fun = funTy->asFunctionType();
fun->setName(name); fun->setName(name);
fun->setTemplateParameters(_templateParameters); fun->setTemplateParameters(_templateParameters);
fun->setVisibility(semantic()->currentVisibility()); fun->setVisibility(semantic()->currentVisibility());

View File

@@ -135,9 +135,12 @@ bool CheckDeclarator::visit(DeclaratorAST *ast)
// ### check the initializer // ### check the initializer
// FullySpecifiedType exprTy = semantic()->check(ast->initializer, _scope); // FullySpecifiedType exprTy = semantic()->check(ast->initializer, _scope);
if (ast->initializer && _fullySpecifiedType->isFunction()) { if (ast->initializer && _fullySpecifiedType) {
_fullySpecifiedType->asFunction()->setPureVirtual(true); if (Function *funTy = _fullySpecifiedType->asFunctionType()) {
funTy->setPureVirtual(true);
}
} }
return false; return false;
} }

View File

@@ -319,7 +319,7 @@ bool CheckExpression::visit(QtMethodAST *ast)
Scope dummy; Scope dummy;
FullySpecifiedType methTy = semantic()->check(ast->declarator, FullySpecifiedType(), FullySpecifiedType methTy = semantic()->check(ast->declarator, FullySpecifiedType(),
&dummy, &name); &dummy, &name);
Function *fty = methTy->asFunction(); Function *fty = methTy->asFunctionType();
if (! fty) if (! fty)
translationUnit()->warning(ast->firstToken(), "expected a function declarator"); translationUnit()->warning(ast->firstToken(), "expected a function declarator");
else { else {

View File

@@ -66,6 +66,12 @@ class CPLUSPLUS_EXPORT VoidType: public Type
public: public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual const VoidType *asVoidType() const
{ return this; }
virtual VoidType *asVoidType()
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
}; };
@@ -91,6 +97,12 @@ public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual IntegerType *asIntegerType()
{ return this; }
virtual const IntegerType *asIntegerType() const
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -115,6 +127,12 @@ public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual const FloatType *asFloatType() const
{ return this; }
virtual FloatType *asFloatType()
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -132,6 +150,12 @@ public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual const PointerType *asPointerType() const
{ return this; }
virtual PointerType *asPointerType()
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -150,6 +174,12 @@ public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual const PointerToMemberType *asPointerToMemberType() const
{ return this; }
virtual PointerToMemberType *asPointerToMemberType()
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -168,6 +198,12 @@ public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual const ReferenceType *asReferenceType() const
{ return this; }
virtual ReferenceType *asReferenceType()
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -186,6 +222,12 @@ public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual const ArrayType *asArrayType() const
{ return this; }
virtual ArrayType *asArrayType()
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -204,6 +246,12 @@ public:
virtual bool isEqualTo(const Type *other) const; virtual bool isEqualTo(const Type *other) const;
virtual const NamedType *asNamedType() const
{ return this; }
virtual NamedType *asNamedType()
{ return this; }
protected: protected:
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);

View File

@@ -188,7 +188,7 @@ void Function::setTemplateParameters(Scope *templateParameters)
bool Function::isEqualTo(const Type *other) const bool Function::isEqualTo(const Type *other) const
{ {
const Function *o = other->asFunction(); const Function *o = other->asFunctionType();
if (! o) if (! o)
return false; return false;
Name *l = identity(); Name *l = identity();
@@ -323,7 +323,7 @@ FullySpecifiedType Enum::type() const
bool Enum::isEqualTo(const Type *other) const bool Enum::isEqualTo(const Type *other) const
{ {
const Enum *o = other->asEnum(); const Enum *o = other->asEnumType();
if (! o) if (! o)
return false; return false;
Name *l = identity(); Name *l = identity();
@@ -356,7 +356,7 @@ Namespace::~Namespace()
bool Namespace::isEqualTo(const Type *other) const bool Namespace::isEqualTo(const Type *other) const
{ {
const Namespace *o = other->asNamespace(); const Namespace *o = other->asNamespaceType();
if (! o) if (! o)
return false; return false;
Name *l = identity(); Name *l = identity();
@@ -458,7 +458,7 @@ FullySpecifiedType Class::type() const
bool Class::isEqualTo(const Type *other) const bool Class::isEqualTo(const Type *other) const
{ {
const Class *o = other->asClass(); const Class *o = other->asClassType();
if (! o) if (! o)
return false; return false;
Name *l = identity(); Name *l = identity();

View File

@@ -217,6 +217,12 @@ public:
virtual Enum *asEnum() virtual Enum *asEnum()
{ return this; } { return this; }
virtual const Enum *asEnumType() const
{ return this; }
virtual Enum *asEnumType()
{ return this; }
protected: protected:
virtual void visitSymbol0(SymbolVisitor *visitor); virtual void visitSymbol0(SymbolVisitor *visitor);
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -278,6 +284,12 @@ public:
virtual Function *asFunction() virtual Function *asFunction()
{ return this; } { return this; }
virtual const Function *asFunctionType() const
{ return this; }
virtual Function *asFunctionType()
{ return this; }
protected: protected:
virtual void visitSymbol0(SymbolVisitor *visitor); virtual void visitSymbol0(SymbolVisitor *visitor);
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -318,6 +330,12 @@ public:
virtual Namespace *asNamespace() virtual Namespace *asNamespace()
{ return this; } { return this; }
virtual const Namespace *asNamespaceType() const
{ return this; }
virtual Namespace *asNamespaceType()
{ return this; }
protected: protected:
virtual void visitSymbol0(SymbolVisitor *visitor); virtual void visitSymbol0(SymbolVisitor *visitor);
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);
@@ -388,6 +406,12 @@ public:
virtual Class *asClass() virtual Class *asClass()
{ return this; } { return this; }
virtual const Class *asClassType() const
{ return this; }
virtual Class *asClassType()
{ return this; }
protected: protected:
virtual void visitSymbol0(SymbolVisitor *visitor); virtual void visitSymbol0(SymbolVisitor *visitor);
virtual void accept0(TypeVisitor *visitor); virtual void accept0(TypeVisitor *visitor);

View File

@@ -64,121 +64,40 @@ Type::~Type()
{ } { }
bool Type::isVoidType() const bool Type::isVoidType() const
{ return dynamic_cast<const VoidType *>(this) != 0; } { return asVoidType() != 0; }
bool Type::isIntegerType() const bool Type::isIntegerType() const
{ return dynamic_cast<const IntegerType *>(this) != 0; } { return asIntegerType() != 0; }
bool Type::isFloatType() const bool Type::isFloatType() const
{ return dynamic_cast<const FloatType *>(this) != 0; } { return asFloatType() != 0; }
bool Type::isPointerType() const bool Type::isPointerType() const
{ return dynamic_cast<const PointerType *>(this) != 0; } { return asPointerType() != 0; }
bool Type::isPointerToMemberType() const bool Type::isPointerToMemberType() const
{ return dynamic_cast<const PointerToMemberType *>(this) != 0; } { return asPointerToMemberType() != 0; }
bool Type::isReferenceType() const bool Type::isReferenceType() const
{ return dynamic_cast<const ReferenceType *>(this) != 0; } { return asReferenceType() != 0; }
bool Type::isArrayType() const bool Type::isArrayType() const
{ return dynamic_cast<const ArrayType *>(this) != 0; } { return asArrayType() != 0; }
bool Type::isNamedType() const bool Type::isNamedType() const
{ return dynamic_cast<const NamedType *>(this) != 0; } { return asNamedType() != 0; }
bool Type::isFunction() const bool Type::isFunctionType() const
{ return dynamic_cast<const Function *>(this) != 0; } { return asFunctionType() != 0; }
bool Type::isNamespace() const bool Type::isNamespaceType() const
{ return dynamic_cast<const Namespace *>(this) != 0; } { return asNamespaceType() != 0; }
bool Type::isClass() const bool Type::isClassType() const
{ return dynamic_cast<const Class *>(this) != 0; } { return asClassType() != 0; }
bool Type::isEnum() const bool Type::isEnumType() const
{ return dynamic_cast<const Enum *>(this) != 0; } { return asEnumType() != 0; }
bool Type::isScopedSymbol() const
{ return dynamic_cast<const ScopedSymbol *>(this) != 0; }
const VoidType *Type::asVoidType() const
{ return dynamic_cast<const VoidType *>(this); }
const IntegerType *Type::asIntegerType() const
{ return dynamic_cast<const IntegerType *>(this); }
const FloatType *Type::asFloatType() const
{ return dynamic_cast<const FloatType *>(this); }
const PointerType *Type::asPointerType() const
{ return dynamic_cast<const PointerType *>(this); }
const PointerToMemberType *Type::asPointerToMemberType() const
{ return dynamic_cast<const PointerToMemberType *>(this); }
const ReferenceType *Type::asReferenceType() const
{ return dynamic_cast<const ReferenceType *>(this); }
const ArrayType *Type::asArrayType() const
{ return dynamic_cast<const ArrayType *>(this); }
const NamedType *Type::asNamedType() const
{ return dynamic_cast<const NamedType *>(this); }
const Function *Type::asFunction() const
{ return dynamic_cast<const Function *>(this); }
const Namespace *Type::asNamespace() const
{ return dynamic_cast<const Namespace *>(this); }
const Class *Type::asClass() const
{ return dynamic_cast<const Class *>(this); }
const Enum *Type::asEnum() const
{ return dynamic_cast<const Enum *>(this); }
const ScopedSymbol *Type::asScopedSymbol() const
{ return dynamic_cast<const ScopedSymbol *>(this); }
VoidType *Type::asVoidType()
{ return dynamic_cast<VoidType *>(this); }
IntegerType *Type::asIntegerType()
{ return dynamic_cast<IntegerType *>(this); }
FloatType *Type::asFloatType()
{ return dynamic_cast<FloatType *>(this); }
PointerType *Type::asPointerType()
{ return dynamic_cast<PointerType *>(this); }
PointerToMemberType *Type::asPointerToMemberType()
{ return dynamic_cast<PointerToMemberType *>(this); }
ReferenceType *Type::asReferenceType()
{ return dynamic_cast<ReferenceType *>(this); }
ArrayType *Type::asArrayType()
{ return dynamic_cast<ArrayType *>(this); }
NamedType *Type::asNamedType()
{ return dynamic_cast<NamedType *>(this); }
Function *Type::asFunction()
{ return dynamic_cast<Function *>(this); }
Namespace *Type::asNamespace()
{ return dynamic_cast<Namespace *>(this); }
Class *Type::asClass()
{ return dynamic_cast<Class *>(this); }
Enum *Type::asEnum()
{ return dynamic_cast<Enum *>(this); }
ScopedSymbol *Type::asScopedSymbol()
{ return dynamic_cast<ScopedSymbol *>(this); }
void Type::accept(TypeVisitor *visitor) void Type::accept(TypeVisitor *visitor)
{ {

View File

@@ -75,39 +75,36 @@ public:
bool isReferenceType() const; bool isReferenceType() const;
bool isArrayType() const; bool isArrayType() const;
bool isNamedType() const; bool isNamedType() const;
bool isFunction() const; bool isFunctionType() const;
bool isNamespace() const; bool isNamespaceType() const;
bool isClass() const; bool isClassType() const;
bool isEnum() const; bool isEnumType() const;
bool isScopedSymbol() const;
const VoidType *asVoidType() const; virtual const VoidType *asVoidType() const { return 0; }
const IntegerType *asIntegerType() const; virtual const IntegerType *asIntegerType() const { return 0; }
const FloatType *asFloatType() const; virtual const FloatType *asFloatType() const { return 0; }
const PointerType *asPointerType() const; virtual const PointerType *asPointerType() const { return 0; }
const PointerToMemberType *asPointerToMemberType() const; virtual const PointerToMemberType *asPointerToMemberType() const { return 0; }
const ReferenceType *asReferenceType() const; virtual const ReferenceType *asReferenceType() const { return 0; }
const ArrayType *asArrayType() const; virtual const ArrayType *asArrayType() const { return 0; }
const NamedType *asNamedType() const; virtual const NamedType *asNamedType() const { return 0; }
const Function *asFunction() const; virtual const Function *asFunctionType() const { return 0; }
const Namespace *asNamespace() const; virtual const Namespace *asNamespaceType() const { return 0; }
const Class *asClass() const; virtual const Class *asClassType() const { return 0; }
const Enum *asEnum() const; virtual const Enum *asEnumType() const { return 0; }
const ScopedSymbol *asScopedSymbol() const;
VoidType *asVoidType(); virtual VoidType *asVoidType() { return 0; }
IntegerType *asIntegerType(); virtual IntegerType *asIntegerType() { return 0; }
FloatType *asFloatType(); virtual FloatType *asFloatType() { return 0; }
PointerType *asPointerType(); virtual PointerType *asPointerType() { return 0; }
PointerToMemberType *asPointerToMemberType(); virtual PointerToMemberType *asPointerToMemberType() { return 0; }
ReferenceType *asReferenceType(); virtual ReferenceType *asReferenceType() { return 0; }
ArrayType *asArrayType(); virtual ArrayType *asArrayType() { return 0; }
NamedType *asNamedType(); virtual NamedType *asNamedType() { return 0; }
Function *asFunction(); virtual Function *asFunctionType() { return 0; }
Namespace *asNamespace(); virtual Namespace *asNamespaceType() { return 0; }
Class *asClass(); virtual Class *asClassType() { return 0; }
Enum *asEnum(); virtual Enum *asEnumType() { return 0; }
ScopedSymbol *asScopedSymbol();
void accept(TypeVisitor *visitor); void accept(TypeVisitor *visitor);
static void accept(Type *type, TypeVisitor *visitor); static void accept(Type *type, TypeVisitor *visitor);