From 364e71198e19c89dec60b00b243cabc04648ae8b Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Wed, 23 Jan 2019 13:40:10 +0100 Subject: [PATCH] Better handling of binding when dealing with unknown userdata --- Upsilon/BaseTypes/TypeContainer.cs | 18 +++---------- Upsilon/BaseTypes/TypeConversion.cs | 17 ++++-------- Upsilon/BaseTypes/UserData/ListUserData.cs | 7 +++-- Upsilon/Binder/Binder.cs | 26 +++++++++++++++---- .../BoundExpressions/BoundTableExpression.cs | 5 +--- .../ScriptFunctionVariableSymbol.cs | 5 +++- 6 files changed, 37 insertions(+), 41 deletions(-) diff --git a/Upsilon/BaseTypes/TypeContainer.cs b/Upsilon/BaseTypes/TypeContainer.cs index 5e50939..c502692 100644 --- a/Upsilon/BaseTypes/TypeContainer.cs +++ b/Upsilon/BaseTypes/TypeContainer.cs @@ -88,19 +88,6 @@ namespace Upsilon.BaseTypes } } - /* - internal class IgnoredUserDataTypeContainer : TypeContainer - { - public IgnoredUserDataTypeContainer() : base(BaseTypes.Type.Unknown) - { - Type = Type.UserData; - } - - public IgnoredUserDataTypeContainer(string userData) : base(userData) - { - } - }*/ - public class UndefinedUserDataTypeContainer : TypeContainer { private System.Type RealType { get; set; } @@ -143,10 +130,11 @@ namespace Upsilon.BaseTypes public class CompositeTypeContainer : TypeContainer { - public ImmutableArray Types { get; set; } + public ImmutableArray Types { get; } - public CompositeTypeContainer() : base(Type.Table) + public CompositeTypeContainer(ImmutableArray types) : base(Type.Table) { + Types = types; } public override string ToString() diff --git a/Upsilon/BaseTypes/TypeConversion.cs b/Upsilon/BaseTypes/TypeConversion.cs index 92f7bea..71a2152 100644 --- a/Upsilon/BaseTypes/TypeConversion.cs +++ b/Upsilon/BaseTypes/TypeConversion.cs @@ -145,27 +145,20 @@ namespace Upsilon.BaseTypes if (t.IsArray) { var elementType = t.GetElementType(); - return new CompositeTypeContainer() - { - Types = new TypeContainer[]{Type.Number, GetScriptType(elementType)}.ToImmutableArray() - }; + return new CompositeTypeContainer(new TypeContainer[] {Type.Number, GetScriptType(elementType)} + .ToImmutableArray()); } if (typeof(IList).IsAssignableFrom(t)) { var generic = t.GetGenericArguments()[0]; - return new CompositeTypeContainer() - { - Types = new TypeContainer[]{Type.Number, GetScriptType(generic)}.ToImmutableArray() - }; + return new CompositeTypeContainer(new TypeContainer[] {Type.Number, GetScriptType(generic)} + .ToImmutableArray()); } if (typeof(IDictionary).IsAssignableFrom(t)) { var key = t.GetGenericArguments()[0]; var value = t.GetGenericArguments()[1]; - return new CompositeTypeContainer() - { - Types = new[]{GetScriptType(key), GetScriptType(value)}.ToImmutableArray() - }; + return new CompositeTypeContainer(new[] {GetScriptType(key), GetScriptType(value)}.ToImmutableArray()); } if (typeof(IEnumerable).IsAssignableFrom(t)) return Type.Table; diff --git a/Upsilon/BaseTypes/UserData/ListUserData.cs b/Upsilon/BaseTypes/UserData/ListUserData.cs index 11ed6de..2a7942f 100644 --- a/Upsilon/BaseTypes/UserData/ListUserData.cs +++ b/Upsilon/BaseTypes/UserData/ListUserData.cs @@ -88,10 +88,9 @@ namespace Upsilon.BaseTypes.UserData } } - public override TypeContainer Type => new CompositeTypeContainer() - { - Types = new TypeContainer[]{BaseTypes.Type.Number, new TypeContainer(TypeName)}.ToImmutableArray() - }; + public override TypeContainer Type => + new CompositeTypeContainer(new TypeContainer[] {BaseTypes.Type.Number, new TypeContainer(TypeName)} + .ToImmutableArray()); public override object ToCSharpObject() { return List; diff --git a/Upsilon/Binder/Binder.cs b/Upsilon/Binder/Binder.cs index 698d7b3..f3f899c 100644 --- a/Upsilon/Binder/Binder.cs +++ b/Upsilon/Binder/Binder.cs @@ -365,6 +365,10 @@ namespace Upsilon.Binder if (parent.Properties.TryGetValue(fullStopIndexExpression.Index.ToLowerInvariant(), out var bDefProperty)) { + var userData = bDefProperty.Type.UserData; + if (string.IsNullOrEmpty(userData)) + return new VariableSymbol(fullStopIndexExpression.Index, Type.Unknown, true); + var boundDef = BoundTypeHandler.GetTypeDefinition(bDefProperty.Type.UserData ?? bDefProperty.ActualType); if (boundDef != null) { @@ -437,8 +441,12 @@ namespace Upsilon.Binder { if (expression.Type == Type.UserData) { - var boundDef = BoundTypeHandler.GetTypeDefinition(expression.Type.UserData); - return new UserDataVariableSymbol("", boundDef, true); + var ud = expression.Type.UserData; + if (!string.IsNullOrEmpty(ud)) + { + var boundDef = BoundTypeHandler.GetTypeDefinition(ud); + return new UserDataVariableSymbol("", boundDef, true); + } } return new VariableSymbol("", expression.Type, true); } @@ -495,7 +503,7 @@ namespace Upsilon.Binder else if (assignment.Type == Type.UserData) { var ud = assignment.Type.UserData; - if (ud == null) + if (string.IsNullOrEmpty(ud)) { variable = new VariableSymbol(name, Type.Unknown, isLocal); } @@ -1009,8 +1017,16 @@ namespace Upsilon.Binder var type = composite.Types[1]; if (type == Type.UserData) { - valueVariable = new UserDataVariableSymbol(valueVar.Name, - BoundTypeHandler.GetTypeDefinition(type.UserData), true); + var ud = type.UserData; + if (ud == null) + { + valueVariable = new VariableSymbol(valueVar.Name, Type.Unknown, true); + } + else + { + valueVariable = new UserDataVariableSymbol(valueVar.Name, + BoundTypeHandler.GetTypeDefinition(type.UserData), true); + } } else if (type == Type.Table) { diff --git a/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs b/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs index 9776f02..1d10ad5 100644 --- a/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs @@ -51,10 +51,7 @@ namespace Upsilon.Binder valueRealType = valueType; var arr = new TypeContainer[] {BaseTypes.Type.String, valueRealType}; - return new CompositeTypeContainer() - { - Types = arr.ToImmutableArray() - }; + return new CompositeTypeContainer(arr.ToImmutableArray()); } } diff --git a/Upsilon/Binder/VariableSymbols/ScriptFunctionVariableSymbol.cs b/Upsilon/Binder/VariableSymbols/ScriptFunctionVariableSymbol.cs index ea80bb9..f019cd6 100644 --- a/Upsilon/Binder/VariableSymbols/ScriptFunctionVariableSymbol.cs +++ b/Upsilon/Binder/VariableSymbols/ScriptFunctionVariableSymbol.cs @@ -42,7 +42,10 @@ namespace Upsilon.Binder.VariableSymbols var variable = Binder.ResolveVariable(callingParameter, null); if (variable != null && variable.TypeContainer == Type.UserData) { - if (!string.Equals(functionParameter.TypeContainer.UserData, + var userData = functionParameter.TypeContainer.UserData; + if (string.IsNullOrEmpty(userData)) + continue; + if (!string.Equals(userData, callingParameter.Type.UserData)) { isValid = false;