From d78f1088c8900d24e3391bd835ad80cb95756833 Mon Sep 17 00:00:00 2001 From: nub31 Date: Fri, 12 Sep 2025 23:18:06 +0200 Subject: [PATCH] Better error messages for function parameter mismatch --- compiler/NubLang/TypeChecking/TypeChecker.cs | 23 +++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/compiler/NubLang/TypeChecking/TypeChecker.cs b/compiler/NubLang/TypeChecking/TypeChecker.cs index 6154708..b1a7300 100644 --- a/compiler/NubLang/TypeChecking/TypeChecker.cs +++ b/compiler/NubLang/TypeChecking/TypeChecker.cs @@ -456,7 +456,10 @@ public sealed class TypeChecker if (expression.Parameters.Count != funcType.Parameters.Count) { - throw new TypeCheckerException(Diagnostic.Error($"Function {funcType} expects {funcType.Parameters} but got {expression.Parameters.Count} parameters").At(expression.Expression).Build()); + throw new TypeCheckerException(Diagnostic + .Error($"Function {funcType} expects {funcType.Parameters.Count} parameters but got {expression.Parameters.Count}") + .At(expression.Parameters.LastOrDefault(expression)) + .Build()); } var parameters = new List(); @@ -468,7 +471,10 @@ public sealed class TypeChecker var parameterExpression = CheckExpression(parameter, expectedType); if (parameterExpression.Type != expectedType) { - throw new TypeCheckerException(Diagnostic.Error($"Parameter {i + 1} does not match the type {expectedType} for function {funcType}").At(parameter).Build()); + throw new TypeCheckerException(Diagnostic + .Error($"Parameter {i + 1} does not match the type {expectedType} for function {funcType}") + .At(parameter) + .Build()); } parameters.Add(parameterExpression); @@ -489,6 +495,14 @@ public sealed class TypeChecker throw new TypeCheckerException(Diagnostic.Error($"Function {expression.Name} not found on struct {structType}").At(expression).Build()); } + if (expression.Parameters.Count != function.Type.Parameters.Count) + { + throw new TypeCheckerException(Diagnostic + .Error($"Function {function.Type} expects {function.Type.Parameters.Count} parameters but got {expression.Parameters.Count}") + .At(expression.Parameters.LastOrDefault(expression)) + .Build()); + } + var parameters = new List(); for (var i = 0; i < expression.Parameters.Count; i++) { @@ -498,7 +512,10 @@ public sealed class TypeChecker var parameterExpression = CheckExpression(parameter, expectedType); if (parameterExpression.Type != expectedType) { - throw new TypeCheckerException(Diagnostic.Error($"Parameter {i + 1} does not match the type {expectedType} for function {function}").At(parameter).Build()); + throw new TypeCheckerException(Diagnostic + .Error($"Parameter {i + 1} does not match the type {expectedType} for function {function}") + .At(parameter) + .Build()); } parameters.Add(parameterExpression);