void Document::reparse() const { checkIfNull(); const TranslationUnitUpdateInput updateInput = createUpdateInput(); TranslationUnitUpdateResult result = translationUnit().reparse(updateInput); incorporateUpdaterResult(result); }
TranslationUnitUpdater Document::createUpdater() const { TranslationUnit unit = translationUnit(); const TranslationUnitUpdateInput updateInput = createUpdateInput(); TranslationUnitUpdater updater(unit.id(), unit.cxIndex(), unit.cxTranslationUnit(), updateInput); return updater; }
QVector<FileContainer> TranslationUnits::newerFileContainers(const QVector<FileContainer> &fileContainers) const { QVector<FileContainer> newerContainers; auto translationUnitIsNewer = [this] (const FileContainer &fileContainer) { try { return translationUnit(fileContainer).documentRevision() != fileContainer.documentRevision(); } catch (const TranslationUnitDoesNotExistException &) { return true; } }; std::copy_if(fileContainers.cbegin(), fileContainers.cend(), std::back_inserter(newerContainers), translationUnitIsNewer); return newerContainers; }
bool CheckSpecifier::visit(SimpleSpecifierAST *ast) { switch (tokenKind(ast->specifier_token)) { case T_CONST: if (_fullySpecifiedType.isConst()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setConst(true); break; case T_VOLATILE: if (_fullySpecifiedType.isVolatile()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setVolatile(true); break; case T_FRIEND: if (_fullySpecifiedType.isFriend()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setFriend(true); break; case T_REGISTER: if (_fullySpecifiedType.isRegister()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setRegister(true); break; case T_STATIC: if (_fullySpecifiedType.isStatic()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setStatic(true); break; case T_EXTERN: if (_fullySpecifiedType.isExtern()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setExtern(true); break; case T_MUTABLE: if (_fullySpecifiedType.isMutable()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setMutable(true); break; case T_TYPEDEF: if (_fullySpecifiedType.isTypedef()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setTypedef(true); break; case T_INLINE: if (_fullySpecifiedType.isInline()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setInline(true); break; case T_VIRTUAL: if (_fullySpecifiedType.isVirtual()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setVirtual(true); break; case T_EXPLICIT: if (_fullySpecifiedType.isExplicit()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setExplicit(true); break; case T_SIGNED: if (_fullySpecifiedType.isSigned()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setSigned(true); break; case T_UNSIGNED: if (_fullySpecifiedType.isUnsigned()) translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token)); _fullySpecifiedType.setUnsigned(true); break; case T_CHAR: if (_fullySpecifiedType) translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); _fullySpecifiedType.setType(control()->integerType(IntegerType::Char)); break; case T_WCHAR_T: if (_fullySpecifiedType) translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); _fullySpecifiedType.setType(control()->integerType(IntegerType::WideChar)); break; case T_BOOL: if (_fullySpecifiedType) translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); _fullySpecifiedType.setType(control()->integerType(IntegerType::Bool)); break; case T_SHORT: if (_fullySpecifiedType) { IntegerType *intType = control()->integerType(IntegerType::Int); if (_fullySpecifiedType.type() != intType) translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); } _fullySpecifiedType.setType(control()->integerType(IntegerType::Short)); break; case T_INT: if (_fullySpecifiedType) { Type *tp = _fullySpecifiedType.type(); IntegerType *shortType = control()->integerType(IntegerType::Short); IntegerType *longType = control()->integerType(IntegerType::Long); IntegerType *longLongType = control()->integerType(IntegerType::LongLong); if (tp == shortType || tp == longType || tp == longLongType) break; translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); } _fullySpecifiedType.setType(control()->integerType(IntegerType::Int)); break; case T_LONG: if (_fullySpecifiedType) { Type *tp = _fullySpecifiedType.type(); IntegerType *intType = control()->integerType(IntegerType::Int); IntegerType *longType = control()->integerType(IntegerType::Long); FloatType *doubleType = control()->floatType(FloatType::Double); if (tp == longType) { _fullySpecifiedType.setType(control()->integerType(IntegerType::LongLong)); break; } else if (tp == doubleType) { _fullySpecifiedType.setType(control()->floatType(FloatType::LongDouble)); break; } else if (tp != intType) { translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); } } _fullySpecifiedType.setType(control()->integerType(IntegerType::Long)); break; case T_FLOAT: if (_fullySpecifiedType) translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); _fullySpecifiedType.setType(control()->floatType(FloatType::Float)); break; case T_DOUBLE: if (_fullySpecifiedType) { IntegerType *longType = control()->integerType(IntegerType::Long); if (_fullySpecifiedType.type() == longType) { _fullySpecifiedType.setType(control()->floatType(FloatType::LongDouble)); break; } translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); } _fullySpecifiedType.setType(control()->floatType(FloatType::Double)); break; case T_VOID: if (_fullySpecifiedType) translationUnit()->error(ast->specifier_token, "duplicate data type in declaration"); _fullySpecifiedType.setType(control()->voidType()); break; default: break; } // switch accept(ast->next); return false; }
void ASTVisitor::getTokenPosition(unsigned index, unsigned *line, unsigned *column, StringLiteral **fileName) const { translationUnit()->getTokenPosition(index, line, column, fileName); }
void ASTVisitor::getPosition(unsigned offset, unsigned *line, unsigned *column, StringLiteral **fileName) const { translationUnit()->getPosition(offset, line, column, fileName); }
StringLiteral *ASTVisitor::stringLiteral(unsigned index) const { return translationUnit()->stringLiteral(index); }
NumericLiteral *ASTVisitor::numericLiteral(unsigned index) const { return translationUnit()->numericLiteral(index); }
Identifier *ASTVisitor::identifier(unsigned index) const { return translationUnit()->identifier(index); }
const char *ASTVisitor::spell(unsigned index) const { return translationUnit()->spell(index); }
int ASTVisitor::tokenKind(unsigned index) const { return translationUnit()->tokenKind(index); }
const Token &ASTVisitor::tokenAt(unsigned index) const { return translationUnit()->tokenAt(index); }
const TranslationUnit &TranslationUnits::translationUnit(const FileContainer &fileContainer) const { return translationUnit(fileContainer.filePath(), fileContainer.projectPartId()); }