Validate function call parameter types
This commit is contained in:
parent
a64df2ff6b
commit
ba82b28ee4
|
@ -194,7 +194,6 @@ namespace Upsilon.Binder
|
||||||
var expression = BindExpression(e.Identifier);
|
var expression = BindExpression(e.Identifier);
|
||||||
if (expression.Type != Type.Function && expression.Type != Type.Unknown)
|
if (expression.Type != Type.Function && expression.Type != Type.Unknown)
|
||||||
{
|
{
|
||||||
//TODO Better error
|
|
||||||
_diagnostics.LogError($"Unknown function called.", e.Span);
|
_diagnostics.LogError($"Unknown function called.", e.Span);
|
||||||
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
||||||
}
|
}
|
||||||
|
@ -232,9 +231,33 @@ namespace Upsilon.Binder
|
||||||
|
|
||||||
returnType = function.ResultType;
|
returnType = function.ResultType;
|
||||||
|
|
||||||
|
var pars = function.Parameters;
|
||||||
|
if (pars.Length != parameters.Count)
|
||||||
|
{
|
||||||
|
_diagnostics.LogError(
|
||||||
|
$"Invalid number of parameters for function '{function.Name}'. Expected {pars.Length}, got {parameters.Count}",
|
||||||
|
e.Span);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (var i = 0; i < pars.Length; i++)
|
||||||
|
{
|
||||||
|
var functionParameter = pars[i];
|
||||||
|
var callingParameter = parameters[i];
|
||||||
|
if (functionParameter.Type != Type.Unknown &&
|
||||||
|
callingParameter.Type != Type.Unknown && callingParameter.Type != Type.Nil)
|
||||||
|
{
|
||||||
|
if (callingParameter.Type != functionParameter.Type)
|
||||||
|
{
|
||||||
|
_diagnostics.LogError(
|
||||||
|
$"Invalid type for function '{function.Name}' at parameter '{functionParameter.Name}'. " +
|
||||||
|
$"Expected type '{functionParameter.Type}', got '{callingParameter.Type}'",
|
||||||
|
callingParameter.Span);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: validate parameters
|
|
||||||
return new BoundFunctionCallExpression(expression, parameters.ToImmutable(), e.Span, returnType);
|
return new BoundFunctionCallExpression(expression, parameters.ToImmutable(), e.Span, returnType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,7 +493,7 @@ namespace Upsilon.Binder
|
||||||
|
|
||||||
foreach (var parameter in func.Parameters)
|
foreach (var parameter in func.Parameters)
|
||||||
{
|
{
|
||||||
var vari = new VariableSymbol(parameter.VariableSymbol.Name, Type.Unknown, true);
|
var vari = new VariableSymbol(parameter.VariableSymbol.Name, parameter.VariableSymbol.Type, true);
|
||||||
parameters.Add(vari);
|
parameters.Add(vari);
|
||||||
innerScope.DefineLocalVariable(vari);
|
innerScope.DefineLocalVariable(vari);
|
||||||
}
|
}
|
||||||
|
@ -499,7 +522,7 @@ namespace Upsilon.Binder
|
||||||
// don't allow assigning different typed variables to a variable, unless either of them is nil, allow assigning nil to all variables
|
// don't allow assigning different typed variables to a variable, unless either of them is nil, allow assigning nil to all variables
|
||||||
if (variable.Type != Type.Function)
|
if (variable.Type != Type.Function)
|
||||||
{
|
{
|
||||||
if (variable.Type == Type.Nil )
|
if (variable.Type == Type.Nil || variable.Type == Type.Unknown)
|
||||||
{
|
{
|
||||||
variable.Type = Type.Function;
|
variable.Type = Type.Function;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue