diff --git a/astconverter.d b/astconverter.d index f14522a..9db1716 100644 --- a/astconverter.d +++ b/astconverter.d @@ -447,6 +447,7 @@ private: } symbol.acSymbol.callTip = formatCallTip(returnType, functionName, parameters); + symbol.type = returnType; } static string formatCallTip(Type returnType, string name, Parameters parameters, @@ -612,10 +613,6 @@ private: case variableName: case memberVariableName: case functionName: -// Log.trace("Resolving type of ", currentSymbol.acSymbol.name); - currentSymbol.acSymbol.type = resolveType(currentSymbol.type, - currentSymbol.acSymbol.location); - break; case aliasName: const(ACSymbol)* t = resolveType(currentSymbol.type, currentSymbol.acSymbol.location); diff --git a/autocomplete.d b/autocomplete.d index 14df1fd..f7488e1 100644 --- a/autocomplete.d +++ b/autocomplete.d @@ -154,6 +154,15 @@ const(ACSymbol)*[] getSymbolsByTokenChain(T)(const(Scope)* completionScope, break loop; break; case identifier: + // Use function return type instead of the function itself + if (symbols[0].qualifier == SymbolQualifier.func + || symbols[0].kind == CompletionKind.functionName) + { + symbols = symbols[0].type is null ? [] :[symbols[0].type]; + if (symbols.length == 0) + break loop; + } + Log.trace("looking for ", tokens[i].value, " in ", symbols[0].name); symbols = symbols[0].getPartsByName(tokens[i].value); if (symbols.length == 0) @@ -193,7 +202,7 @@ const(ACSymbol)*[] getSymbolsByTokenChain(T)(const(Scope)* completionScope, { auto h = i; skip(); - Parser p; + Parser p = new Parser(); p.setTokens(tokens[h .. i].array()); if (!p.isSliceExpression()) { @@ -209,7 +218,7 @@ const(ACSymbol)*[] getSymbolsByTokenChain(T)(const(Scope)* completionScope, { auto h = i; skip(); - Parser p; + Parser p = new Parser(); p.setTokens(tokens[h .. i].array()); const(ACSymbol)*[] overloads; if (p.isSliceExpression()) @@ -403,6 +412,14 @@ void setCompletions(T)(ref AutocompleteResponse response, if (completionType == CompletionType.identifiers) { + if (symbols[0].qualifier == SymbolQualifier.func + || symbols[0].kind == CompletionKind.functionName) + { + Log.trace("Completion list for return type of function ", symbols[0].name); + symbols = symbols[0].type is null ? [] : [symbols[0].type]; + if (symbols.length == 0) + return; + } foreach (s; symbols[0].parts.filter!(a => a.name !is null && a.name[0] != '*' && (partial is null ? true : a.name.toUpper().startsWith(partial.toUpper()))