2018-11-30 14:28:36 +00:00
|
|
|
using System.Collections.Immutable;
|
2019-01-20 14:01:18 +00:00
|
|
|
using System.Linq;
|
2018-11-30 14:28:36 +00:00
|
|
|
using Upsilon.BaseTypes;
|
2019-01-23 12:15:19 +00:00
|
|
|
using Upsilon.BoundTypes;
|
2018-11-30 14:28:36 +00:00
|
|
|
|
|
|
|
namespace Upsilon.Binder.VariableSymbols
|
|
|
|
{
|
|
|
|
public class ScriptFunctionVariableSymbol : FunctionVariableSymbol
|
|
|
|
{
|
|
|
|
public ScriptFunctionVariableSymbol(string name, bool local, ImmutableArray<VariableSymbol> parameters, Type resultType)
|
|
|
|
: base(name, local, resultType)
|
|
|
|
{
|
2019-01-20 14:01:18 +00:00
|
|
|
FunctionOption.Add(new ScriptFunctionVariableOption(resultType, parameters));
|
2018-11-30 14:28:36 +00:00
|
|
|
}
|
|
|
|
|
2019-01-23 12:15:19 +00:00
|
|
|
public override bool ValidateParameters(ImmutableArray<BoundExpression> callingParameters)
|
2018-11-30 14:28:36 +00:00
|
|
|
{
|
2019-01-20 14:01:18 +00:00
|
|
|
foreach (var functionVariableSymbolOption in FunctionOption)
|
2018-11-30 14:28:36 +00:00
|
|
|
{
|
2019-01-20 14:01:18 +00:00
|
|
|
if (!(functionVariableSymbolOption is ScriptFunctionVariableOption option))
|
|
|
|
continue;
|
|
|
|
if (option.Parameters.Length != callingParameters.Length)
|
|
|
|
continue;
|
|
|
|
bool isValid = true;
|
|
|
|
for (var i = 0; i < option.Parameters.Length; i++)
|
2018-11-30 14:28:36 +00:00
|
|
|
{
|
2019-01-20 14:01:18 +00:00
|
|
|
var functionParameter = option.Parameters[i];
|
|
|
|
var callingParameter = callingParameters[i];
|
2019-01-23 12:15:19 +00:00
|
|
|
if (functionParameter.TypeContainer == Type.Unknown ||
|
|
|
|
callingParameter.Type == Type.Unknown ||
|
|
|
|
callingParameter.Type == Type.Nil)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (!functionParameter.TypeContainer.Type.HasFlag(callingParameter.Type))
|
|
|
|
{
|
|
|
|
isValid = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (functionParameter.TypeContainer.Type.HasFlag(Type.UserData))
|
2018-11-30 14:28:36 +00:00
|
|
|
{
|
2019-01-23 12:15:19 +00:00
|
|
|
var variable = Binder.ResolveVariable(callingParameter, null);
|
|
|
|
if (variable != null && variable.TypeContainer == Type.UserData)
|
2019-01-20 14:01:18 +00:00
|
|
|
{
|
2019-01-23 12:15:19 +00:00
|
|
|
if (!string.Equals(functionParameter.TypeContainer.UserData,
|
|
|
|
callingParameter.Type.UserData))
|
|
|
|
{
|
|
|
|
isValid = false;
|
|
|
|
break;
|
|
|
|
}
|
2019-01-20 14:01:18 +00:00
|
|
|
}
|
2018-11-30 14:28:36 +00:00
|
|
|
}
|
|
|
|
}
|
2019-01-20 14:01:18 +00:00
|
|
|
if (!isValid)
|
|
|
|
continue;
|
2019-01-23 12:15:19 +00:00
|
|
|
return true;
|
2018-11-30 14:28:36 +00:00
|
|
|
}
|
|
|
|
|
2019-01-23 12:15:19 +00:00
|
|
|
return false;
|
2018-11-30 14:28:36 +00:00
|
|
|
}
|
2019-01-20 14:01:18 +00:00
|
|
|
}
|
2018-11-30 14:28:36 +00:00
|
|
|
|
2019-01-20 14:01:18 +00:00
|
|
|
public class ScriptFunctionVariableOption : FunctionVariableSymbolOption
|
|
|
|
{
|
|
|
|
public ImmutableArray<VariableSymbol> Parameters { get; }
|
|
|
|
public bool IsBound { get; set; }
|
|
|
|
|
|
|
|
public ScriptFunctionVariableOption(Type resultType, ImmutableArray<VariableSymbol> parameters) : base(resultType)
|
|
|
|
{
|
|
|
|
Parameters = parameters;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override TypeContainer[] GetParameterTypes()
|
|
|
|
{
|
|
|
|
return Parameters.Select(x => x.TypeContainer).ToArray();
|
|
|
|
}
|
2018-11-30 14:28:36 +00:00
|
|
|
}
|
|
|
|
}
|