From 63138eb808762e3f5b2f16ea21b860b7936af216 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 10 Dec 2010 10:32:46 +0100 Subject: Added some initial support for function overloading. --- src/shared/cplusplus/Control.cpp | 16 ++++++++++++++++ src/shared/cplusplus/Control.h | 3 +++ src/shared/cplusplus/Symbols.cpp | 24 ++++++++++++++++++++++++ src/shared/cplusplus/Symbols.h | 2 ++ 4 files changed, 45 insertions(+) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index 4cfd8de636..d36e8b809f 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -759,6 +759,22 @@ const Identifier *Control::objcCopyId() const const Identifier *Control::objcNonatomicId() const { return d->objcNonatomicId; } +Symbol **Control::firstSymbol() const +{ + if (d->symbols.empty()) + return 0; + + return &*d->symbols.begin(); +} + +Symbol **Control::lastSymbol() const +{ + if (d->symbols.empty()) + return 0; + + return &*d->symbols.begin() + d->symbols.size(); +} + bool Control::hasSymbol(Symbol *symbol) const { return std::find(d->symbols.begin(), d->symbols.end(), symbol) != d->symbols.end(); diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h index e475a17567..461c6453f6 100644 --- a/src/shared/cplusplus/Control.h +++ b/src/shared/cplusplus/Control.h @@ -212,6 +212,9 @@ public: const NumericLiteral *numericLiteral(const char *chars, unsigned size); const NumericLiteral *numericLiteral(const char *chars); + Symbol **firstSymbol() const; + Symbol **lastSymbol() const; + bool hasSymbol(Symbol *symbol) const; void squeeze(); diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index 0bb231e796..d2b402ea5f 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -362,6 +362,30 @@ void Function::visitSymbol0(SymbolVisitor *visitor) } } +bool Function::maybeValidPrototype(unsigned actualArgumentCount) const +{ + unsigned minNumberArguments = 0; + + for (; minNumberArguments < this->argumentCount(); ++minNumberArguments) { + Argument *arg = this->argumentAt(minNumberArguments)->asArgument(); + + if (arg->hasInitializer()) + break; + } + + if (actualArgumentCount < minNumberArguments) { + // not enough arguments. + return false; + + } else if (! this->isVariadic() && actualArgumentCount > this->argumentCount()) { + // too many arguments. + return false; + } + + return true; +} + + Block::Block(TranslationUnit *translationUnit, unsigned sourceLocation) : Scope(translationUnit, sourceLocation, /*name = */ 0) { } diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h index cd618a9c87..f27502796a 100644 --- a/src/shared/cplusplus/Symbols.h +++ b/src/shared/cplusplus/Symbols.h @@ -350,6 +350,8 @@ public: bool isAmbiguous() const; // internal void setAmbiguous(bool isAmbiguous); // internal + bool maybeValidPrototype(unsigned actualArgumentCount) const; + protected: virtual void visitSymbol0(SymbolVisitor *visitor); virtual void accept0(TypeVisitor *visitor); -- cgit v1.2.1