summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-12-10 10:32:46 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-12-10 10:32:46 +0100
commit63138eb808762e3f5b2f16ea21b860b7936af216 (patch)
tree0b7b873c5cb5d87d5b61c9d1c70a14681a7cc0a2 /src/shared/cplusplus
parent610023f893d92db04964ac5243237161623c64f6 (diff)
downloadqt-creator-63138eb808762e3f5b2f16ea21b860b7936af216.tar.gz
Added some initial support for function overloading.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/Control.cpp16
-rw-r--r--src/shared/cplusplus/Control.h3
-rw-r--r--src/shared/cplusplus/Symbols.cpp24
-rw-r--r--src/shared/cplusplus/Symbols.h2
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);