This commit is contained in:
nub31
2025-09-21 20:44:57 +02:00
parent cf2214a299
commit 58b1a5c017
13 changed files with 101 additions and 232 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;