working_files: normalize \r\n and \n to \n

Clients may normalize end-of-line sequences, thus cause a mismatch
between index_lines and buffer_lines.

Thanks to CXuesong for reporting this issue!
This commit is contained in:
Fangrui Song 2019-03-01 17:30:53 -08:00
parent c4ab72500b
commit 05658ef966

View File

@ -24,7 +24,6 @@ limitations under the License.
#include <chrono> #include <chrono>
#include <climits> #include <climits>
#include <numeric> #include <numeric>
#include <sstream>
namespace chrono = std::chrono; namespace chrono = std::chrono;
using namespace clang; using namespace clang;
@ -55,13 +54,17 @@ Position GetPositionForOffset(const std::string &content, int offset) {
return {line, col}; return {line, col};
} }
std::vector<std::string> ToLines(const std::string &content) { std::vector<std::string> ToLines(const std::string &c) {
std::vector<std::string> result; std::vector<std::string> ret;
std::istringstream lines(content); int last = 0, e = c.size();
std::string line; for (int i = 0; i < e; i++)
while (getline(lines, line)) if (c[i] == '\n') {
result.push_back(line); ret.emplace_back(&c[last], i - last - (i && c[i - 1] == '\r'));
return result; last = i + 1;
}
if (last < e)
ret.emplace_back(&c[last], e - last);
return ret;
} }
// Computes the edit distance of strings [a,a+la) and [b,b+lb) with Eugene W. // Computes the edit distance of strings [a,a+la) and [b,b+lb) with Eugene W.