From 2f9053921113aa1a48928b238d99f87049f98d54 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Mon, 9 Feb 2009 16:15:02 +0100 Subject: [PATCH] Reimplemented Symbol::as*() methods using virtual functions. --- src/shared/cplusplus/Symbol.cpp | 88 +++++---------------------------- src/shared/cplusplus/Symbol.h | 44 ++++++++--------- src/shared/cplusplus/Symbols.h | 66 +++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 99 deletions(-) diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp index cdcd3891188..8e9ba22bb78 100644 --- a/src/shared/cplusplus/Symbol.cpp +++ b/src/shared/cplusplus/Symbol.cpp @@ -320,102 +320,36 @@ bool Symbol::isPrivate() const { return _visibility == Private; } bool Symbol::isScopedSymbol() const -{ return dynamic_cast(this) != 0; } +{ return asScopedSymbol() != 0; } bool Symbol::isEnum() const -{ return dynamic_cast(this) != 0; } +{ return asEnum() != 0; } bool Symbol::isFunction() const -{ return dynamic_cast(this) != 0; } +{ return asFunction() != 0; } bool Symbol::isNamespace() const -{ return dynamic_cast(this) != 0; } +{ return asNamespace() != 0; } bool Symbol::isClass() const -{ return dynamic_cast(this) != 0; } +{ return asClass() != 0; } bool Symbol::isBlock() const -{ return dynamic_cast(this) != 0; } +{ return asBlock() != 0; } bool Symbol::isUsingNamespaceDirective() const -{ return dynamic_cast(this) != 0; } +{ return asUsingNamespaceDirective() != 0; } bool Symbol::isUsingDeclaration() const -{ return dynamic_cast(this) != 0; } +{ return asUsingDeclaration() != 0; } bool Symbol::isDeclaration() const -{ return dynamic_cast(this) != 0; } +{ return asDeclaration() != 0; } bool Symbol::isArgument() const -{ return dynamic_cast(this) != 0; } +{ return asArgument() != 0; } bool Symbol::isBaseClass() const -{ return dynamic_cast(this) != 0; } - -const ScopedSymbol *Symbol::asScopedSymbol() const -{ return dynamic_cast(this); } - -const Enum *Symbol::asEnum() const -{ return dynamic_cast(this); } - -const Function *Symbol::asFunction() const -{ return dynamic_cast(this); } - -const Namespace *Symbol::asNamespace() const -{ return dynamic_cast(this); } - -const Class *Symbol::asClass() const -{ return dynamic_cast(this); } - -const Block *Symbol::asBlock() const -{ return dynamic_cast(this); } - -const UsingNamespaceDirective *Symbol::asUsingNamespaceDirective() const -{ return dynamic_cast(this); } - -const UsingDeclaration *Symbol::asUsingDeclaration() const -{ return dynamic_cast(this); } - -const Declaration *Symbol::asDeclaration() const -{ return dynamic_cast(this); } - -const Argument *Symbol::asArgument() const -{ return dynamic_cast(this); } - -const BaseClass *Symbol::asBaseClass() const -{ return dynamic_cast(this); } - -ScopedSymbol *Symbol::asScopedSymbol() -{ return dynamic_cast(this); } - -Enum *Symbol::asEnum() -{ return dynamic_cast(this); } - -Function *Symbol::asFunction() -{ return dynamic_cast(this); } - -Namespace *Symbol::asNamespace() -{ return dynamic_cast(this); } - -Class *Symbol::asClass() -{ return dynamic_cast(this); } - -Block *Symbol::asBlock() -{ return dynamic_cast(this); } - -UsingNamespaceDirective *Symbol::asUsingNamespaceDirective() -{ return dynamic_cast(this); } - -UsingDeclaration *Symbol::asUsingDeclaration() -{ return dynamic_cast(this); } - -Declaration *Symbol::asDeclaration() -{ return dynamic_cast(this); } - -Argument *Symbol::asArgument() -{ return dynamic_cast(this); } - -BaseClass *Symbol::asBaseClass() -{ return dynamic_cast(this); } +{ return asBaseClass() != 0; } CPLUSPLUS_END_NAMESPACE diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h index e9d150e8d5e..2b9a428dce9 100644 --- a/src/shared/cplusplus/Symbol.h +++ b/src/shared/cplusplus/Symbol.h @@ -197,29 +197,29 @@ public: /// Returns true if this Symbol is a BaseClass. bool isBaseClass() const; - const ScopedSymbol *asScopedSymbol() const; - const Enum *asEnum() const; - const Function *asFunction() const; - const Namespace *asNamespace() const; - const Class *asClass() const; - const Block *asBlock() const; - const UsingNamespaceDirective *asUsingNamespaceDirective() const; - const UsingDeclaration *asUsingDeclaration() const; - const Declaration *asDeclaration() const; - const Argument *asArgument() const; - const BaseClass *asBaseClass() const; + virtual const ScopedSymbol *asScopedSymbol() const { return 0; } + virtual const Enum *asEnum() const { return 0; } + virtual const Function *asFunction() const { return 0; } + virtual const Namespace *asNamespace() const { return 0; } + virtual const Class *asClass() const { return 0; } + virtual const Block *asBlock() const { return 0; } + virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const { return 0; } + virtual const UsingDeclaration *asUsingDeclaration() const { return 0; } + virtual const Declaration *asDeclaration() const { return 0; } + virtual const Argument *asArgument() const { return 0; } + virtual const BaseClass *asBaseClass() const { return 0; } - ScopedSymbol *asScopedSymbol(); - Enum *asEnum(); - Function *asFunction(); - Namespace *asNamespace(); - Class *asClass(); - Block *asBlock(); - UsingNamespaceDirective *asUsingNamespaceDirective(); - UsingDeclaration *asUsingDeclaration(); - Declaration *asDeclaration(); - Argument *asArgument(); - BaseClass *asBaseClass(); + virtual ScopedSymbol *asScopedSymbol() { return 0; } + virtual Enum *asEnum() { return 0; } + virtual Function *asFunction() { return 0; } + virtual Namespace *asNamespace() { return 0; } + virtual Class *asClass() { return 0; } + virtual Block *asBlock() { return 0; } + virtual UsingNamespaceDirective *asUsingNamespaceDirective() { return 0; } + virtual UsingDeclaration *asUsingDeclaration() { return 0; } + virtual Declaration *asDeclaration() { return 0; } + virtual Argument *asArgument() { return 0; } + virtual BaseClass *asBaseClass() { return 0; } /// Returns this Symbol's type. virtual FullySpecifiedType type() const = 0; diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h index c69483a2519..c7b3e924b4f 100644 --- a/src/shared/cplusplus/Symbols.h +++ b/src/shared/cplusplus/Symbols.h @@ -71,6 +71,12 @@ public: // Symbol's interface virtual FullySpecifiedType type() const; + virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const + { return this; } + + virtual UsingNamespaceDirective *asUsingNamespaceDirective() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); }; @@ -84,6 +90,12 @@ public: // Symbol's interface virtual FullySpecifiedType type() const; + virtual const UsingDeclaration *asUsingDeclaration() const + { return this; } + + virtual UsingDeclaration *asUsingDeclaration() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); }; @@ -105,6 +117,12 @@ public: // Symbol's interface virtual FullySpecifiedType type() const; + virtual const Declaration *asDeclaration() const + { return this; } + + virtual Declaration *asDeclaration() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); @@ -127,6 +145,12 @@ public: // Symbol's interface virtual FullySpecifiedType type() const; + virtual const Argument *asArgument() const + { return this; } + + virtual Argument *asArgument() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); @@ -146,6 +170,12 @@ public: Scope *members() const; void addMember(Symbol *member); + virtual const ScopedSymbol *asScopedSymbol() const + { return this; } + + virtual ScopedSymbol *asScopedSymbol() + { return this; } + private: Scope *_members; }; @@ -159,6 +189,12 @@ public: // Symbol's interface virtual FullySpecifiedType type() const; + virtual const Block *asBlock() const + { return this; } + + virtual Block *asBlock() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); }; @@ -175,6 +211,12 @@ public: // Type's interface virtual bool isEqualTo(const Type *other) const; + virtual const Enum *asEnum() const + { return this; } + + virtual Enum *asEnum() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); virtual void accept0(TypeVisitor *visitor); @@ -230,6 +272,12 @@ public: // Type's interface virtual bool isEqualTo(const Type *other) const; + virtual const Function *asFunction() const + { return this; } + + virtual Function *asFunction() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); virtual void accept0(TypeVisitor *visitor); @@ -264,6 +312,12 @@ public: // Type's interface virtual bool isEqualTo(const Type *other) const; + virtual const Namespace *asNamespace() const + { return this; } + + virtual Namespace *asNamespace() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); virtual void accept0(TypeVisitor *visitor); @@ -281,6 +335,12 @@ public: // Symbol's interface virtual FullySpecifiedType type() const; + virtual const BaseClass *asBaseClass() const + { return this; } + + virtual BaseClass *asBaseClass() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); @@ -322,6 +382,12 @@ public: // Type's interface virtual bool isEqualTo(const Type *other) const; + virtual const Class *asClass() const + { return this; } + + virtual Class *asClass() + { return this; } + protected: virtual void visitSymbol0(SymbolVisitor *visitor); virtual void accept0(TypeVisitor *visitor);