mirror of
https://github.com/MaskRay/ccls.git
synced 2025-01-31 18:00:26 +00:00
Add is_end to Get{Buffer,Index}PosFrom{Index,Buffer}Pos to get better column alignment
This commit is contained in:
parent
e04245f185
commit
13728a0fae
@ -62,7 +62,7 @@ struct TextDocumentDocumentLinkHandler
|
||||
}
|
||||
for (const IndexInclude& include : file->def->includes) {
|
||||
optional<int> buffer_line =
|
||||
working_file->GetBufferPosFromIndexPos(include.line, nullptr);
|
||||
working_file->GetBufferPosFromIndexPos(include.line, nullptr, false);
|
||||
if (!buffer_line)
|
||||
continue;
|
||||
|
||||
|
@ -319,7 +319,7 @@ optional<lsPosition> GetLsPosition(WorkingFile* working_file,
|
||||
return lsPosition(position.line, position.column);
|
||||
|
||||
int column = position.column;
|
||||
optional<int> start = working_file->GetBufferPosFromIndexPos(position.line, &column);
|
||||
optional<int> start = working_file->GetBufferPosFromIndexPos(position.line, &column, false);
|
||||
if (!start)
|
||||
return nullopt;
|
||||
|
||||
@ -335,9 +335,9 @@ optional<lsRange> GetLsRange(WorkingFile* working_file, const Range& location) {
|
||||
|
||||
int start_column = location.start.column, end_column = location.end.column;
|
||||
optional<int> start =
|
||||
working_file->GetBufferPosFromIndexPos(location.start.line, &start_column);
|
||||
working_file->GetBufferPosFromIndexPos(location.start.line, &start_column, false);
|
||||
optional<int> end =
|
||||
working_file->GetBufferPosFromIndexPos(location.end.line, &end_column);
|
||||
working_file->GetBufferPosFromIndexPos(location.end.line, &end_column, true);
|
||||
if (!start || !end)
|
||||
return nullopt;
|
||||
|
||||
@ -483,8 +483,8 @@ std::vector<SymbolRef> FindSymbolsAtLocation(WorkingFile* working_file,
|
||||
int target_line = position.line;
|
||||
int target_column = position.character;
|
||||
if (working_file) {
|
||||
optional<int> index_line =
|
||||
working_file->GetIndexPosFromBufferPos(target_line, &target_column);
|
||||
optional<int> index_line = working_file->GetIndexPosFromBufferPos(
|
||||
target_line, &target_column, false);
|
||||
if (index_line)
|
||||
target_line = *index_line;
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ std::vector<int> EditDistanceVector(std::string a, std::string b) {
|
||||
|
||||
// Find matching position of |a[column]| in |b|.
|
||||
// This is actually a single step of Hirschberg's sequence alignment algorithm.
|
||||
int AlignColumn(const std::string& a, int column, std::string b) {
|
||||
int AlignColumn(const std::string& a, int column, std::string b, bool is_end) {
|
||||
int head = 0, tail = 0;
|
||||
while (head < (int)a.size() && head < (int)b.size() && a[head] == b[head])
|
||||
head++;
|
||||
@ -106,12 +106,12 @@ int AlignColumn(const std::string& a, int column, std::string b) {
|
||||
tail++;
|
||||
if (column < head)
|
||||
return column;
|
||||
if ((int)a.size() - tail <= column)
|
||||
if ((int)a.size() - tail < column)
|
||||
return column + b.size() - a.size();
|
||||
if (std::max(a.size(), b.size()) - head - tail >= kMaxColumnAlignSize)
|
||||
return std::min(column, (int)b.size());
|
||||
|
||||
// b[head, tail)
|
||||
// b[head, b.size() - tail)
|
||||
b = b.substr(head, b.size() - tail - head);
|
||||
|
||||
// left[i] = cost of aligning a[head, column) to b[head, head + i)
|
||||
@ -128,7 +128,7 @@ int AlignColumn(const std::string& a, int column, std::string b) {
|
||||
int best = 0, best_cost = INT_MAX;
|
||||
for (size_t i = 0; i < left.size(); i++) {
|
||||
int cost = left[i] + right[i];
|
||||
if (cost < best_cost) {
|
||||
if (is_end ? cost < best_cost : cost <= best_cost) {
|
||||
best_cost = cost;
|
||||
best = i;
|
||||
}
|
||||
@ -143,12 +143,14 @@ optional<int> FindMatchingLine(const std::vector<std::string>& index_lines,
|
||||
const std::vector<int>& index_to_buffer,
|
||||
int line,
|
||||
int* column,
|
||||
const std::vector<std::string>& buffer_lines) {
|
||||
const std::vector<std::string>& buffer_lines,
|
||||
bool is_end) {
|
||||
// If this is a confident mapping, returns.
|
||||
if (index_to_buffer[line] >= 0) {
|
||||
int ret = index_to_buffer[line];
|
||||
if (column)
|
||||
*column = AlignColumn(index_lines[line], *column, buffer_lines[ret]);
|
||||
*column =
|
||||
AlignColumn(index_lines[line], *column, buffer_lines[ret], is_end);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -174,7 +176,8 @@ optional<int> FindMatchingLine(const std::vector<std::string>& index_lines,
|
||||
}
|
||||
}
|
||||
if (column)
|
||||
*column = AlignColumn(index_lines[line], *column, buffer_lines[best]);
|
||||
*column =
|
||||
AlignColumn(index_lines[line], *column, buffer_lines[best], is_end);
|
||||
return best;
|
||||
}
|
||||
|
||||
@ -300,7 +303,7 @@ void WorkingFile::ComputeLineMapping() {
|
||||
buffer_to_index[index_to_buffer[i]] = i;
|
||||
}
|
||||
|
||||
optional<int> WorkingFile::GetBufferPosFromIndexPos(int line, int* column) {
|
||||
optional<int> WorkingFile::GetBufferPosFromIndexPos(int line, int* column, bool is_end) {
|
||||
// The implementation is simple but works pretty well for most cases. We
|
||||
// lookup the line contents in the indexed file contents, and try to find the
|
||||
// most similar line in the current buffer file.
|
||||
@ -323,10 +326,11 @@ optional<int> WorkingFile::GetBufferPosFromIndexPos(int line, int* column) {
|
||||
|
||||
if (index_to_buffer.empty())
|
||||
ComputeLineMapping();
|
||||
return FindMatchingLine(index_lines, index_to_buffer, line, column, buffer_lines);
|
||||
return FindMatchingLine(index_lines, index_to_buffer, line, column,
|
||||
buffer_lines, is_end);
|
||||
}
|
||||
|
||||
optional<int> WorkingFile::GetIndexPosFromBufferPos(int line, int* column) {
|
||||
optional<int> WorkingFile::GetIndexPosFromBufferPos(int line, int* column, bool is_end) {
|
||||
// See GetBufferLineFromIndexLine for additional comments.
|
||||
|
||||
// Note: |index_line| and |buffer_line| are 1-based.
|
||||
@ -340,7 +344,8 @@ optional<int> WorkingFile::GetIndexPosFromBufferPos(int line, int* column) {
|
||||
|
||||
if (buffer_to_index.empty())
|
||||
ComputeLineMapping();
|
||||
return FindMatchingLine(buffer_lines, buffer_to_index, line, column, index_lines);
|
||||
return FindMatchingLine(buffer_lines, buffer_to_index, line, column,
|
||||
index_lines, is_end);
|
||||
}
|
||||
|
||||
std::string WorkingFile::FindClosestCallNameInBuffer(
|
||||
|
@ -40,10 +40,12 @@ struct WorkingFile {
|
||||
|
||||
// Finds the buffer line number which maps to index line number |line|.
|
||||
// Also resolves |column| if not NULL.
|
||||
optional<int> GetBufferPosFromIndexPos(int line, int* column);
|
||||
// When resolving a range, use is_end = false for begin() and is_end =
|
||||
// true for end() to get a better alignment of |column|.
|
||||
optional<int> GetBufferPosFromIndexPos(int line, int* column, bool is_end);
|
||||
// Finds the index line number which maps to buffer line number |line|.
|
||||
// Also resolves |column| if not NULL.
|
||||
optional<int> GetIndexPosFromBufferPos(int line, int* column);
|
||||
optional<int> GetIndexPosFromBufferPos(int line, int* column, bool is_end);
|
||||
|
||||
// TODO: Move FindClosestCallNameInBuffer and FindStableCompletionSource into
|
||||
// lex_utils.h/cc
|
||||
|
Loading…
Reference in New Issue
Block a user