From e741e9c355e3f8cf6344babc0c2eebc6d6187071 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Wed, 12 Dec 2018 16:34:47 +0100 Subject: [PATCH] Made resolvevariable in binder public static so VS Code extension can use it --- Upsilon/Binder/Binder.cs | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/Upsilon/Binder/Binder.cs b/Upsilon/Binder/Binder.cs index d292a96..5b29008 100644 --- a/Upsilon/Binder/Binder.cs +++ b/Upsilon/Binder/Binder.cs @@ -12,7 +12,7 @@ using Type = Upsilon.BaseTypes.Type; namespace Upsilon.Binder { - internal class Binder : IDisposable + public class Binder : IDisposable { private Diagnostics _diagnostics; public BoundScope Scope { get; private set; } @@ -216,7 +216,11 @@ namespace Upsilon.Binder } var returnType = Type.Unknown; - var resolved = ResolveVariable(expression); + var resolved = ResolveVariable(expression, _diagnostics); + if (resolved == null) + { + _diagnostics.LogError("Can't resolve variable", expression.Span); + } if (resolved is FunctionVariableSymbol function) { if (function is ScriptFunctionVariableSymbol scriptFunction) @@ -294,7 +298,7 @@ namespace Upsilon.Binder return new BoundFunctionCallExpression(expression, parameters.ToImmutable(), e.Span, returnType); } - private VariableSymbol ResolveVariable(BoundExpression expression) + public static VariableSymbol ResolveVariable(BoundExpression expression, Diagnostics diagnostics) { if (expression.Kind == BoundKind.VariableExpression) { @@ -305,20 +309,27 @@ namespace Upsilon.Binder { var fullStopIndexExpression = (BoundFullStopIndexExpression) expression; var indexerExpression = fullStopIndexExpression.Expression; - var indexerVariable = ResolveVariable(indexerExpression); - if (indexerVariable.Type == Type.Table) + var indexerVariable = ResolveVariable(indexerExpression, diagnostics); + if (indexerVariable == null) + { + diagnostics?.LogError("Can't resolve variable", expression.Span); + } + else if (indexerVariable.Type == Type.Table) { return ((TableVariableSymbol)indexerVariable).Variables[fullStopIndexExpression.Index]; } - if (indexerVariable.Type == Type.UserData) + else if (indexerVariable.Type == Type.UserData) { var parent = (UserDataBoundTypeDefinition) ((UserDataVariableSymbol) indexerVariable).BoundTypeDefinition; - var bDefProperty = parent.Properties[fullStopIndexExpression.Index.ToLowerInvariant()]; - var boundDef = BoundTypeHandler.GetTypeDefinition(bDefProperty.ActualType); - if (boundDef != null) + if (parent.Properties.TryGetValue(fullStopIndexExpression.Index.ToLowerInvariant(), + out var bDefProperty)) { - return new UserDataVariableSymbol(fullStopIndexExpression.Index, boundDef, parent); + var boundDef = BoundTypeHandler.GetTypeDefinition(bDefProperty.ActualType); + if (boundDef != null) + { + return new UserDataVariableSymbol(fullStopIndexExpression.Index, boundDef, parent); + } } } else if (indexerVariable.Type == Type.Unknown) @@ -341,7 +352,6 @@ namespace Upsilon.Binder { return new VariableSymbol("", expression.Type, true); } - _diagnostics.LogError("Can't resolve variable", expression.Span); return null; } @@ -773,8 +783,12 @@ namespace Upsilon.Binder return new BoundFullStopIndexExpression(expression, index, Type.Unknown, e.Span); } - var variableSymbol = ResolveVariable(expression); - if (variableSymbol != null) + var variableSymbol = ResolveVariable(expression, _diagnostics); + if (variableSymbol == null) + { + _diagnostics.LogError("Can't resolve variable", expression.Span); + } + else { var functionParameter = (UserDataVariableSymbol) variableSymbol; var udBoundDef = (UserDataBoundTypeDefinition)functionParameter.BoundTypeDefinition;