diff --git a/dsymbol/src/dsymbol/ufcs.d b/dsymbol/src/dsymbol/ufcs.d index ad9c732..96d4377 100644 --- a/dsymbol/src/dsymbol/ufcs.d +++ b/dsymbol/src/dsymbol/ufcs.d @@ -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); diff --git a/tests/tc_ufcs_array_type_completion/expected_array_test.txt b/tests/tc_ufcs_array_type_completion/expected_array_test.txt index 07206bd..c404c15 100644 --- a/tests/tc_ufcs_array_type_completion/expected_array_test.txt +++ b/tests/tc_ufcs_array_type_completion/expected_array_test.txt @@ -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 diff --git a/tests/tc_ufcs_array_type_completion/file.d b/tests/tc_ufcs_array_type_completion/file.d index 64fa259..9a42f12 100644 --- a/tests/tc_ufcs_array_type_completion/file.d +++ b/tests/tc_ufcs_array_type_completion/file.d @@ -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! } diff --git a/tests/tc_ufcs_array_type_completion/run.sh b/tests/tc_ufcs_array_type_completion/run.sh index b4f9558..1270e09 100755 --- a/tests/tc_ufcs_array_type_completion/run.sh +++ b/tests/tc_ufcs_array_type_completion/run.sh @@ -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 \ No newline at end of file