From 5a0b7f8ec8376882bf2c1dc5a701fd813d8d827d Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 8 Dec 2009 11:34:22 +0100 Subject: [PATCH] Added initializers to the formal arguments. --- src/libs/cplusplus/GenTemplateInstance.cpp | 2 +- src/libs/cplusplus/TypePrettyPrinter.cpp | 6 ++++++ src/shared/cplusplus/CheckDeclaration.cpp | 16 ++++++++++++++-- src/shared/cplusplus/CheckName.cpp | 2 +- src/shared/cplusplus/Symbols.cpp | 9 ++++++--- src/shared/cplusplus/Symbols.h | 6 ++++-- 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/libs/cplusplus/GenTemplateInstance.cpp b/src/libs/cplusplus/GenTemplateInstance.cpp index 16aee2f9577..9a573161797 100644 --- a/src/libs/cplusplus/GenTemplateInstance.cpp +++ b/src/libs/cplusplus/GenTemplateInstance.cpp @@ -144,7 +144,7 @@ private: originalArgument->name()); arg->setType(q->apply(originalArgument->type())); - arg->setInitializer(originalArgument->hasInitializer()); + arg->setInitializer(originalArgument->initializer()); fun->arguments()->enterSymbol(arg); } diff --git a/src/libs/cplusplus/TypePrettyPrinter.cpp b/src/libs/cplusplus/TypePrettyPrinter.cpp index 2434e866127..3f4e1274c3d 100644 --- a/src/libs/cplusplus/TypePrettyPrinter.cpp +++ b/src/libs/cplusplus/TypePrettyPrinter.cpp @@ -30,6 +30,7 @@ #include "Overview.h" #include "TypePrettyPrinter.h" #include +#include #include #include #include @@ -334,6 +335,11 @@ void TypePrettyPrinter::visit(Function *type) _text += argumentText(arg->type(), name); + if (const StringLiteral *initializer = arg->initializer()) { + _text += QLatin1String(" ="); + _text += QString::fromUtf8(initializer->chars(), initializer->size()); + } + if (index + 1 == _overview->markedArgument()) const_cast(_overview)->setMarkedArgumentEnd(_text.length()); } diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 426a7d9de2b..3349263e1eb 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -56,6 +56,7 @@ #include "Symbols.h" #include "Control.h" #include "Literals.h" +#include #include using namespace CPlusPlus; @@ -419,8 +420,19 @@ bool CheckDeclaration::visit(ParameterDeclarationAST *ast) FullySpecifiedType exprTy = semantic()->check(ast->expression, _scope); Argument *arg = control()->newArgument(sourceLocation, argName); ast->symbol = arg; - if (ast->expression) - arg->setInitializer(true); + if (ast->expression) { + unsigned startOfExpression = ast->expression->firstToken(); + unsigned endOfExpression = ast->expression->lastToken(); + std::string buffer; + for (unsigned index = startOfExpression; index != endOfExpression; ++index) { + const Token &tk = tokenAt(index); + if (tk.whitespace() || tk.newline()) + buffer += ' '; + buffer += tk.spell(); + } + const StringLiteral *initializer = control()->findOrInsertStringLiteral(buffer.c_str(), buffer.size()); + arg->setInitializer(initializer); + } arg->setType(argTy); _scope->enterSymbol(arg); return false; diff --git a/src/shared/cplusplus/CheckName.cpp b/src/shared/cplusplus/CheckName.cpp index 11688aba481..8f275515dfd 100644 --- a/src/shared/cplusplus/CheckName.cpp +++ b/src/shared/cplusplus/CheckName.cpp @@ -426,7 +426,7 @@ bool CheckName::visit(ObjCMessageArgumentDeclarationAST *ast) Argument *arg = control()->newArgument(ast->firstToken(), _name); ast->argument = arg; arg->setType(type); - arg->setInitializer(false); + arg->setInitializer(0); _scope->enterSymbol(arg); } diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index 22098f82b56..9e1d169b2b8 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -128,17 +128,20 @@ void Declaration::visitSymbol0(SymbolVisitor *visitor) Argument::Argument(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name) : Symbol(translationUnit, sourceLocation, name), - _initializer(false) + _initializer(0) { } Argument::~Argument() { } bool Argument::hasInitializer() const +{ return _initializer != 0; } + +const StringLiteral *Argument::initializer() const { return _initializer; } -void Argument::setInitializer(bool hasInitializer) -{ _initializer = hasInitializer; } +void Argument::setInitializer(const StringLiteral *initializer) +{ _initializer = initializer; } void Argument::setType(const FullySpecifiedType &type) { _type = type; } diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h index a75d09e0ffd..bd261bedb76 100644 --- a/src/shared/cplusplus/Symbols.h +++ b/src/shared/cplusplus/Symbols.h @@ -148,7 +148,9 @@ public: void setType(const FullySpecifiedType &type); bool hasInitializer() const; - void setInitializer(bool hasInitializer); + + const StringLiteral *initializer() const; + void setInitializer(const StringLiteral *initializer); // Symbol's interface virtual FullySpecifiedType type() const; @@ -164,7 +166,7 @@ protected: private: FullySpecifiedType _type; - bool _initializer: 1; + const StringLiteral *_initializer; }; class CPLUSPLUS_EXPORT ScopedSymbol: public Symbol