added integer promotion, implicit upcast
This commit is contained in:
parent
cad3f3d747
commit
086fc5bd73
|
@ -13,6 +13,19 @@ import std.string;
|
||||||
import dparse.lexer : tok;
|
import dparse.lexer : tok;
|
||||||
import std.regex;
|
import std.regex;
|
||||||
import containers.hashset : HashSet;
|
import containers.hashset : HashSet;
|
||||||
|
import dparse.ast;
|
||||||
|
|
||||||
|
// https://dlang.org/spec/type.html#implicit-conversions
|
||||||
|
enum string[string] INTEGER_PROMOTIONS = [
|
||||||
|
"bool": "int",
|
||||||
|
"byte": "int",
|
||||||
|
"ubyte": "int",
|
||||||
|
"short": "int",
|
||||||
|
"ushort": "int",
|
||||||
|
"char": "int",
|
||||||
|
"wchar": "int",
|
||||||
|
"dchar": "uint",
|
||||||
|
];
|
||||||
|
|
||||||
void lookupUFCS(Scope* completionScope, DSymbol* beforeDotSymbol, size_t cursorPosition, ref AutocompleteResponse response)
|
void lookupUFCS(Scope* completionScope, DSymbol* beforeDotSymbol, size_t cursorPosition, ref AutocompleteResponse response)
|
||||||
{
|
{
|
||||||
|
@ -106,6 +119,19 @@ DSymbol*[] getSymbolsForUFCS(Scope* completionScope, const(DSymbol)* beforeDotSy
|
||||||
return localAppender.opSlice ~ globalAppender.opSlice;
|
return localAppender.opSlice ~ globalAppender.opSlice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool willImplicitBeUpcasted(string from, string to)
|
||||||
|
{
|
||||||
|
import std.stdio;
|
||||||
|
|
||||||
|
string* found = from in INTEGER_PROMOTIONS;
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return INTEGER_PROMOTIONS[from] == to;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Params:
|
* Params:
|
||||||
* incomingSymbol = the function symbol to check if it is valid for UFCS with `beforeDotType`.
|
* incomingSymbol = the function symbol to check if it is valid for UFCS with `beforeDotType`.
|
||||||
|
@ -126,7 +152,8 @@ bool isCallableWithArg(const(DSymbol)* incomingSymbol, const(DSymbol)* beforeDot
|
||||||
if (incomingSymbol.kind == CompletionKind.functionName && !incomingSymbol
|
if (incomingSymbol.kind == CompletionKind.functionName && !incomingSymbol
|
||||||
.functionParameters.empty)
|
.functionParameters.empty)
|
||||||
{
|
{
|
||||||
return incomingSymbol.functionParameters.front.type is beforeDotType;
|
return beforeDotType is incomingSymbol.functionParameters.front.type ||
|
||||||
|
willImplicitBeUpcasted(beforeDotType.name, incomingSymbol.functionParameters.front.type.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -180,7 +207,8 @@ void getUFCSParenCompletion(ref DSymbol*[] symbols, Scope* completionScope, istr
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DSymbol*[] possibleUFCSSymbol = completionScope.getSymbolsByNameAndCursor(nextToken, cursorPosition);
|
DSymbol*[] possibleUFCSSymbol = completionScope.getSymbolsByNameAndCursor(nextToken, cursorPosition);
|
||||||
foreach(nextSymbol; possibleUFCSSymbol){
|
foreach (nextSymbol; possibleUFCSSymbol)
|
||||||
|
{
|
||||||
if (nextSymbol && nextSymbol.functionParameters)
|
if (nextSymbol && nextSymbol.functionParameters)
|
||||||
{
|
{
|
||||||
if (nextSymbol.isCallableWithArg(firstSymbol.type))
|
if (nextSymbol.isCallableWithArg(firstSymbol.type))
|
||||||
|
@ -191,3 +219,9 @@ void getUFCSParenCompletion(ref DSymbol*[] symbols, Scope* completionScope, istr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
assert(!willImplicitBeUpcasted("A", "B"));
|
||||||
|
assert(willImplicitBeUpcasted("bool", "int"));
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
/home/davu/code/repos/vushu/DCD/tests/tc_locate_ufcs_function/barutils/barutils.d 22
|
|
@ -0,0 +1,2 @@
|
||||||
|
identifiers
|
||||||
|
world v World world /home/davu/code/repos/vushu/DCD/tests/tc_recursive_public_import/testing/a.d 77
|
|
@ -6,4 +6,5 @@ max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
someBool F
|
someBool F
|
||||||
|
someInt F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
|
@ -6,4 +6,5 @@ max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
someByte F
|
someByte F
|
||||||
|
someInt F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
|
@ -6,4 +6,5 @@ max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
someChar F
|
someChar F
|
||||||
|
someInt F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
|
@ -6,4 +6,5 @@ max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
someDchar F
|
someDchar F
|
||||||
|
someUint F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
|
@ -5,5 +5,6 @@ mangleof k
|
||||||
max k
|
max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
|
someInt F
|
||||||
someShort F
|
someShort F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
|
@ -5,5 +5,6 @@ mangleof k
|
||||||
max k
|
max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
|
someInt F
|
||||||
someUbyte F
|
someUbyte F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
|
@ -5,5 +5,6 @@ mangleof k
|
||||||
max k
|
max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
|
someInt F
|
||||||
someUshort F
|
someUshort F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
|
@ -5,5 +5,6 @@ mangleof k
|
||||||
max k
|
max k
|
||||||
min k
|
min k
|
||||||
sizeof k
|
sizeof k
|
||||||
|
someInt F
|
||||||
someWchar F
|
someWchar F
|
||||||
stringof k
|
stringof k
|
||||||
|
|
Loading…
Reference in New Issue