diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-12-10 10:32:46 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-12-10 10:32:46 +0100 |
commit | 63138eb808762e3f5b2f16ea21b860b7936af216 (patch) | |
tree | 0b7b873c5cb5d87d5b61c9d1c70a14681a7cc0a2 /src/shared/cplusplus | |
parent | 610023f893d92db04964ac5243237161623c64f6 (diff) | |
download | qt-creator-63138eb808762e3f5b2f16ea21b860b7936af216.tar.gz |
Added some initial support for function overloading.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/Control.cpp | 16 | ||||
-rw-r--r-- | src/shared/cplusplus/Control.h | 3 | ||||
-rw-r--r-- | src/shared/cplusplus/Symbols.cpp | 24 | ||||
-rw-r--r-- | src/shared/cplusplus/Symbols.h | 2 |
4 files changed, 45 insertions, 0 deletions
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); |