summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2011-05-09 13:52:03 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2011-05-09 14:00:32 +0200
commit908d73f0d004cc5af5b846eacf94a2f97dec349d (patch)
treeb92554e2b9ba693a13d9814145dbfbc7275b6c2a /src/shared/cplusplus
parent49814d9ea5dbcfc14cee09dc221a43c2ab9bbc65 (diff)
downloadqt-creator-908d73f0d004cc5af5b846eacf94a2f97dec349d.tar.gz
Added the Enumerator class as a special Declaration.
Reviewed-by: Roberto Raggi
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/Bind.cpp30
-rw-r--r--src/shared/cplusplus/Bind.h1
-rw-r--r--src/shared/cplusplus/CPlusPlusForwardDeclarations.h1
-rw-r--r--src/shared/cplusplus/Control.cpp10
-rw-r--r--src/shared/cplusplus/Control.h3
-rw-r--r--src/shared/cplusplus/Symbols.cpp14
-rw-r--r--src/shared/cplusplus/Symbols.h25
7 files changed, 73 insertions, 11 deletions
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index ba02d718fc..0b6bda0d6e 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -475,12 +475,17 @@ void Bind::enumerator(EnumeratorAST *ast, Enum *symbol)
// unsigned identifier_token = ast->identifier_token;
// unsigned equal_token = ast->equal_token;
- ExpressionTy expression = this->expression(ast->expression);
+ /*ExpressionTy expression =*/ this->expression(ast->expression);
if (ast->identifier_token) {
const Name *name = identifier(ast->identifier_token);
- Declaration *e = control()->newDeclaration(ast->identifier_token, name);
+ EnumeratorDeclaration *e = control()->newEnumeratorDeclaration(ast->identifier_token, name);
e->setType(control()->integerType(IntegerType::Int)); // ### introduce IntegerType::Enumerator
+
+ if (ExpressionAST *expr = ast->expression) {
+ e->setConstantValue(asStringLiteral(expr->firstToken(), expr->lastToken()));
+ }
+
symbol->addMember(e);
}
}
@@ -1146,6 +1151,17 @@ FullySpecifiedType Bind::trailingReturnType(TrailingReturnTypeAST *ast, const Fu
return type;
}
+const StringLiteral *Bind::asStringLiteral(unsigned firstToken, unsigned lastToken)
+{
+ std::string buffer;
+ for (unsigned index = firstToken; index != lastToken; ++index) {
+ const Token &tk = tokenAt(index);
+ if (tk.whitespace() || tk.newline())
+ buffer += ' ';
+ buffer += tk.spell();
+ }
+ return control()->stringLiteral(buffer.c_str(), buffer.size());
+}
// StatementAST
bool Bind::visit(QtMemberDeclarationAST *ast)
@@ -2140,15 +2156,7 @@ bool Bind::visit(ParameterDeclarationAST *ast)
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()->stringLiteral(buffer.c_str(), buffer.size());
- arg->setInitializer(initializer);
+ arg->setInitializer(asStringLiteral(startOfExpression, endOfExpression));
}
_scope->addMember(arg);
diff --git a/src/shared/cplusplus/Bind.h b/src/shared/cplusplus/Bind.h
index 0ee1793a70..bf12c09099 100644
--- a/src/shared/cplusplus/Bind.h
+++ b/src/shared/cplusplus/Bind.h
@@ -136,6 +136,7 @@ protected:
void capture(CaptureAST *ast);
void lambdaDeclarator(LambdaDeclaratorAST *ast);
FullySpecifiedType trailingReturnType(TrailingReturnTypeAST *ast, const FullySpecifiedType &init);
+ const StringLiteral *asStringLiteral(unsigned firstToken, unsigned lastToken);
virtual bool preVisit(AST *);
virtual void postVisit(AST *);
diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
index c085612ac6..cb488676b0 100644
--- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
+++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
@@ -126,6 +126,7 @@ class BaseClass;
class Block;
class Class;
class Enum;
+class EnumeratorDeclaration;
class ForwardClassDeclaration;
class Token;
diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index 557b5b0fc5..3492077a94 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -326,6 +326,13 @@ public:
return declaration;
}
+ EnumeratorDeclaration *newEnumeratorDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ EnumeratorDeclaration *decl = new EnumeratorDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(decl);
+ return decl;
+ }
+
Argument *newArgument(unsigned sourceLocation, const Name *name)
{
Argument *argument = new Argument(translationUnit, sourceLocation, name);
@@ -713,6 +720,9 @@ Block *Control::newBlock(unsigned sourceLocation)
Declaration *Control::newDeclaration(unsigned sourceLocation, const Name *name)
{ return d->newDeclaration(sourceLocation, name); }
+EnumeratorDeclaration *Control::newEnumeratorDeclaration(unsigned sourceLocation, const Name *name)
+{ return d->newEnumeratorDeclaration(sourceLocation, name); }
+
UsingNamespaceDirective *Control::newUsingNamespaceDirective(unsigned sourceLocation,
const Name *name)
{ return d->newUsingNamespaceDirective(sourceLocation, name); }
diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h
index 6a6cc88a95..2ca59f885a 100644
--- a/src/shared/cplusplus/Control.h
+++ b/src/shared/cplusplus/Control.h
@@ -129,6 +129,9 @@ public:
/// Creates a new Declaration symbol.
Declaration *newDeclaration(unsigned sourceLocation, const Name *name);
+ /// Creates a new EnumeratorDeclaration symbol.
+ EnumeratorDeclaration *newEnumeratorDeclaration(unsigned sourceLocation, const Name *name);
+
/// Creates a new Argument symbol.
Argument *newArgument(unsigned sourceLocation, const Name *name = 0);
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index e5d41e8ba8..e6f20bbeaf 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -123,6 +123,20 @@ FullySpecifiedType Declaration::type() const
void Declaration::visitSymbol0(SymbolVisitor *visitor)
{ visitor->visit(this); }
+EnumeratorDeclaration::EnumeratorDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
+ : Declaration(translationUnit, sourceLocation, name)
+ , _constantValue(0)
+{}
+
+EnumeratorDeclaration::~EnumeratorDeclaration()
+{}
+
+const StringLiteral *EnumeratorDeclaration::constantValue() const
+{ return _constantValue; }
+
+void EnumeratorDeclaration::setConstantValue(const StringLiteral *constantValue)
+{ _constantValue = constantValue; }
+
Argument::Argument(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
: Symbol(translationUnit, sourceLocation, name),
_initializer(0)
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index 9fecc69d91..452d2622ce 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -141,6 +141,12 @@ public:
virtual Declaration *asDeclaration()
{ return this; }
+ virtual EnumeratorDeclaration *asEnumeratorDeclarator()
+ { return 0; }
+
+ virtual const EnumeratorDeclaration *asEnumeratorDeclarator() const
+ { return 0; }
+
protected:
virtual void visitSymbol0(SymbolVisitor *visitor);
@@ -148,6 +154,25 @@ private:
FullySpecifiedType _type;
};
+class CPLUSPLUS_EXPORT EnumeratorDeclaration: public Declaration
+{
+public:
+ EnumeratorDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name);
+ virtual ~EnumeratorDeclaration();
+
+ const StringLiteral *constantValue() const;
+ void setConstantValue(const StringLiteral *constantValue);
+
+ virtual EnumeratorDeclaration *asEnumeratorDeclarator()
+ { return this; }
+
+ virtual const EnumeratorDeclaration *asEnumeratorDeclarator() const
+ { return this; }
+
+private:
+ const StringLiteral *_constantValue;
+};
+
class CPLUSPLUS_EXPORT Argument: public Symbol
{
public: