From 25afc70c0c8352704d3680772d9773082299247c Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 19 Aug 2017 00:39:38 +0200 Subject: [PATCH] A minor optimization of Diagnostic::Diagnostic --- src/Diagnostic.cc | 2 +- src/Tokens.cc | 12 +++++++++++- src/Tokens.h | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Diagnostic.cc b/src/Diagnostic.cc index fa2104a..f527399 100644 --- a/src/Diagnostic.cc +++ b/src/Diagnostic.cc @@ -11,7 +11,7 @@ clangmm::Diagnostic::Diagnostic(CXTranslationUnit& cx_tu, CXDiagnostic& cx_diagn SourceLocation start_location(clang_getDiagnosticLocation(cx_diagnostic)); path=start_location.get_path(); auto start_offset=start_location.get_offset(); - Tokens tokens(cx_tu, SourceRange(start_location, start_location)); + Tokens tokens(cx_tu, SourceRange(start_location, start_location), false); if(tokens.size()==1) offsets={start_offset, tokens.begin()->get_source_range().get_offsets().second}; diff --git a/src/Tokens.cc b/src/Tokens.cc index b76ffa4..c1acade 100644 --- a/src/Tokens.cc +++ b/src/Tokens.cc @@ -4,9 +4,19 @@ #include #include -clangmm::Tokens::Tokens(CXTranslationUnit &cx_tu, const SourceRange &range): cx_tu(cx_tu) { +clangmm::Tokens::Tokens(CXTranslationUnit &cx_tu, const SourceRange &range, bool annotate_tokens): cx_tu(cx_tu) { unsigned num_tokens; clang_tokenize(cx_tu, range.cx_range, &cx_tokens, &num_tokens); + + if(!annotate_tokens) { + cx_cursors=std::unique_ptr(new CXCursor[num_tokens]); + for (unsigned i = 0; i < num_tokens; i++) { + cx_cursors[i]=clang_getNullCursor(); + emplace_back(Token(cx_tu, cx_tokens[i], cx_cursors[i])); + } + return; + } + cx_cursors=std::unique_ptr(new CXCursor[num_tokens]); // To avoid allocation with initialization clang_annotateTokens(cx_tu, cx_tokens, num_tokens, cx_cursors.get()); diff --git a/src/Tokens.h b/src/Tokens.h index 9afc650..725e6a8 100644 --- a/src/Tokens.h +++ b/src/Tokens.h @@ -11,7 +11,7 @@ namespace clangmm { class Tokens : public std::vector { friend class TranslationUnit; friend class Diagnostic; - Tokens(CXTranslationUnit &cx_tu, const SourceRange &range); + Tokens(CXTranslationUnit &cx_tu, const SourceRange &range, bool annotate_tokens=true); public: ~Tokens(); std::vector > get_similar_token_offsets(Cursor::Kind kind, const std::string &spelling,