Fixed problems with constructor and opCall call tips and added opIndex call tips

This commit is contained in:
Hackerpilot 2014-05-20 18:59:12 -07:00
parent 6033b77ac6
commit d9ee41c38a
3 changed files with 39 additions and 19 deletions

View File

@ -116,8 +116,11 @@ AutocompleteResponse complete(const AutocompleteRequest request)
string partial; string partial;
IdType tokenType; IdType tokenType;
if (beforeTokens.length >= 2 && beforeTokens[$ - 1] == tok!"(") if (beforeTokens.length >= 2 && (beforeTokens[$ - 1] == tok!"("
|| beforeTokens[$ - 1] == tok!"["))
{
return parenCompletion(beforeTokens, tokenArray, request.cursorPosition); return parenCompletion(beforeTokens, tokenArray, request.cursorPosition);
}
AutocompleteResponse response; AutocompleteResponse response;
if (beforeTokens.length >= 1 && beforeTokens[$ - 1] == tok!"identifier") if (beforeTokens.length >= 1 && beforeTokens[$ - 1] == tok!"identifier")
@ -175,7 +178,7 @@ AutocompleteResponse complete(const AutocompleteRequest request)
"stdin", allocator, semanticAllocator); "stdin", allocator, semanticAllocator);
scope(exit) typeid(Scope).destroy(completionScope); scope(exit) typeid(Scope).destroy(completionScope);
response.setCompletions(completionScope, getExpression(beforeTokens), response.setCompletions(completionScope, getExpression(beforeTokens),
request.cursorPosition, CompletionType.identifiers, partial); request.cursorPosition, CompletionType.identifiers, false, partial);
break; break;
case tok!"(": case tok!"(":
case tok!"{": case tok!"{":
@ -279,7 +282,7 @@ AutocompleteResponse parenCompletion(T)(T beforeTokens,
scope(exit) typeid(Scope).destroy(completionScope); scope(exit) typeid(Scope).destroy(completionScope);
auto expression = getExpression(beforeTokens[0 .. $ - 1]); auto expression = getExpression(beforeTokens[0 .. $ - 1]);
response.setCompletions(completionScope, expression, response.setCompletions(completionScope, expression,
cursorPosition, CompletionType.calltips); cursorPosition, CompletionType.calltips, beforeTokens[$ - 1] == tok!"[");
break; break;
default: default:
break; break;
@ -456,7 +459,7 @@ ACSymbol*[] getSymbolsByTokenChain(T)(Scope* completionScope,
*/ */
void setCompletions(T)(ref AutocompleteResponse response, void setCompletions(T)(ref AutocompleteResponse response,
Scope* completionScope, T tokens, size_t cursorPosition, Scope* completionScope, T tokens, size_t cursorPosition,
CompletionType completionType, string partial = null) CompletionType completionType, bool isBracket = false, string partial = null)
{ {
// Autocomplete module imports instead of symbols // Autocomplete module imports instead of symbols
if (tokens.length > 0 && tokens[0].type == tok!"import") if (tokens.length > 0 && tokens[0].type == tok!"import")
@ -516,27 +519,42 @@ void setCompletions(T)(ref AutocompleteResponse response,
if (symbols[0].kind != CompletionKind.functionName if (symbols[0].kind != CompletionKind.functionName
&& symbols[0].callTip is null) && symbols[0].callTip is null)
{ {
auto call = symbols[0].getPartsByName("opCall"); if (symbols[0].kind == CompletionKind.variableName)
if (call.length > 0)
{ {
symbols = call; auto dumb = symbols[0].type;
goto setCallTips; if (isBracket)
{
auto index = dumb.getPartsByName("opIndex");
if (index.length > 0)
{
symbols = index;
goto setCallTips;
}
}
auto call = dumb.getPartsByName("opCall");
if (call.length > 0)
{
symbols = call;
goto setCallTips;
}
} }
auto constructor = symbols[0].getPartsByName("*constructor*"); if (symbols[0].kind == CompletionKind.structName
if (constructor.length == 0) || symbols[0].kind == CompletionKind.className)
return;
else
{ {
Log.trace("Not a function, but it has a constructor"); auto constructor = symbols[0].getPartsByName("*constructor*");
symbols = constructor; if (constructor.length == 0)
goto setCallTips; return;
else
{
symbols = constructor;
goto setCallTips;
}
} }
} }
setCallTips: setCallTips:
response.completionType = CompletionType.calltips; response.completionType = CompletionType.calltips;
foreach (symbol; symbols) foreach (symbol; symbols)
{ {
Log.trace("Adding calltip ", symbol.callTip);
if (symbol.kind != CompletionKind.aliasName) if (symbol.kind != CompletionKind.aliasName)
response.completions ~= symbol.callTip; response.completions ~= symbol.callTip;
} }

View File

@ -61,8 +61,10 @@ local function showCompletionList(r)
end end
table.sort(completions, function(a, b) return string.upper(a) < string.upper(b) end) table.sort(completions, function(a, b) return string.upper(a) < string.upper(b) end)
local charactersEntered = buffer.current_pos - buffer:word_start_position(buffer.current_pos) local charactersEntered = buffer.current_pos - buffer:word_start_position(buffer.current_pos)
if buffer.char_at[buffer.current_pos - 1] == string.byte('.') local prevChar = buffer.char_at[buffer.current_pos - 1]
or buffer.char_at[buffer.current_pos - 1] == string.byte('(') then if prevChar == string.byte('.')
or prevChar == string.byte('(')
or prevChar == string.byte('[') then
charactersEntered = 0 charactersEntered = 0
end end
buffer:auto_c_show(charactersEntered, table.concat(completions, " ")) buffer:auto_c_show(charactersEntered, table.concat(completions, " "))

View File

@ -11,7 +11,7 @@ if type(_G.keys) == 'table' then
end end
events.connect(events.CHAR_ADDED, function(ch) events.connect(events.CHAR_ADDED, function(ch)
if string.char(ch) == '(' or string.char(ch) == '.' then if string.char(ch) == '(' or string.char(ch) == '.' or string.char(ch) == '[' then
dcd.autocomplete() dcd.autocomplete()
end end
end) end)