type checker
This commit is contained in:
@@ -14,7 +14,6 @@ public class Generator
|
||||
private readonly Stack<string> _breakLabels = new();
|
||||
private readonly Stack<string> _continueLabels = new();
|
||||
private bool _codeIsReachable = true;
|
||||
private LocalFuncDefinitionNode? _currentFuncDefininition;
|
||||
|
||||
public Generator(List<DefinitionNode> definitions)
|
||||
{
|
||||
@@ -218,7 +217,6 @@ public class Generator
|
||||
|
||||
private void GenerateFuncDefinition(LocalFuncDefinitionNode node)
|
||||
{
|
||||
_currentFuncDefininition = node;
|
||||
_variables.Clear();
|
||||
|
||||
if (node.Global)
|
||||
@@ -290,7 +288,6 @@ public class Generator
|
||||
}
|
||||
|
||||
_builder.AppendLine("}");
|
||||
_currentFuncDefininition = null;
|
||||
}
|
||||
|
||||
private void GenerateStructDefinition(StructDefinitionNode structDefinition)
|
||||
@@ -370,8 +367,7 @@ public class Generator
|
||||
}
|
||||
|
||||
var parameter = funcCall.Parameters[i];
|
||||
var parameterOutput = GenerateExpression(parameter);
|
||||
var result = GenerateTypeConversion(parameterOutput, parameter.Type, expectedType);
|
||||
var result = GenerateExpression(parameter);
|
||||
|
||||
var qbeParameterType = SQT(expectedType.Equals(NubPrimitiveType.Any) ? parameter.Type : expectedType);
|
||||
parameterStrings.Add($"{qbeParameterType} {result}");
|
||||
@@ -436,14 +432,8 @@ public class Generator
|
||||
{
|
||||
if (@return.Value.HasValue)
|
||||
{
|
||||
if (!_currentFuncDefininition!.ReturnType.HasValue)
|
||||
{
|
||||
throw new Exception("Cannot return a value when function does not have a return value");
|
||||
}
|
||||
|
||||
var result = GenerateExpression(@return.Value.Value);
|
||||
var converted = GenerateTypeConversion(result, @return.Value.Value.Type, _currentFuncDefininition.ReturnType.Value);
|
||||
_builder.AppendLine($" ret {converted}");
|
||||
_builder.AppendLine($" ret {result}");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -454,17 +444,10 @@ public class Generator
|
||||
private void GenerateVariableAssignment(VariableAssignmentNode variableAssignment)
|
||||
{
|
||||
var result = GenerateExpression(variableAssignment.Value);
|
||||
var variableType = variableAssignment.Value.Type;
|
||||
|
||||
if (variableAssignment.ExplicitType.HasValue)
|
||||
{
|
||||
result = GenerateTypeConversion(result, variableType, variableAssignment.ExplicitType.Value);
|
||||
variableType = variableAssignment.ExplicitType.Value;
|
||||
}
|
||||
_variables[variableAssignment.Name] = new Variable
|
||||
{
|
||||
Identifier = result,
|
||||
Type = variableType
|
||||
Type = variableAssignment.Value.Type
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user