...
This commit is contained in:
@@ -8,7 +8,7 @@ public record FuncSignatureNode(List<FuncParameterNode> Parameters, NubType Retu
|
||||
|
||||
public record FuncNode(string Module, string Name, string? ExternSymbol, FuncSignatureNode Signature, BlockNode? Body) : DefinitionNode(Module, Name);
|
||||
|
||||
public record StructFieldNode(string Name, NubType Type, Optional<ExpressionNode> Value) : Node;
|
||||
public record StructFieldNode(string Name, NubType Type, ExpressionNode? Value) : Node;
|
||||
|
||||
public record StructFuncNode(string Name, string? Hook, FuncSignatureNode Signature, BlockNode Body) : Node;
|
||||
|
||||
|
||||
@@ -10,13 +10,13 @@ public record StatementFuncCallNode(FuncCallNode FuncCall) : StatementNode;
|
||||
|
||||
public record StatementStructFuncCallNode(StructFuncCallNode StructFuncCall) : StatementNode;
|
||||
|
||||
public record ReturnNode(Optional<ExpressionNode> Value) : TerminalStatementNode;
|
||||
public record ReturnNode(ExpressionNode? Value) : TerminalStatementNode;
|
||||
|
||||
public record AssignmentNode(LValueExpressionNode Target, ExpressionNode Value) : StatementNode;
|
||||
|
||||
public record IfNode(ExpressionNode Condition, BlockNode Body, Optional<Variant<IfNode, BlockNode>> Else) : StatementNode;
|
||||
public record IfNode(ExpressionNode Condition, BlockNode Body, Variant<IfNode, BlockNode>? Else) : StatementNode;
|
||||
|
||||
public record VariableDeclarationNode(string Name, Optional<ExpressionNode> Assignment, NubType Type) : StatementNode;
|
||||
public record VariableDeclarationNode(string Name, ExpressionNode? Assignment, NubType Type) : StatementNode;
|
||||
|
||||
public record ContinueNode : TerminalStatementNode;
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ public sealed class TypeChecker
|
||||
private StructNode CheckStructDefinition(StructSyntax node)
|
||||
{
|
||||
var fieldTypes = node.Fields
|
||||
.Select(x => new NubStructFieldType(x.Name, ResolveType(x.Type), x.Value.HasValue))
|
||||
.Select(x => new NubStructFieldType(x.Name, ResolveType(x.Type), x.Value != null))
|
||||
.ToList();
|
||||
|
||||
var fieldFunctions = node.Functions
|
||||
@@ -132,10 +132,10 @@ public sealed class TypeChecker
|
||||
|
||||
private StructFieldNode CheckStructField(StructFieldSyntax field)
|
||||
{
|
||||
var value = Optional.Empty<ExpressionNode>();
|
||||
if (field.Value.HasValue)
|
||||
ExpressionNode? value = null;
|
||||
if (field.Value != null)
|
||||
{
|
||||
value = CheckExpression(field.Value.Value, ResolveType(field.Type));
|
||||
value = CheckExpression(field.Value, ResolveType(field.Type));
|
||||
}
|
||||
|
||||
return new StructFieldNode(field.Name, ResolveType(field.Type), value);
|
||||
@@ -161,13 +161,13 @@ public sealed class TypeChecker
|
||||
{
|
||||
if (signature.ReturnType is NubVoidType)
|
||||
{
|
||||
body.Statements.Add(new ReturnNode(Optional<ExpressionNode>.Empty()));
|
||||
body.Statements.Add(new ReturnNode(null));
|
||||
}
|
||||
else
|
||||
{
|
||||
Diagnostics.Add(Diagnostic
|
||||
.Error("Not all code paths return a value")
|
||||
.At(node.Body.Tokens.LastOrDefault())
|
||||
.At(node.Body)
|
||||
.Build());
|
||||
}
|
||||
}
|
||||
@@ -194,10 +194,10 @@ public sealed class TypeChecker
|
||||
{
|
||||
var condition = CheckExpression(statement.Condition, new NubBoolType());
|
||||
var body = CheckBlock(statement.Body);
|
||||
var elseStatement = Optional.Empty<Variant<IfNode, BlockNode>>();
|
||||
if (statement.Else.TryGetValue(out var elseSyntax))
|
||||
Variant<IfNode, BlockNode>? elseStatement = null;
|
||||
if (statement.Else.HasValue)
|
||||
{
|
||||
elseStatement = elseSyntax.Match<Variant<IfNode, BlockNode>>(elif => CheckIf(elif), el => CheckBlock(el));
|
||||
elseStatement = statement.Else.Value.Match<Variant<IfNode, BlockNode>>(elif => CheckIf(elif), el => CheckBlock(el));
|
||||
}
|
||||
|
||||
return new IfNode(condition, body, elseStatement);
|
||||
@@ -205,11 +205,11 @@ public sealed class TypeChecker
|
||||
|
||||
private ReturnNode CheckReturn(ReturnSyntax statement)
|
||||
{
|
||||
var value = Optional.Empty<ExpressionNode>();
|
||||
ExpressionNode? value = null;
|
||||
|
||||
if (statement.Value.TryGetValue(out var valueExpression))
|
||||
if (statement.Value != null)
|
||||
{
|
||||
value = CheckExpression(valueExpression, _funcReturnTypes.Peek());
|
||||
value = CheckExpression(statement.Value, _funcReturnTypes.Peek());
|
||||
}
|
||||
|
||||
return new ReturnNode(value);
|
||||
@@ -232,14 +232,14 @@ public sealed class TypeChecker
|
||||
NubType? type = null;
|
||||
ExpressionNode? assignmentNode = null;
|
||||
|
||||
if (statement.ExplicitType.TryGetValue(out var explicitType))
|
||||
if (statement.ExplicitType != null)
|
||||
{
|
||||
type = ResolveType(explicitType);
|
||||
type = ResolveType(statement.ExplicitType);
|
||||
}
|
||||
|
||||
if (statement.Assignment.TryGetValue(out var assignment))
|
||||
if (statement.Assignment != null)
|
||||
{
|
||||
assignmentNode = CheckExpression(assignment, type);
|
||||
assignmentNode = CheckExpression(statement.Assignment, type);
|
||||
type ??= assignmentNode.Type;
|
||||
}
|
||||
|
||||
@@ -250,7 +250,7 @@ public sealed class TypeChecker
|
||||
|
||||
CurrentScope.DeclareVariable(new Variable(statement.Name, type, VariableKind.LValue));
|
||||
|
||||
return new VariableDeclarationNode(statement.Name, Optional.OfNullable(assignmentNode), type);
|
||||
return new VariableDeclarationNode(statement.Name, assignmentNode, type);
|
||||
}
|
||||
|
||||
private WhileNode CheckWhile(WhileSyntax statement)
|
||||
@@ -593,8 +593,8 @@ public sealed class TypeChecker
|
||||
|
||||
if (function != null)
|
||||
{
|
||||
var parameters = function.Parameters.Select(x => ResolveType(x.Type)).ToList();
|
||||
var type = new NubFuncType(parameters, ResolveType(function.ReturnType));
|
||||
var parameters = function.Signature.Parameters.Select(x => ResolveType(x.Type)).ToList();
|
||||
var type = new NubFuncType(parameters, ResolveType(function.Signature.ReturnType));
|
||||
return new FuncIdentifierNode(type, CurrentModule, expression.Name, function.ExternSymbol);
|
||||
}
|
||||
|
||||
@@ -618,8 +618,8 @@ public sealed class TypeChecker
|
||||
var function = module.Functions(includePrivate).FirstOrDefault(x => x.Name == expression.Name);
|
||||
if (function != null)
|
||||
{
|
||||
var parameters = function.Parameters.Select(x => ResolveType(x.Type)).ToList();
|
||||
var type = new NubFuncType(parameters, ResolveType(function.ReturnType));
|
||||
var parameters = function.Signature.Parameters.Select(x => ResolveType(x.Type)).ToList();
|
||||
var type = new NubFuncType(parameters, ResolveType(function.Signature.ReturnType));
|
||||
return new FuncIdentifierNode(type, expression.Module, expression.Name, function.ExternSymbol);
|
||||
}
|
||||
|
||||
@@ -695,9 +695,9 @@ public sealed class TypeChecker
|
||||
{
|
||||
NubStructType? structType = null;
|
||||
|
||||
if (expression.StructType.TryGetValue(out var customType))
|
||||
if (expression.StructType != null)
|
||||
{
|
||||
var checkedType = ResolveType(customType);
|
||||
var checkedType = ResolveType(expression.StructType);
|
||||
if (checkedType is not NubStructType checkedStructType)
|
||||
{
|
||||
throw new UnreachableException("Parser fucked up");
|
||||
@@ -823,7 +823,7 @@ public sealed class TypeChecker
|
||||
return false;
|
||||
}
|
||||
|
||||
return !ifNode.Else.TryGetValue(out var elseStatement) || elseStatement.Match(AlwaysReturns, AlwaysReturns);
|
||||
return !ifNode.Else.HasValue || ifNode.Else.Value.Match(AlwaysReturns, AlwaysReturns);
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
@@ -878,20 +878,30 @@ public sealed class TypeChecker
|
||||
|
||||
var includePrivate = customType.Module == CurrentModule;
|
||||
|
||||
var structType = module.StructTypes(includePrivate).FirstOrDefault(x => x.Name == customType.Name);
|
||||
if (structType != null)
|
||||
var strctDef = module.Structs(includePrivate).FirstOrDefault(x => x.Name == customType.Name);
|
||||
if (strctDef != null)
|
||||
{
|
||||
var result = new NubStructType(customType.Module, structType.Name, [], []);
|
||||
var result = new NubStructType(customType.Module, strctDef.Name, [], []);
|
||||
_typeCache[key] = result;
|
||||
|
||||
var fields = structType.Fields.Select(x => new NubStructFieldType(x.Name, ResolveType(x.Type), x.HasDefaultValue)).ToList();
|
||||
var fields = strctDef.Fields
|
||||
.Select(x => new NubStructFieldType(x.Name, ResolveType(x.Type), x.Value != null))
|
||||
.ToList();
|
||||
|
||||
result.Fields.AddRange(fields);
|
||||
|
||||
foreach (var function in structType.Functions)
|
||||
{
|
||||
var parameters = function.Parameters.Select(x => ResolveType(x.Type)).ToList();
|
||||
result.Functions.Add(new NubStructFuncType(function.Name, function.Hook, parameters, ResolveType(function.ReturnType)));
|
||||
}
|
||||
var functions = strctDef.Functions
|
||||
.Select(x =>
|
||||
{
|
||||
var parameters = x.Signature.Parameters
|
||||
.Select(y => ResolveType(y.Type))
|
||||
.ToList();
|
||||
|
||||
return new NubStructFuncType(x.Name, x.Hook, parameters, ResolveType(x.Signature.ReturnType));
|
||||
})
|
||||
.ToList();
|
||||
|
||||
result.Functions.AddRange(functions);
|
||||
|
||||
ReferencedStructTypes.Add(result);
|
||||
return result;
|
||||
|
||||
Reference in New Issue
Block a user