clang::Token GetTokenBeforeLocation(clang::SourceLocation loc, const clang::ASTContext& ast_context) { clang::Token token; token.setKind(clang::tok::unknown); clang::LangOptions lang_options = ast_context.getLangOpts(); const clang::SourceManager& source_manager = ast_context.getSourceManager(); clang::SourceLocation file_start_loc = source_manager.getLocForStartOfFile(source_manager.getFileID(loc)); loc = loc.getLocWithOffset(-1); while (loc != file_start_loc) { loc = clang::Lexer::GetBeginningOfToken(loc, source_manager, lang_options); if (!clang::Lexer::getRawToken(loc, token, source_manager, lang_options)) { if (!token.is(clang::tok::comment)) { break; } } loc = loc.getLocWithOffset(-1); } return token; }
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; }
virtual void Initialize(clang::ASTContext& Ctx) override { annotator.setSourceMgr(Ctx.getSourceManager(), Ctx.getLangOpts()); annotator.setMangleContext(Ctx.createMangleContext()); ci.getPreprocessor().addPPCallbacks(maybe_unique(new PreprocessorCallback(annotator, ci.getPreprocessor()))); ci.getDiagnostics().setClient(new BrowserDiagnosticClient(annotator), true); }