summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 10:50:40 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-08-13 10:50:40 +0200
commit65681dfbe198e3cb58370ad1b35ae7cda77197f7 (patch)
tree91d2090a26a63beeecd7fb7de5dcc1b6dcd20ad0 /src/shared/cplusplus
parent9c7d70b02d95c05ef0887eced8dbfea9057e990b (diff)
downloadqt-creator-65681dfbe198e3cb58370ad1b35ae7cda77197f7.tar.gz
Bind function definitions.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/Bind.cpp49
-rw-r--r--src/shared/cplusplus/Bind.h8
2 files changed, 47 insertions, 10 deletions
diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index 1a048e6f23..ebaac0a934 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -69,12 +69,26 @@ Bind::Bind(TranslationUnit *unit)
_name(0),
_declaratorId(0),
_visibility(Symbol::Public),
- _methodKey(Function::NormalMethod)
+ _methodKey(Function::NormalMethod),
+ _skipFunctionBodies(false)
{
}
+bool Bind::skipFunctionBodies() const
+{
+ return _skipFunctionBodies;
+}
+
+void Bind::setSkipFunctionBodies(bool skipFunctionBodies)
+{
+ _skipFunctionBodies = skipFunctionBodies;
+}
+
Scope *Bind::switchScope(Scope *scope)
{
+ if (! scope)
+ return _scope;
+
std::swap(_scope, scope);
return scope;
}
@@ -312,14 +326,14 @@ bool Bind::visit(CtorInitializerAST *ast)
return false;
}
-void Bind::ctorInitializer(CtorInitializerAST *ast)
+void Bind::ctorInitializer(CtorInitializerAST *ast, Function *fun)
{
if (! ast)
return;
// unsigned colon_token = ast->colon_token;
for (MemInitializerListAST *it = ast->member_initializer_list; it; it = it->next) {
- this->memInitializer(it->value);
+ this->memInitializer(it->value, fun);
}
// unsigned dot_dot_dot_token = ast->dot_dot_dot_token;
}
@@ -372,17 +386,18 @@ bool Bind::visit(MemInitializerAST *ast)
return false;
}
-void Bind::memInitializer(MemInitializerAST *ast)
+void Bind::memInitializer(MemInitializerAST *ast, Function *fun)
{
if (! ast)
return;
/*const Name *name =*/ this->name(ast->name);
- // unsigned lparen_token = ast->lparen_token;
+
+ Scope *previousScope = switchScope(fun);
for (ExpressionListAST *it = ast->expression_list; it; it = it->next) {
/*ExpressionTy value =*/ this->expression(it->value);
}
- // unsigned rparen_token = ast->rparen_token;
+ (void) switchScope(previousScope);
}
bool Bind::visit(NestedNameSpecifierAST *ast)
@@ -1628,8 +1643,26 @@ bool Bind::visit(FunctionDefinitionAST *ast)
}
DeclaratorIdAST *declaratorId = 0;
type = this->declarator(ast->declarator, type, &declaratorId);
- this->ctorInitializer(ast->ctor_initializer);
- this->statement(ast->function_body);
+ Function *fun = type->asFunctionType();
+ ast->symbol = fun;
+
+ if (fun) {
+ if (_scope->isClass()) {
+ fun->setVisibility(_visibility);
+ fun->setMethodKey(_methodKey);
+ }
+ _scope->addMember(fun);
+ } else
+ translationUnit()->warning(ast->firstToken(), "expected a function declarator");
+
+ this->ctorInitializer(ast->ctor_initializer, fun);
+
+ if (! _skipFunctionBodies) {
+ Scope *previousScope = switchScope(fun);
+ this->statement(ast->function_body);
+ (void) switchScope(previousScope);
+ }
+
// Function *symbol = ast->symbol;
return false;
}
diff --git a/src/shared/cplusplus/Bind.h b/src/shared/cplusplus/Bind.h
index e9b5c77b6d..05464d6072 100644
--- a/src/shared/cplusplus/Bind.h
+++ b/src/shared/cplusplus/Bind.h
@@ -61,6 +61,9 @@ public:
void operator()(TranslationUnitAST *ast, Namespace *globalNamespace);
+ bool skipFunctionBodies() const;
+ void setSkipFunctionBodies(bool skipFunctionBodies);
+
protected:
using ASTVisitor::translationUnit;
@@ -89,10 +92,10 @@ protected:
void qtPropertyDeclarationItem(QtPropertyDeclarationItemAST *ast);
void qtInterfaceName(QtInterfaceNameAST *ast);
void baseSpecifier(BaseSpecifierAST *ast, unsigned colon_token, Class *klass);
- void ctorInitializer(CtorInitializerAST *ast);
+ void ctorInitializer(CtorInitializerAST *ast, Function *fun);
void enumerator(EnumeratorAST *ast);
FullySpecifiedType exceptionSpecification(ExceptionSpecificationAST *ast, const FullySpecifiedType &init);
- void memInitializer(MemInitializerAST *ast);
+ void memInitializer(MemInitializerAST *ast, Function *fun);
const Name *nestedNameSpecifier(NestedNameSpecifierAST *ast);
void newPlacement(NewPlacementAST *ast);
FullySpecifiedType newArrayDeclarator(NewArrayDeclaratorAST *ast, const FullySpecifiedType &init);
@@ -281,6 +284,7 @@ private:
DeclaratorIdAST **_declaratorId;
int _visibility;
int _methodKey;
+ bool _skipFunctionBodies;
};
} // end of namespace CPlusPlus