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)
|
else if (indexerVariable.TypeContainer == Type.Table)
|
||||||
{
|
{
|
||||||
var tableVariable = (TableVariableSymbol)indexerVariable;
|
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)
|
if (tableVariable.TypeContainer is CompositeTypeContainer compositeTypeContainer)
|
||||||
{
|
{
|
||||||
return new VariableSymbol("", compositeTypeContainer.Types[1], true);
|
return new VariableSymbol("", compositeTypeContainer.Types[1], true);
|
||||||
|
@ -755,7 +769,7 @@ namespace Upsilon.Binder
|
||||||
var table = (BoundTableExpression)expression;
|
var table = (BoundTableExpression)expression;
|
||||||
var realIndex = (BoundLiteralExpression) index;
|
var realIndex = (BoundLiteralExpression) index;
|
||||||
var variableDic = table.Expressions;
|
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);
|
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);
|
return new BoundIndexExpression(expression, index, Type.Unknown, e.Span);
|
||||||
}
|
}
|
||||||
var variableDic = tableSymbol.Variables;
|
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);
|
return new BoundIndexExpression(expression, index, variable.TypeContainer, e.Span);
|
||||||
}
|
}
|
||||||
|
@ -809,7 +823,7 @@ namespace Upsilon.Binder
|
||||||
if (expression.Kind == BoundKind.BoundTableExpression)
|
if (expression.Kind == BoundKind.BoundTableExpression)
|
||||||
{
|
{
|
||||||
var table = (BoundTableExpression)expression;
|
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);
|
return new BoundFullStopIndexExpression(expression, index, variable.TypeContainer, e.Span);
|
||||||
}
|
}
|
||||||
|
@ -820,7 +834,7 @@ namespace Upsilon.Binder
|
||||||
var table = (BoundVariableExpression)expression;
|
var table = (BoundVariableExpression)expression;
|
||||||
var realTable = table.Variable;
|
var realTable = table.Variable;
|
||||||
var variableDic = ((TableVariableSymbol) realTable.VariableSymbol).Variables;
|
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);
|
return new BoundFullStopIndexExpression(expression, index, variable.TypeContainer, e.Span);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue