diff options
Diffstat (limited to 'lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp')
-rw-r--r-- | lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp b/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp index a9a1b44731f2..3e77b1646739 100644 --- a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp +++ b/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp @@ -139,6 +139,22 @@ void ClangHighlighter::Highlight(const HighlightStyle &options, FileManager file_mgr(file_opts, FileSystem::Instance().GetVirtualFileSystem()); + // The line might end in a backslash which would cause Clang to drop the + // backslash and the terminating new line. This makes sense when parsing C++, + // but when highlighting we care about preserving the backslash/newline. To + // not lose this information we remove the new line here so that Clang knows + // this is just a single line we are highlighting. We add back the newline + // after tokenizing. + llvm::StringRef line_ending = ""; + // There are a few legal line endings Clang recognizes and we need to + // temporarily remove from the string. + if (line.consume_back("\r\n")) + line_ending = "\r\n"; + else if (line.consume_back("\n")) + line_ending = "\n"; + else if (line.consume_back("\r")) + line_ending = "\r"; + unsigned line_number = previous_lines.count('\n') + 1U; // Let's build the actual source code Clang needs and setup some utility @@ -227,6 +243,9 @@ void ClangHighlighter::Highlight(const HighlightStyle &options, color.Apply(result, to_print); } + // Add the line ending we trimmed before tokenizing. + result << line_ending; + // If we went over the whole file but couldn't find our own file, then // somehow our setup was wrong. When we're in release mode we just give the // user the normal line and pretend we don't know how to highlight it. In |