bool GenericAstNode::getRangeInMainFile(std::pair<int, int> &result, clang::SourceManager const &manager, clang::ASTContext &context) { auto range = getRange(); if (range.isInvalid()) { return false; } auto start = manager.getDecomposedSpellingLoc(range.getBegin()); auto end = manager.getDecomposedSpellingLoc(clang::Lexer::getLocForEndOfToken(range.getEnd(), 0, manager, context.getLangOpts())); if (start.first != end.first || start.first != manager.getMainFileID()) { //Not in the same file, or not in the main file (probably #included) return false; } result = std::make_pair(start.second, end.second); return true; }
RangeSet collect(clang::ASTContext &astContext, oclint::RuleBase *rule) { _rule = rule; _sourceManager = &astContext.getSourceManager(); _range.clear(); clang::DeclContext *decl = astContext.getTranslationUnitDecl(); for (clang::DeclContext::decl_iterator declIt = decl->decls_begin(), declEnd = decl->decls_end(); declIt != declEnd; ++declIt) { clang::SourceLocation startLocation = (*declIt)->getLocStart(); if (startLocation.isValid() && _sourceManager->getMainFileID() == _sourceManager->getFileID(startLocation)) { (void) /* explicitly ignore the return of this function */ clang::RecursiveASTVisitor<DeclAnnotationRangeCollector>::TraverseDecl(*declIt); } } return _range; }