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,7 +198,8 @@ 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;
insert += text; if (do_insert)
insert += text;
break; break;
} }
@ -202,7 +207,8 @@ 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;
insert += text; if (do_insert)
insert += text;
break; break;
} }
@ -220,64 +226,69 @@ void BuildDetailString(CXCompletionString completion_string,
case CXCompletionChunk_LeftParen: case CXCompletionChunk_LeftParen:
detail += "("; detail += "(";
insert += "("; if (do_insert)
// Put cursor between parentheses if snippets are not enabled insert += "(";
if (!include_snippets) {
insert += "$1";
format = lsInsertTextFormat::Snippet;
}
break; break;
case CXCompletionChunk_RightParen: case CXCompletionChunk_RightParen:
detail += ")"; detail += ")";
insert += ")"; if (do_insert)
insert += ")";
break; break;
case CXCompletionChunk_LeftBracket: case CXCompletionChunk_LeftBracket:
detail += "["; detail += "[";
insert += "["; if (do_insert)
insert += "[";
break; break;
case CXCompletionChunk_RightBracket: case CXCompletionChunk_RightBracket:
detail += "]"; detail += "]";
insert += "]"; if (do_insert)
insert += "]";
break; break;
case CXCompletionChunk_LeftBrace: case CXCompletionChunk_LeftBrace:
detail += "{"; detail += "{";
insert += "{"; if (do_insert)
insert += "{";
break; break;
case CXCompletionChunk_RightBrace: case CXCompletionChunk_RightBrace:
detail += "}"; detail += "}";
insert += "}"; if (do_insert)
insert += "}";
break; break;
case CXCompletionChunk_LeftAngle: case CXCompletionChunk_LeftAngle:
detail += "<"; detail += "<";
insert += "<"; if (do_insert)
insert += "<";
break; break;
case CXCompletionChunk_RightAngle: case CXCompletionChunk_RightAngle:
detail += ">"; detail += ">";
insert += ">"; if (do_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 += ":";
insert += ":"; if (do_insert)
insert += ":";
break; break;
case CXCompletionChunk_SemiColon: case CXCompletionChunk_SemiColon:
detail += ";"; detail += ";";
insert += ";"; if (do_insert)
insert += ";";
break; break;
case CXCompletionChunk_Equal: case CXCompletionChunk_Equal:
detail += "="; detail += "=";
insert += "="; if (do_insert)
insert += "=";
break; break;
case CXCompletionChunk_HorizontalSpace: case CXCompletionChunk_HorizontalSpace:
case CXCompletionChunk_VerticalSpace: case CXCompletionChunk_VerticalSpace:
detail += " "; detail += " ";
insert += " "; if (do_insert)
insert += " ";
break; break;
} }
} }
@ -440,17 +451,18 @@ 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 &&
ls_completion_item.insertTextFormat == ls_completion_item.insertTextFormat ==
lsInsertTextFormat::Snippet) { lsInsertTextFormat::Snippet) {
ls_completion_item.insertText += "$0"; ls_completion_item.insertText += "$0";
} }