Skip to content

Commit 3eb0418

Browse files
authored
Feature/func overload errors (#158)
* #155 - new errors * #155 - specify overloads
1 parent 37b5841 commit 3eb0418

File tree

5 files changed

+27
-5
lines changed

5 files changed

+27
-5
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Expressions.PrimaryExpressions;
3+
using HydraScript.Domain.IR.Impl.Symbols.Ids;
4+
5+
namespace HydraScript.Application.StaticAnalysis.Exceptions;
6+
7+
[ExcludeFromCodeCoverage]
8+
public class OverloadAlreadyExists(IdentifierReference ident, FunctionSymbolId overload) :
9+
SemanticException(ident.Segment, $"Overload already exists: {overload}");
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
using HydraScript.Domain.FrontEnd.Parser.Impl.Ast.Nodes.Expressions.PrimaryExpressions;
3+
using HydraScript.Domain.IR.Impl.Symbols.Ids;
4+
5+
namespace HydraScript.Application.StaticAnalysis.Exceptions;
6+
7+
[ExcludeFromCodeCoverage]
8+
public class UnknownFunctionOverload(IdentifierReference ident, FunctionSymbolId overload) :
9+
SemanticException(ident.Segment, $"Unknown overload: {overload}");

src/Application/HydraScript.Application.StaticAnalysis/Impl/FunctionWithUndefinedReturnStorage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void Save(FunctionSymbol symbol, FunctionDeclaration declaration)
1616
public FunctionDeclaration Get(FunctionSymbol symbol)
1717
{
1818
if (!_declarations.Remove(symbol.Id, out var declaration))
19-
throw new InvalidOperationException(message: "Cannot get function that has not been saved");
19+
throw new InvalidOperationException(message: $"Cannot get {symbol} that has not been saved");
2020

2121
return declaration;
2222
}

src/Application/HydraScript.Application.StaticAnalysis/Visitors/DeclarationVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public VisitUnit Visit(FunctionDeclaration visitable)
7474
var functionSymbolId = new FunctionSymbolId(visitable.Name, parameters.Select(x => x.Type));
7575
visitable.ComputedFunctionAddress = functionSymbolId.ToString();
7676
if (_symbolTables[visitable.Parent.Scope].ContainsSymbol(functionSymbolId))
77-
throw new DeclarationAlreadyExists(visitable.Name);
77+
throw new OverloadAlreadyExists(visitable.Name, functionSymbolId);
7878

7979
for (var i = 0; i < parameters.Count; i++)
8080
{

src/Application/HydraScript.Application.StaticAnalysis/Visitors/SemanticChecker.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,13 +410,17 @@ public Type Visit(CallExpression visitable)
410410
{
411411
var objectType = (ObjectType)visitable.Member.Accept(This);
412412
var availableMethods = _methodStorage.GetAvailableMethods(objectType);
413-
functionSymbol = availableMethods[new FunctionSymbolId(objectType.LastAccessedMethodName, [objectType, ..parameters])];
413+
var methodKey = new FunctionSymbolId(objectType.LastAccessedMethodName, [objectType, ..parameters]);
414+
functionSymbol =
415+
availableMethods.GetValueOrDefault(methodKey)
416+
?? throw new UnknownFunctionOverload(visitable.Id, methodKey);
414417
}
415418
else
416419
{
420+
var functionKey = new FunctionSymbolId(visitable.Id, parameters);
417421
functionSymbol =
418-
_symbolTables[visitable.Scope].FindSymbol(new FunctionSymbolId(visitable.Id, parameters))
419-
?? throw new UnknownIdentifierReference(visitable.Id);
422+
_symbolTables[visitable.Scope].FindSymbol(functionKey)
423+
?? throw new UnknownFunctionOverload(visitable.Id, functionKey);
420424
}
421425

422426
visitable.ComputedFunctionAddress = functionSymbol.Id.ToString();

0 commit comments

Comments
 (0)