Skip to content

Commit 725a3c7

Browse files
committed
#187 - fix: bind new overload to object
1 parent 5a3689b commit 725a3c7

File tree

3 files changed

+15
-14
lines changed

3 files changed

+15
-14
lines changed

src/Application/HydraScript.Application.StaticAnalysis/IMethodStorage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace HydraScript.Application.StaticAnalysis;
66

77
public interface IMethodStorage
88
{
9-
public void BindMethod(ObjectType objectType, FunctionSymbol method);
9+
public void BindMethod(ObjectType objectType, FunctionSymbol method, FunctionSymbolId overload);
1010

1111
public IReadOnlyDictionary<FunctionSymbolId, FunctionSymbol> GetAvailableMethods(ObjectType objectType);
1212

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ internal class MethodStorage : IMethodStorage
88
{
99
private readonly Dictionary<ObjectType, Dictionary<FunctionSymbolId, FunctionSymbol>> _bindings = [];
1010

11-
public void BindMethod(ObjectType objectType, FunctionSymbol method)
11+
public void BindMethod(ObjectType objectType, FunctionSymbol method, FunctionSymbolId overload)
1212
{
13-
objectType.AddMethod(method.Id);
13+
objectType.AddMethod(overload);
1414
if (!_bindings.ContainsKey(objectType))
1515
_bindings[objectType] = new Dictionary<FunctionSymbolId, FunctionSymbol>();
16-
_bindings[objectType][method.Id] = method;
16+
_bindings[objectType][overload] = method;
1717
}
1818

1919
public IReadOnlyDictionary<FunctionSymbolId, FunctionSymbol> GetAvailableMethods(ObjectType objectType) =>

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ public VisitUnit Visit(FunctionDeclaration visitable)
9999
_symbolTables[visitable.Scope].AddSymbol(arg);
100100
}
101101

102-
if (parameters is [{ Type: ObjectType objectType }, ..] &&
103-
visitable.Arguments is [{ TypeValue: TypeIdentValue }, ..])
104-
{
105-
_methodStorage.BindMethod(objectType, functionSymbol);
106-
}
102+
var isMethod =
103+
parameters is [{ Type: ObjectType }, ..] &&
104+
visitable.Arguments is [{ TypeValue: TypeIdentValue }, ..];
105+
if (isMethod)
106+
_methodStorage.BindMethod((parameters[0].Type as ObjectType)!, functionSymbol, functionSymbolId);
107107

108108
Type undefined = "undefined";
109109
if (functionSymbol.Type.Equals(undefined))
@@ -126,11 +126,12 @@ public VisitUnit Visit(FunctionDeclaration visitable)
126126

127127
var overload = new FunctionSymbolId(visitable.Name, parameters[..i].Select(x => x.Type));
128128
var existing = parentTable.FindSymbol(overload);
129-
parentTable.AddSymbol(functionSymbol, overload);
130-
if (existing is not null && existing < functionSymbol)
131-
{
132-
parentTable.AddSymbol(existing, overload);
133-
}
129+
var functionToAdd = existing is not null && existing < functionSymbol
130+
? existing
131+
: functionSymbol;
132+
parentTable.AddSymbol(functionToAdd, overload);
133+
if (isMethod)
134+
_methodStorage.BindMethod((parameters[0].Type as ObjectType)!, functionToAdd, overload);
134135

135136
if (existing is not null && !existing.Id.Equals(overload))
136137
{

0 commit comments

Comments
 (0)