From 2fd33fc27fc949828d2def632226a96cb80034fa Mon Sep 17 00:00:00 2001 From: davu Date: Mon, 13 Mar 2023 19:17:33 +0100 Subject: [PATCH] Adding non contrainted templates into ufcs completion --- dsymbol/src/dsymbol/tests.d | 27 ++++++++++++++++++++++++++- dsymbol/src/dsymbol/ufcs.d | 3 +-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/dsymbol/src/dsymbol/tests.d b/dsymbol/src/dsymbol/tests.d index 0b23aac..ffb6e35 100644 --- a/dsymbol/src/dsymbol/tests.d +++ b/dsymbol/src/dsymbol/tests.d @@ -658,7 +658,6 @@ ScopeSymbolPair generateAutocompleteTreesProd(string source, string filename, si version (linux) { - import std.string; enum string ufcsExampleCode = q{class Incrementer { @@ -690,4 +689,30 @@ void doIncrement() assert(pair.ufcsSymbols[0].name == "increment"); } + +enum string ufcsTemplateExampleCode = +q{int increment(T)(T x) +{ + return x++; +} +void doIncrement() +{ + int life = 42; + life. +}}; + +unittest + { + import dsymbol.ufcs; + + writeln("Getting Templated UFCS Symbols For life"); + ModuleCache cache; + // position of variable life + size_t cursorPos = 82; + auto pair = generateAutocompleteTreesProd(ufcsTemplateExampleCode, randomDFilename, cursorPos, cache); + assert(pair.ufcsSymbols.length > 0); + assert(pair.ufcsSymbols[0].name == "increment"); + + } + } diff --git a/dsymbol/src/dsymbol/ufcs.d b/dsymbol/src/dsymbol/ufcs.d index 3079f75..51ecce6 100644 --- a/dsymbol/src/dsymbol/ufcs.d +++ b/dsymbol/src/dsymbol/ufcs.d @@ -65,7 +65,6 @@ private DSymbol* deduceSymbolType(DSymbol* symbol) private bool isInvalidForUFCSCompletion(const(DSymbol)* beforeDotSymbol) { return beforeDotSymbol is null - || beforeDotSymbol.kind == CompletionKind.templateName || beforeDotSymbol.name is getBuiltinTypeName(tok!"void") || (beforeDotSymbol.type !is null && beforeDotSymbol.type.name is getBuiltinTypeName( tok!"void")); @@ -307,11 +306,11 @@ bool isCallableWithArg(DSymbol* incomingSymbol, const(DSymbol)* beforeDotType, b .functionParameters.empty) { if (beforeDotType is incomingSymbol.functionParameters.front.type + || incomingSymbol.functionParameters.front.type.kind is CompletionKind.typeTmpParam // non constrained template || willImplicitBeUpcasted(beforeDotType.name, incomingSymbol .functionParameters.front.type.name) || matchAliasThis(beforeDotType, incomingSymbol, recursionDepth)) { - // incomingSymbol.kind = CompletionKind.ufcsName; return true; }