Adding alias this to symbol and match algorithm

This commit is contained in:
davu 2023-02-25 15:05:57 +01:00 committed by Jan Jurzitza
parent 86cb518b27
commit de001983c2
6 changed files with 31 additions and 6 deletions

View File

@ -362,6 +362,9 @@ void resolveAliasThis(DSymbol* symbol,
auto parts = symbol.getPartsByName(aliasThis.breadcrumbs.front);
if (parts.length == 0 || parts[0].type is null)
continue;
symbol.aliasThisSymbol = parts[0];
DSymbol* s = GCAllocator.instance.make!DSymbol(IMPORT_SYMBOL_NAME,
CompletionKind.importSymbol, parts[0].type);
symbol.addChild(s, true);

View File

@ -375,6 +375,8 @@ struct DSymbol
// TODO: assert that the type is not a function
DSymbol* type;
// Is using alias this
DSymbol* aliasThisSymbol;
/**
* Names of function arguments
*/

View File

@ -13,7 +13,6 @@ import std.string;
import dparse.lexer : tok;
import std.regex;
import containers.hashset : HashSet;
import dparse.ast;
// https://dlang.org/spec/type.html#implicit-conversions
enum string[string] INTEGER_PROMOTIONS = [
@ -121,8 +120,6 @@ DSymbol*[] getSymbolsForUFCS(Scope* completionScope, const(DSymbol)* beforeDotSy
bool willImplicitBeUpcasted(string from, string to)
{
import std.stdio;
string* found = from in INTEGER_PROMOTIONS;
if (!found)
{
@ -132,6 +129,14 @@ bool willImplicitBeUpcasted(string from, string to)
return INTEGER_PROMOTIONS[from] == to;
}
bool matchAliasThis(const(DSymbol)* aliasThisSymbol, const(DSymbol)* incomingSymbol)
{
if(aliasThisSymbol) {
return isCallableWithArg(incomingSymbol, aliasThisSymbol.type);
}
return false;
}
/**
* Params:
* incomingSymbol = the function symbol to check if it is valid for UFCS with `beforeDotType`.
@ -152,8 +157,10 @@ bool isCallableWithArg(const(DSymbol)* incomingSymbol, const(DSymbol)* beforeDot
if (incomingSymbol.kind == CompletionKind.functionName && !incomingSymbol
.functionParameters.empty)
{
return beforeDotType is incomingSymbol.functionParameters.front.type ||
willImplicitBeUpcasted(beforeDotType.name, incomingSymbol.functionParameters.front.type.name);
return beforeDotType is incomingSymbol.functionParameters.front.type
|| willImplicitBeUpcasted(beforeDotType.name, incomingSymbol.functionParameters.front.type.name)
|| matchAliasThis(beforeDotType.aliasThisSymbol, incomingSymbol);
}
return false;

View File

@ -0,0 +1,12 @@
identifiers
alignof k
init k
mangleof k
max k
min k
sizeof k
stringof k
tupleof k
ufcsSomeInt F
ufcsSomeShort F
x v

View File

@ -5,7 +5,7 @@ struct Foo {
}
struct IntAliased {
int x;
short x;
alias x this;
}
@ -19,4 +19,5 @@ void ufcsBarRefImmuttableWrapped(ref immutable(Foo) foo, string mama) {}
void ufcsBarScope(ref scope Foo foo, string mama) {}
void ufcsBarReturnScope(return scope Foo foo, string mama) {}
void ufcsSomeInt(int x) {}
void ufcsSomeShort(short x) {}
private void ufcsBarPrivate(Foo foo, string message) {}