fix UFCS with partial completion, fix #731

This commit is contained in:
WebFreak001 2023-03-20 01:08:03 +01:00 committed by Jan Jurzitza
parent 109d56b248
commit c324b60da3
4 changed files with 21 additions and 17 deletions

View File

@ -26,6 +26,7 @@ struct TokenCursorResult
CompletionContext completionContext;
istring functionName;
istring symbolIdentifierName;
string partialIdentifier;
}
// https://dlang.org/spec/type.html#implicit-conversions
@ -82,6 +83,13 @@ private TokenCursorResult getCursorToken(const(Token)[] tokens, size_t cursorPos
return tokenCursorResult;
}
// move before identifier for
if (sortedBeforeTokens[$ - 1].type is tok!"identifier")
{
tokenCursorResult.partialIdentifier = sortedBeforeTokens[$ - 1].text;
sortedBeforeTokens = sortedBeforeTokens[0 .. $ - 1];
}
if (sortedBeforeTokens.length >= 2
&& sortedBeforeTokens[$ - 1].type is tok!"."
&& sortedBeforeTokens[$ - 2].type is tok!"identifier")
@ -91,7 +99,7 @@ private TokenCursorResult getCursorToken(const(Token)[] tokens, size_t cursorPos
tokenCursorResult.symbolIdentifierName = istring(sortedBeforeTokens[$ - 2].text);
return tokenCursorResult;
}
else
else if (!tokenCursorResult.partialIdentifier.length)
{
// Check if it's UFCS paren completion
size_t index = goBackToOpenParen(sortedBeforeTokens);
@ -213,17 +221,23 @@ DSymbol*[] getUFCSSymbolsForCursor(Scope* completionScope, ref const(Token)[] to
}
else
{
return getUFCSSymbolsForDotCompletion(cursorSymbolType, completionScope, cursorPosition);
return getUFCSSymbolsForDotCompletion(cursorSymbolType, completionScope, cursorPosition, tokenCursorResult.partialIdentifier);
}
}
private DSymbol*[] getUFCSSymbolsForDotCompletion(const(DSymbol)* symbolType, Scope* completionScope, size_t cursorPosition)
private DSymbol*[] getUFCSSymbolsForDotCompletion(const(DSymbol)* symbolType, Scope* completionScope, size_t cursorPosition, string partial)
{
// local appender
FilteredAppender!(a => a.isCallableWithArg(symbolType), DSymbol*[]) localAppender;
FilteredAppender!((DSymbol* a) =>
a.isCallableWithArg(symbolType)
&& toUpper(a.name.data).startsWith(toUpper(partial)),
DSymbol*[]) localAppender;
// global appender
FilteredAppender!(a => a.isCallableWithArg(symbolType, true), DSymbol*[]) globalAppender;
FilteredAppender!((DSymbol* a) =>
a.isCallableWithArg(symbolType, true)
&& toUpper(a.name.data).startsWith(toUpper(partial)),
DSymbol*[]) globalAppender;
getUFCSSymbols(localAppender, globalAppender, completionScope, cursorPosition);

View File

@ -1,13 +1,3 @@
identifiers
alignof k
arrayStuff1 F
arrayStuff7 F
doArray F
dup k
idup k
init k
length k
mangleof k
ptr k
sizeof k
stringof k

View File

@ -7,7 +7,7 @@ void arrayStuff6(int*[] x) { }
void arrayStuff7(const(int)[] x) { }
void doArray(int[] x, int[] y)
{
y.
y.arraySt
// TODO: arrayStuff4 isn't included yet, since we don't really process
// templates, but should be!
}

View File

@ -1,5 +1,5 @@
set -e
set -u
../../bin/dcd-client $1 -c259 file.d > actual_array_test.txt
../../bin/dcd-client $1 -c266 file.d > actual_array_test.txt
diff actual_array_test.txt expected_array_test.txt