Don't allow using indexing to access local variables
This commit is contained in:
parent
bee6fad947
commit
e44116b2cd
|
@ -384,6 +384,20 @@ namespace Upsilon.Binder
|
|||
else if (indexerVariable.TypeContainer == Type.Table)
|
||||
{
|
||||
var tableVariable = (TableVariableSymbol)indexerVariable;
|
||||
if (indexExpression.Index is BoundLiteralExpression literal)
|
||||
{
|
||||
if (literal.Value.Type == Type.Number || literal.Value.Type == Type.String)
|
||||
{
|
||||
var toString = literal.Value.ToString();
|
||||
if (!tableVariable.Variables.TryGetValue(toString, out var variable) || variable.Local)
|
||||
{
|
||||
diagnostics?.LogError($"No variable '{toString}' found in table.", expression.Span);
|
||||
return new VariableSymbol("", Type.Nil, true);
|
||||
}
|
||||
return new VariableSymbol("", variable.TypeContainer, true);
|
||||
}
|
||||
|
||||
}
|
||||
if (tableVariable.TypeContainer is CompositeTypeContainer compositeTypeContainer)
|
||||
{
|
||||
return new VariableSymbol("", compositeTypeContainer.Types[1], true);
|
||||
|
@ -755,7 +769,7 @@ namespace Upsilon.Binder
|
|||
var table = (BoundTableExpression)expression;
|
||||
var realIndex = (BoundLiteralExpression) index;
|
||||
var variableDic = table.Expressions;
|
||||
if (variableDic.TryGetValue(realIndex.Value.ToString(), out var variable))
|
||||
if (variableDic.TryGetValue(realIndex.Value.ToString(), out var variable) && !variable.Local)
|
||||
{
|
||||
return new BoundIndexExpression(expression, index, variable.TypeContainer, e.Span);
|
||||
}
|
||||
|
@ -775,7 +789,7 @@ namespace Upsilon.Binder
|
|||
return new BoundIndexExpression(expression, index, Type.Unknown, e.Span);
|
||||
}
|
||||
var variableDic = tableSymbol.Variables;
|
||||
if (variableDic.TryGetValue(realIndex.Value.ToString(), out var variable))
|
||||
if (variableDic.TryGetValue(realIndex.Value.ToString(), out var variable) && !variable.Local)
|
||||
{
|
||||
return new BoundIndexExpression(expression, index, variable.TypeContainer, e.Span);
|
||||
}
|
||||
|
@ -809,7 +823,7 @@ namespace Upsilon.Binder
|
|||
if (expression.Kind == BoundKind.BoundTableExpression)
|
||||
{
|
||||
var table = (BoundTableExpression)expression;
|
||||
if (table.Expressions.TryGetValue(index, out var variable))
|
||||
if (table.Expressions.TryGetValue(index, out var variable) && !variable.Local)
|
||||
{
|
||||
return new BoundFullStopIndexExpression(expression, index, variable.TypeContainer, e.Span);
|
||||
}
|
||||
|
@ -820,7 +834,7 @@ namespace Upsilon.Binder
|
|||
var table = (BoundVariableExpression)expression;
|
||||
var realTable = table.Variable;
|
||||
var variableDic = ((TableVariableSymbol) realTable.VariableSymbol).Variables;
|
||||
if (variableDic.TryGetValue(index, out var variable))
|
||||
if (variableDic.TryGetValue(index, out var variable) && !variable.Local)
|
||||
{
|
||||
return new BoundFullStopIndexExpression(expression, index, variable.TypeContainer, e.Span);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue