Stop appending to insert after a placeholder if snippetSupport is false

This commit is contained in:
Fangrui Song 2018-01-22 22:21:32 -08:00
parent d4a4e15976
commit ce49a5c8d9

View File

@ -149,10 +149,13 @@ lsCompletionItemKind GetCompletionKind(CXCursorKind cursor_kind) {
} }
} }
// |do_insert|: if |!do_insert|, do not append strings to |insert| after
// a placeholder.
void BuildDetailString(CXCompletionString completion_string, void BuildDetailString(CXCompletionString completion_string,
std::string& label, std::string& label,
std::string& detail, std::string& detail,
std::string& insert, std::string& insert,
bool& do_insert,
lsInsertTextFormat& format, lsInsertTextFormat& format,
std::vector<std::string>* parameters, std::vector<std::string>* parameters,
bool include_snippets) { bool include_snippets) {
@ -165,8 +168,8 @@ void BuildDetailString(CXCompletionString completion_string,
case CXCompletionChunk_Optional: { case CXCompletionChunk_Optional: {
CXCompletionString nested = CXCompletionString nested =
clang_getCompletionChunkCompletionString(completion_string, i); clang_getCompletionChunkCompletionString(completion_string, i);
BuildDetailString(nested, label, detail, insert, format, parameters, BuildDetailString(nested, label, detail, insert, do_insert, format,
include_snippets); parameters, include_snippets);
break; break;
} }
@ -180,7 +183,8 @@ void BuildDetailString(CXCompletionString completion_string,
insert += insert +=
"${" + std::to_string(parameters->size()) + ":" + text + "}"; "${" + std::to_string(parameters->size()) + ":" + text + "}";
format = lsInsertTextFormat::Snippet; format = lsInsertTextFormat::Snippet;
} } else
do_insert = false;
break; break;
} }
@ -194,6 +198,7 @@ void BuildDetailString(CXCompletionString completion_string,
ToString(clang_getCompletionChunkText(completion_string, i)); ToString(clang_getCompletionChunkText(completion_string, i));
label = text; label = text;
detail += text; detail += text;
if (do_insert)
insert += text; insert += text;
break; break;
} }
@ -202,6 +207,7 @@ void BuildDetailString(CXCompletionString completion_string,
std::string text = std::string text =
ToString(clang_getCompletionChunkText(completion_string, i)); ToString(clang_getCompletionChunkText(completion_string, i));
detail += text; detail += text;
if (do_insert)
insert += text; insert += text;
break; break;
} }
@ -220,63 +226,68 @@ void BuildDetailString(CXCompletionString completion_string,
case CXCompletionChunk_LeftParen: case CXCompletionChunk_LeftParen:
detail += "("; detail += "(";
if (do_insert)
insert += "("; insert += "(";
// Put cursor between parentheses if snippets are not enabled
if (!include_snippets) {
insert += "$1";
format = lsInsertTextFormat::Snippet;
}
break; break;
case CXCompletionChunk_RightParen: case CXCompletionChunk_RightParen:
detail += ")"; detail += ")";
if (do_insert)
insert += ")"; insert += ")";
break; break;
case CXCompletionChunk_LeftBracket: case CXCompletionChunk_LeftBracket:
detail += "["; detail += "[";
if (do_insert)
insert += "["; insert += "[";
break; break;
case CXCompletionChunk_RightBracket: case CXCompletionChunk_RightBracket:
detail += "]"; detail += "]";
if (do_insert)
insert += "]"; insert += "]";
break; break;
case CXCompletionChunk_LeftBrace: case CXCompletionChunk_LeftBrace:
detail += "{"; detail += "{";
if (do_insert)
insert += "{"; insert += "{";
break; break;
case CXCompletionChunk_RightBrace: case CXCompletionChunk_RightBrace:
detail += "}"; detail += "}";
if (do_insert)
insert += "}"; insert += "}";
break; break;
case CXCompletionChunk_LeftAngle: case CXCompletionChunk_LeftAngle:
detail += "<"; detail += "<";
if (do_insert)
insert += "<"; insert += "<";
break; break;
case CXCompletionChunk_RightAngle: case CXCompletionChunk_RightAngle:
detail += ">"; detail += ">";
if (do_insert)
insert += ">"; insert += ">";
break; break;
case CXCompletionChunk_Comma: case CXCompletionChunk_Comma:
detail += ", "; detail += ", ";
// Only put comma's between parentheses if snippets are enabled if (do_insert)
if (include_snippets) {
insert += ", "; insert += ", ";
}
break; break;
case CXCompletionChunk_Colon: case CXCompletionChunk_Colon:
detail += ":"; detail += ":";
if (do_insert)
insert += ":"; insert += ":";
break; break;
case CXCompletionChunk_SemiColon: case CXCompletionChunk_SemiColon:
detail += ";"; detail += ";";
if (do_insert)
insert += ";"; insert += ";";
break; break;
case CXCompletionChunk_Equal: case CXCompletionChunk_Equal:
detail += "="; detail += "=";
if (do_insert)
insert += "="; insert += "=";
break; break;
case CXCompletionChunk_HorizontalSpace: case CXCompletionChunk_HorizontalSpace:
case CXCompletionChunk_VerticalSpace: case CXCompletionChunk_VerticalSpace:
detail += " "; detail += " ";
if (do_insert)
insert += " "; insert += " ";
break; break;
} }
@ -440,12 +451,13 @@ void CompletionQueryMain(ClangCompleteManager* completion_manager) {
// TODO: fill in more data // TODO: fill in more data
lsCompletionItem ls_completion_item; lsCompletionItem ls_completion_item;
bool do_insert = true;
// kind/label/detail/docs/sortText // kind/label/detail/docs/sortText
ls_completion_item.kind = GetCompletionKind(result.CursorKind); ls_completion_item.kind = GetCompletionKind(result.CursorKind);
BuildDetailString( BuildDetailString(
result.CompletionString, ls_completion_item.label, result.CompletionString, ls_completion_item.label,
ls_completion_item.detail, ls_completion_item.insertText, ls_completion_item.detail, ls_completion_item.insertText,
ls_completion_item.insertTextFormat, do_insert, ls_completion_item.insertTextFormat,
&ls_completion_item.parameters_, &ls_completion_item.parameters_,
completion_manager->config_->client.snippetSupport); completion_manager->config_->client.snippetSupport);
if (completion_manager->config_->client.snippetSupport && if (completion_manager->config_->client.snippetSupport &&