diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 5eb98735d1e319425968477b6ba771784f3ce3c7..94b7b845b9744638fc7b89bfadbd5ed1a18d5565 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -113,6 +113,42 @@ TemplateParameters *CheckDeclaration::switchTemplateParameters(TemplateParameter return previousTemplateParameters; } +void CheckDeclaration::setDeclSpecifiers(Symbol *symbol, const FullySpecifiedType &declSpecifiers) +{ + if (! symbol) + return; + + int storage = Symbol::NoStorage; + + if (declSpecifiers.isFriend()) + storage = Symbol::Friend; + else if (declSpecifiers.isAuto()) + storage = Symbol::Auto; + else if (declSpecifiers.isRegister()) + storage = Symbol::Register; + else if (declSpecifiers.isStatic()) + storage = Symbol::Static; + else if (declSpecifiers.isExtern()) + storage = Symbol::Extern; + else if (declSpecifiers.isMutable()) + storage = Symbol::Mutable; + else if (declSpecifiers.isTypedef()) + storage = Symbol::Typedef; + + symbol->setStorage(storage); + + if (Function *funTy = symbol->asFunction()) { + if (declSpecifiers.isVirtual()) + funTy->setVirtual(true); + } + + if (declSpecifiers.isDeprecated()) + symbol->setDeprecated(true); + + if (declSpecifiers.isUnavailable()) + symbol->setUnavailable(true); +} + void CheckDeclaration::checkFunctionArguments(Function *fun) { if (! _checkAnonymousArguments) @@ -133,11 +169,11 @@ void CheckDeclaration::checkFunctionArguments(Function *fun) bool CheckDeclaration::visit(SimpleDeclarationAST *ast) { - FullySpecifiedType ty = semantic()->check(ast->decl_specifier_list, _scope); - FullySpecifiedType qualTy = ty.qualifiedType(); + FullySpecifiedType declSpecifiers = semantic()->check(ast->decl_specifier_list, _scope); + FullySpecifiedType qualTy = declSpecifiers.qualifiedType(); - if (_templateParameters && ty) { - if (Class *klass = ty->asClassType()) { + if (_templateParameters && declSpecifiers) { + if (Class *klass = declSpecifiers->asClassType()) { klass->setTemplateParameters(_templateParameters); _templateParameters = 0; // consume the template parameters } @@ -146,7 +182,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) if (ast->decl_specifier_list && ! ast->declarator_list) { ElaboratedTypeSpecifierAST *elab_type_spec = ast->decl_specifier_list->value->asElaboratedTypeSpecifier(); - if (! elab_type_spec && ty.isFriend() && ast->decl_specifier_list->next && ! ast->decl_specifier_list->next->next) { + if (! elab_type_spec && declSpecifiers.isFriend() && ast->decl_specifier_list->next && ! ast->decl_specifier_list->next->next) { // friend template class elab_type_spec = ast->decl_specifier_list->next->value->asElaboratedTypeSpecifier(); } @@ -163,13 +199,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) _templateParameters = 0; } - if (ty.isDeprecated()) - symbol->setDeprecated(true); - if (ty.isUnavailable()) - symbol->setUnavailable(true); - - if (ty.isFriend()) - symbol->setStorage(Symbol::Friend); + setDeclSpecifiers(symbol, declSpecifiers); _scope->enterSymbol(symbol); return false; @@ -196,11 +226,9 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) fun->setScope(_scope); fun->setName(name); fun->setMethodKey(semantic()->currentMethodKey()); - fun->setVirtual(ty.isVirtual()); - if (ty.isDeprecated()) - fun->setDeprecated(true); - if (ty.isUnavailable()) - fun->setUnavailable(true); + + setDeclSpecifiers(fun, declSpecifiers); + if (isQ_SIGNAL) fun->setMethodKey(Function::SignalMethod); else if (isQ_SLOT) @@ -216,10 +244,8 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) Declaration *symbol = control()->newDeclaration(location, name); symbol->setType(declTy); - if (declTy.isDeprecated()) - symbol->setDeprecated(true); - if (declTy.isUnavailable()) - symbol->setUnavailable(true); + + setDeclSpecifiers(symbol, declSpecifiers); if (_templateParameters && it == ast->declarator_list) { symbol->setTemplateParameters(_templateParameters); @@ -228,26 +254,6 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) symbol->setVisibility(semantic()->currentVisibility()); - if (ty.isFriend()) - symbol->setStorage(Symbol::Friend); - else if (ty.isAuto()) - symbol->setStorage(Symbol::Auto); - else if (ty.isRegister()) - symbol->setStorage(Symbol::Register); - else if (ty.isStatic()) - symbol->setStorage(Symbol::Static); - else if (ty.isExtern()) - symbol->setStorage(Symbol::Extern); - else if (ty.isMutable()) - symbol->setStorage(Symbol::Mutable); - else if (ty.isTypedef()) - symbol->setStorage(Symbol::Typedef); - - if (ty.isDeprecated()) - symbol->setDeprecated(true); - if (ty.isUnavailable()) - symbol->setUnavailable(true); - if (it->value && it->value->initializer) { FullySpecifiedType initTy = semantic()->check(it->value->initializer, _scope); } @@ -328,11 +334,8 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast) } Function *fun = funTy->asFunctionType(); - fun->setVirtual(ty.isVirtual()); - if (ty.isDeprecated()) - fun->setDeprecated(true); - if (ty.isUnavailable()) - fun->setUnavailable(true); + setDeclSpecifiers(fun, ty); + fun->members()->setStartOffset(funStartOffset); fun->members()->setEndOffset(tokenAt(ast->lastToken() - 1).end()); if (ast->declarator) { diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h index 90690d2720be0111de4ffd0f90a8ff8ff84c2834..562b17012374f02648d03ea9b80444c7f202a459 100644 --- a/src/shared/cplusplus/CheckDeclaration.h +++ b/src/shared/cplusplus/CheckDeclaration.h @@ -69,6 +69,8 @@ protected: Scope *switchScope(Scope *scope); TemplateParameters *switchTemplateParameters(TemplateParameters *templateParameters); + void setDeclSpecifiers(Symbol *symbol, const FullySpecifiedType &declSpecifiers); + void checkFunctionArguments(Function *fun); using ASTVisitor::visit; diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp index 013f3a308c449b3cd3fc76d72413fb34f44a1ad7..d9d51b356e10bac294cc8f6d5f7b4e1158e0d0ef 100644 --- a/src/shared/cplusplus/CheckDeclarator.cpp +++ b/src/shared/cplusplus/CheckDeclarator.cpp @@ -169,9 +169,6 @@ bool CheckDeclarator::visit(FunctionDeclaratorAST *ast) ast->symbol = fun; fun->setReturnType(_fullySpecifiedType); - if (_fullySpecifiedType.isVirtual()) - fun->setVirtual(true); - if (ast->parameters) { DeclarationListAST *parameter_declarations = ast->parameters->parameter_declaration_list; for (DeclarationListAST *decl = parameter_declarations; decl; decl = decl->next) {