This commit is contained in:
nub31
2025-09-12 21:55:39 +02:00
parent 8856df6bde
commit 2d44b7010b
6 changed files with 246 additions and 191 deletions

View File

@@ -12,8 +12,8 @@ public record StructFieldNode(string Name, TypeNode Type, Optional<ExpressionNod
public record StructFuncNode(string Name, FuncSignatureNode Signature, BlockNode Body) : Node;
public record StructNode(string Module, string Name, List<StructFieldNode> Fields, List<StructFuncNode> Functions, List<InterfaceTypeNode> InterfaceImplementations) : DefinitionNode(Module, Name);
public record StructNode(StructTypeNode StructType, string Module, string Name, List<StructFieldNode> Fields, List<StructFuncNode> Functions, List<InterfaceTypeNode> InterfaceImplementations) : DefinitionNode(Module, Name);
public record InterfaceFuncNode(string Name, FuncSignatureNode Signature) : Node;
public record InterfaceNode(string Module, string Name, List<InterfaceFuncNode> Functions) : DefinitionNode(Module, Name);
public record InterfaceNode(InterfaceTypeNode InterfaceType, string Module, string Name, List<InterfaceFuncNode> Functions) : DefinitionNode(Module, Name);

View File

@@ -200,11 +200,10 @@ public class StructTypeNode(string module, string name, List<StructTypeField> fi
public override int GetHashCode() => HashCode.Combine(typeof(StructTypeNode), Name);
}
public class InterfaceTypeFunc(string name, FuncTypeNode type, int index)
public class InterfaceTypeFunc(string name, FuncTypeNode type)
{
public string Name { get; } = name;
public FuncTypeNode Type { get; } = type;
public int Index { get; } = index;
}
public class InterfaceTypeNode(string module, string name, List<InterfaceTypeFunc> functions) : ComplexTypeNode

View File

@@ -74,7 +74,17 @@ public sealed class TypeChecker
.Select(function => new InterfaceFuncNode(function.Name, CheckFuncSignature(function.Signature)))
.ToList();
return new InterfaceNode(_syntaxTree.Metadata.ModuleName, node.Name, functions);
var functionTypes = new List<InterfaceTypeFunc>();
foreach (var function in node.Functions)
{
var parameters = function.Signature.Parameters.Select(x => ResolveType(x.Type)).ToList();
var funcType = new FuncTypeNode(parameters, ResolveType(function.Signature.ReturnType));
functionTypes.Add(new InterfaceTypeFunc(function.Name, funcType));
}
var type = new InterfaceTypeNode(_syntaxTree.Metadata.ModuleName, node.Name, functionTypes);
return new InterfaceNode(type, _syntaxTree.Metadata.ModuleName, node.Name, functions);
}
private StructNode CheckStructDefinition(StructSyntax node)
@@ -85,7 +95,7 @@ public sealed class TypeChecker
var value = Optional.Empty<ExpressionNode>();
if (field.Value.HasValue)
{
value = CheckExpression(field.Value.Value);
value = CheckExpression(field.Value.Value, ResolveType(field.Type));
}
fields.Add(new StructFieldNode(field.Name, ResolveType(field.Type), value));
@@ -110,8 +120,8 @@ public sealed class TypeChecker
var interfaceImplementations = new List<InterfaceTypeNode>();
foreach (var interfaceImplementation in node.InterfaceImplementations)
{
var type = ResolveType(interfaceImplementation);
if (type is not InterfaceTypeNode interfaceType)
var resolvedType = ResolveType(interfaceImplementation);
if (resolvedType is not InterfaceTypeNode interfaceType)
{
_diagnostics.Add(Diagnostic.Error($"Struct {node.Name} cannot implement non-struct type {interfaceImplementation}").At(interfaceImplementation).Build());
continue;
@@ -120,7 +130,34 @@ public sealed class TypeChecker
interfaceImplementations.Add(interfaceType);
}
return new StructNode(_syntaxTree.Metadata.ModuleName, node.Name, fields, functions, interfaceImplementations);
var fieldTypes = node.Fields
.Select(x => new StructTypeField(x.Name, ResolveType(x.Type), x.Value.HasValue))
.ToList();
var functionTypes = new List<StructTypeFunc>();
foreach (var function in node.Functions)
{
var parameters = function.Signature.Parameters.Select(x => ResolveType(x.Type)).ToList();
var funcType = new FuncTypeNode(parameters, ResolveType(function.Signature.ReturnType));
functionTypes.Add(new StructTypeFunc(function.Name, funcType));
}
var interfaceImplementationTypes = new List<InterfaceTypeNode>();
foreach (var interfaceImplementation in node.InterfaceImplementations)
{
var resolvedType = ResolveType(interfaceImplementation);
if (resolvedType is not InterfaceTypeNode interfaceType)
{
_diagnostics.Add(Diagnostic.Error($"Struct {node.Name} cannot implement non-struct type {interfaceImplementation}").At(interfaceImplementation).Build());
continue;
}
interfaceImplementationTypes.Add(interfaceType);
}
var type = new StructTypeNode(_syntaxTree.Metadata.ModuleName, node.Name, fieldTypes, functionTypes, interfaceImplementationTypes);
return new StructNode(type, _syntaxTree.Metadata.ModuleName, node.Name, fields, functions, interfaceImplementations);
}
private FuncNode CheckFuncDefinition(FuncSyntax node)
@@ -466,7 +503,18 @@ public sealed class TypeChecker
foreach (var initializer in expression.Initializers)
{
initializers.Add(initializer.Key, CheckExpression(initializer.Value));
var typeField = structType.Fields.FirstOrDefault(x => x.Name == initializer.Key);
if (typeField == null)
{
_diagnostics.AddRange(Diagnostic
.Error($"Struct {structType.Name} does not have a field named {initializer.Key}")
.At(initializer.Value)
.Build());
continue;
}
initializers.Add(initializer.Key, CheckExpression(initializer.Value, typeField.Type));
}
var missingFields = structType.Fields