Updated for PR

This commit is contained in:
davu 2023-02-25 19:05:40 +01:00 committed by Jan Jurzitza
parent de001983c2
commit 434a838d20
5 changed files with 35 additions and 25 deletions

View File

@ -146,7 +146,8 @@ do
{
if (moduleSymbol is null)
{
DeferredSymbol* deferred = DeferredSymbolsAllocator.instance.make!DeferredSymbol(acSymbol);
DeferredSymbol* deferred = DeferredSymbolsAllocator.instance.make!DeferredSymbol(
acSymbol);
cache.deferredSymbols.insert(deferred);
}
else
@ -188,8 +189,8 @@ do
}
if (!isArr && !isAssoc && !isFunction)
break;
immutable qualifier = isAssoc ? SymbolQualifier.assocArray :
(isFunction ? SymbolQualifier.func : SymbolQualifier.array);
immutable qualifier = isAssoc ? SymbolQualifier.assocArray
: (isFunction ? SymbolQualifier.func : SymbolQualifier.array);
lastSuffix = GCAllocator.instance.make!DSymbol(back, CompletionKind.dummy, lastSuffix);
lastSuffix.qualifier = qualifier;
lastSuffix.ownType = true;
@ -355,6 +356,7 @@ void resolveAliasThis(DSymbol* symbol,
ref TypeLookups typeLookups, Scope* moduleScope, ref ModuleCache cache)
{
import std.algorithm : filter;
import std.array : array;
foreach (aliasThis; typeLookups[].filter!(a => a.kind == TypeLookupKind.aliasThis))
{
@ -363,7 +365,7 @@ void resolveAliasThis(DSymbol* symbol,
if (parts.length == 0 || parts[0].type is null)
continue;
symbol.aliasThisSymbol = parts[0];
symbol.aliasThisSymbols ~= parts;
DSymbol* s = GCAllocator.instance.make!DSymbol(IMPORT_SYMBOL_NAME,
CompletionKind.importSymbol, parts[0].type);
@ -430,7 +432,6 @@ void resolveType(DSymbol* symbol, ref TypeLookups typeLookups,
assert(false, "How did this happen?");
}
void resolveTypeFromInitializer(DSymbol* symbol, TypeLookup* lookup,
Scope* moduleScope, ref ModuleCache cache)
{
@ -450,8 +451,7 @@ void resolveTypeFromInitializer(DSymbol* symbol, TypeLookup* lookup,
if (currentSymbol is null)
return;
}
else
if (crumb == ARRAY_LITERAL_SYMBOL_NAME)
else if (crumb == ARRAY_LITERAL_SYMBOL_NAME)
{
auto arr = GCAllocator.instance.make!(DSymbol)(ARRAY_LITERAL_SYMBOL_NAME, CompletionKind.dummy, currentSymbol);
arr.qualifier = SymbolQualifier.array;

View File

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

View File

@ -129,13 +129,18 @@ bool willImplicitBeUpcasted(string from, string to)
return INTEGER_PROMOTIONS[from] == to;
}
bool matchAliasThis(const(DSymbol)* aliasThisSymbol, const(DSymbol)* incomingSymbol)
bool matchAliasThis(const(DSymbol)* beforeDotType, const(DSymbol)* incomingSymbol)
{
// For now we are only resolving the first alias this symbol
// when multiple alias this are supported, we can rethink another solution
if (!beforeDotType.aliasThisSymbols
|| !beforeDotType.aliasThisSymbols.front
|| beforeDotType.aliasThisSymbols.front == beforeDotType)
{
if(aliasThisSymbol) {
return isCallableWithArg(incomingSymbol, aliasThisSymbol.type);
}
return false;
}
return isCallableWithArg(incomingSymbol, beforeDotType.aliasThisSymbols.front.type);
}
/**
* Params:
@ -158,8 +163,9 @@ bool isCallableWithArg(const(DSymbol)* incomingSymbol, const(DSymbol)* beforeDot
.functionParameters.empty)
{
return beforeDotType is incomingSymbol.functionParameters.front.type
|| willImplicitBeUpcasted(beforeDotType.name, incomingSymbol.functionParameters.front.type.name)
|| matchAliasThis(beforeDotType.aliasThisSymbol, incomingSymbol);
|| willImplicitBeUpcasted(beforeDotType.name, incomingSymbol
.functionParameters.front.type.name)
|| matchAliasThis(beforeDotType, incomingSymbol);
}
@ -208,12 +214,14 @@ bool doUFCSSearch(string beforeToken, string lastToken)
void getUFCSParenCompletion(ref DSymbol*[] symbols, Scope* completionScope, istring firstToken, istring nextToken, size_t cursorPosition)
{
DSymbol* firstSymbol = completionScope.getFirstSymbolByNameAndCursor(firstToken, cursorPosition);
DSymbol* firstSymbol = completionScope.getFirstSymbolByNameAndCursor(
firstToken, cursorPosition);
if (firstSymbol is null)
return;
DSymbol*[] possibleUFCSSymbol = completionScope.getSymbolsByNameAndCursor(nextToken, cursorPosition);
DSymbol*[] possibleUFCSSymbol = completionScope.getSymbolsByNameAndCursor(
nextToken, cursorPosition);
foreach (nextSymbol; possibleUFCSSymbol)
{
if (nextSymbol && nextSymbol.functionParameters)

View File

@ -7,6 +7,7 @@ min k
sizeof k
stringof k
tupleof k
ufcsExactAliasedType F
ufcsSomeInt F
ufcsSomeShort F
x v

View File

@ -20,4 +20,5 @@ void ufcsBarScope(ref scope Foo foo, string mama) {}
void ufcsBarReturnScope(return scope Foo foo, string mama) {}
void ufcsSomeInt(int x) {}
void ufcsSomeShort(short x) {}
void ufcsExactAliasedType(IntAliased x) {}
private void ufcsBarPrivate(Foo foo, string message) {}