bool CheckDeclaration::visit(ExceptionDeclarationAST *ast) { FullySpecifiedType ty = semantic()->check(ast->type_specifier, _scope); FullySpecifiedType qualTy = ty.qualifiedType(); Name *name = 0; FullySpecifiedType declTy = semantic()->check(ast->declarator, qualTy, _scope, &name); unsigned location = locationOfDeclaratorId(ast->declarator); if (! location) { if (ast->declarator) location = ast->declarator->firstToken(); else location = ast->firstToken(); } Declaration *symbol = control()->newDeclaration(location, name); symbol->setStartOffset(tokenAt(ast->firstToken()).offset); symbol->setEndOffset(tokenAt(ast->lastToken()).offset); symbol->setType(declTy); _scope->enterSymbol(symbol); return false; }
bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast) { if (!ast->method_prototype) return false; FullySpecifiedType ty = semantic()->check(ast->method_prototype, _scope); ObjCMethod *methodType = ty.type()->asObjCMethodType(); if (!methodType) return false; Symbol *symbol; if (ast->function_body) { if (!semantic()->skipFunctionBodies()) { semantic()->check(ast->function_body, methodType->members()); } symbol = methodType; } else { Declaration *decl = control()->newDeclaration(ast->firstToken(), methodType->name()); decl->setType(methodType); symbol = decl; } symbol->setStartOffset(tokenAt(ast->firstToken()).offset); symbol->setEndOffset(tokenAt(ast->lastToken()).offset); symbol->setVisibility(semantic()->currentVisibility()); if (semantic()->isObjCClassMethod(ast->method_prototype->method_type_token)) symbol->setStorage(Symbol::Static); _scope->enterSymbol(symbol); return false; }
bool CheckStatement::visit(QtMemberDeclarationAST *ast) { const Name *name = 0; if (tokenKind(ast->q_token) == T_Q_D) name = control()->nameId(control()->findOrInsertIdentifier("d")); else name = control()->nameId(control()->findOrInsertIdentifier("q")); FullySpecifiedType declTy = semantic()->check(ast->type_id, _scope); if (tokenKind(ast->q_token) == T_Q_D) { if (NamedType *namedTy = declTy->asNamedType()) { if (const NameId *nameId = namedTy->name()->asNameId()) { std::string privateClass; privateClass += nameId->identifier()->chars(); privateClass += "Private"; const Name *privName = control()->nameId(control()->findOrInsertIdentifier(privateClass.c_str(), privateClass.size())); declTy.setType(control()->namedType(privName)); } } } Declaration *symbol = control()->newDeclaration(/*generated*/ 0, name); symbol->setType(control()->pointerType(declTy)); _scope->enterSymbol(symbol); return false; }
bool CheckStatement::forEachFastEnum(unsigned firstToken, unsigned lastToken, SpecifierListAST *type_specifier_list, DeclaratorAST *declarator, ExpressionAST *initializer, ExpressionAST *expression, StatementAST *statement, Block *&symbol) { Block *block = control()->newBlock(firstToken); block->setStartOffset(tokenAt(firstToken).offset); block->setEndOffset(tokenAt(lastToken).offset); symbol = block; _scope->enterSymbol(block); Scope *previousScope = switchScope(block->members()); if (type_specifier_list && declarator) { FullySpecifiedType ty = semantic()->check(type_specifier_list, _scope); const Name *name = 0; ty = semantic()->check(declarator, ty, _scope, &name); unsigned location = declarator->firstToken(); if (CoreDeclaratorAST *core_declarator = declarator->core_declarator) location = core_declarator->firstToken(); Declaration *decl = control()->newDeclaration(location, name); decl->setType(ty); _scope->enterSymbol(decl); } else { FullySpecifiedType exprTy = semantic()->check(initializer, _scope); (void) exprTy; } FullySpecifiedType exprTy = semantic()->check(expression, _scope); semantic()->check(statement, _scope); (void) switchScope(previousScope); return false; }
void DeclarationBuilder::declareVariable(IToken *id, const AbstractType::Ptr &type) { DUChainWriteLocker lock; Declaration *dec = openDefinition<Declaration>(identifierForNode(id), editorFindRange(id, id)); dec->setType(type); dec->setKind(Declaration::Instance); closeDeclaration(); }
bool CheckExpression::visit(ConditionAST *ast) { FullySpecifiedType typeSpecTy = semantic()->check(ast->type_specifier_list, _scope); const Name *name = 0; FullySpecifiedType declTy = semantic()->check(ast->declarator, typeSpecTy.qualifiedType(), _scope, &name); Declaration *decl = control()->newDeclaration(ast->declarator->firstToken(), name); decl->setType(declTy); _scope->enterSymbol(decl); return false; }
bool CheckDeclaration::visit(SimpleDeclarationAST *ast) { FullySpecifiedType ty = semantic()->check(ast->decl_specifier_seq, _scope); FullySpecifiedType qualTy = ty.qualifiedType(); if (_templateParameters && ty) { if (Class *klass = ty->asClassType()) { klass->setTemplateParameters(_templateParameters); } } if (! ast->declarators && ast->decl_specifier_seq && ! ast->decl_specifier_seq->next) { if (ElaboratedTypeSpecifierAST *elab_type_spec = ast->decl_specifier_seq->asElaboratedTypeSpecifier()) { unsigned sourceLocation = elab_type_spec->firstToken(); if (elab_type_spec->name) sourceLocation = elab_type_spec->name->firstToken(); Name *name = semantic()->check(elab_type_spec->name, _scope); ForwardClassDeclaration *symbol = control()->newForwardClassDeclaration(sourceLocation, name); if (_templateParameters) { symbol->setTemplateParameters(_templateParameters); _templateParameters = 0; } _scope->enterSymbol(symbol); return false; } } const bool isQ_SLOT = ast->qt_invokable_token && tokenKind(ast->qt_invokable_token) == T_Q_SLOT; const bool isQ_SIGNAL = ast->qt_invokable_token && tokenKind(ast->qt_invokable_token) == T_Q_SIGNAL; List<Declaration *> **decl_it = &ast->symbols; for (DeclaratorListAST *it = ast->declarators; it; it = it->next) { Name *name = 0; FullySpecifiedType declTy = semantic()->check(it->declarator, qualTy, _scope, &name); unsigned location = locationOfDeclaratorId(it->declarator); if (! location) { if (it->declarator) location = it->declarator->firstToken(); else location = ast->firstToken(); } Function *fun = 0; if (declTy && 0 != (fun = declTy->asFunctionType())) { fun->setSourceLocation(location); fun->setScope(_scope); fun->setName(name); fun->setMethodKey(semantic()->currentMethodKey()); fun->setVirtual(ty.isVirtual()); if (isQ_SIGNAL) fun->setMethodKey(Function::SignalMethod); else if (isQ_SLOT) fun->setMethodKey(Function::SlotMethod); fun->setVisibility(semantic()->currentVisibility()); } else if (semantic()->currentMethodKey() != Function::NormalMethod) { translationUnit()->warning(ast->firstToken(), "expected a function declaration"); } Declaration *symbol = control()->newDeclaration(location, name); symbol->setStartOffset(tokenAt(ast->firstToken()).offset); symbol->setEndOffset(tokenAt(ast->lastToken()).offset); symbol->setType(control()->integerType(IntegerType::Int)); symbol->setType(declTy); if (_templateParameters && it == ast->declarators && ty && ! ty->isClassType()) symbol->setTemplateParameters(_templateParameters); symbol->setVisibility(semantic()->currentVisibility()); if (ty.isFriend()) symbol->setStorage(Symbol::Friend); 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 (it->declarator && it->declarator->initializer) { FullySpecifiedType initTy = semantic()->check(it->declarator->initializer, _scope); } *decl_it = new (translationUnit()->memoryPool()) List<Declaration *>(); (*decl_it)->value = symbol; decl_it = &(*decl_it)->next; _scope->enterSymbol(symbol); } return false; }