clang::Token GetTokenBefore(const clang::SourceManager &sources, clang::SourceLocation loc) { clang::Token token; token.setKind(clang::tok::unknown); clang::LangOptions lang_options; loc = loc.getLocWithOffset(-1); while (loc != sources.getLocForStartOfFile(sources.getFileID(loc))) { loc = clang::Lexer::GetBeginningOfToken(loc, sources, lang_options); if (!clang::Lexer::getRawToken(loc, token, sources, lang_options)) { if (!token.is(clang::tok::comment)) { break; } } loc = loc.getLocWithOffset(-1); } return token; }
clang::Token GetTokenAfterLocation(clang::SourceLocation loc, const clang::SourceManager &source_manager) { clang::Token token; token.setKind(clang::tok::unknown); clang::LangOptions lang_options; loc = loc.getLocWithOffset(1); while (loc != source_manager.getLocForEndOfFile(source_manager.getFileID(loc))) { if (!clang::Lexer::getRawToken(loc, token, source_manager, lang_options)) { if (!token.is(clang::tok::comment)) { break; } loc = clang::Lexer::getLocForEndOfToken(token.getLocation(), /*Offset=*/0, source_manager, lang_options); } else { loc = loc.getLocWithOffset(1); } } return token; }
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; }