Skip to content

Commit f97b393

Browse files
committed
#167 - доработка теста и статического анализа
1 parent ff3c16d commit f97b393

File tree

3 files changed

+43
-16
lines changed

3 files changed

+43
-16
lines changed

samples/defaultparams.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
11
function g(a:number, b = 0){
2+
>>> "g(number, number)"
23
>>> a
34
>>> b
45
}
56

67
g(1)
7-
g(1,2)
8+
g(1,2)
9+
10+
function f(){
11+
>>>"f()"
12+
}
13+
function f(a = 0){
14+
>>> "f(number)"
15+
>>> a
16+
}
17+
function f(a = 0, b = 1){
18+
>>> "f(number, number)"
19+
>>> a
20+
>>> b
21+
}
22+
23+
f()
24+
f(1)
25+
f(1,2)

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,18 @@ public VisitUnit Visit(LexicalDeclaration visitable)
6767

6868
public VisitUnit Visit(FunctionDeclaration visitable)
6969
{
70+
var parentTable = _symbolTables[visitable.Parent.Scope];
7071
var indexOfFirstDefaultArgument = visitable.Arguments
7172
.Select((x, i) => new { Argument = x, Index = i })
7273
.FirstOrDefault(pair => pair.Argument is DefaultValueArgument)?.Index ?? -1;
73-
if (indexOfFirstDefaultArgument is not -1)
74+
for (var i = indexOfFirstDefaultArgument; i < visitable.Arguments.Count; i++)
7475
{
75-
for (var i = indexOfFirstDefaultArgument; i < visitable.Arguments.Count; i++)
76-
{
77-
if (visitable.Arguments[i] is not DefaultValueArgument)
78-
throw new NamedArgumentAfterDefaultValueArgument(
79-
visitable.Segment,
80-
function: visitable.Name,
81-
visitable.Arguments[i]);
82-
}
76+
if (i is -1) break;
77+
if (visitable.Arguments[i] is not DefaultValueArgument)
78+
throw new NamedArgumentAfterDefaultValueArgument(
79+
visitable.Segment,
80+
function: visitable.Name,
81+
visitable.Arguments[i]);
8382
}
8483

8584
var parameters = visitable.Arguments.Select(x =>
@@ -88,7 +87,7 @@ public VisitUnit Visit(FunctionDeclaration visitable)
8887
x.TypeValue.Accept(_typeBuilder))).ToList();
8988
var functionSymbolId = new FunctionSymbolId(visitable.Name, parameters.Select(x => x.Type));
9089
visitable.ComputedFunctionAddress = functionSymbolId.ToString();
91-
if (_symbolTables[visitable.Parent.Scope].ContainsSymbol(functionSymbolId))
90+
if (parentTable.ContainsSymbol(functionSymbolId))
9291
throw new OverloadAlreadyExists(visitable.Name, functionSymbolId);
9392

9493
for (var i = 0; i < parameters.Count; i++)
@@ -118,15 +117,19 @@ public VisitUnit Visit(FunctionDeclaration visitable)
118117
functionSymbol.DefineReturnType("void");
119118
}
120119

121-
_symbolTables[visitable.Parent.Scope].AddSymbol(functionSymbol);
122-
if (indexOfFirstDefaultArgument is not -1)
120+
parentTable.AddSymbol(functionSymbol);
121+
for (var i = indexOfFirstDefaultArgument; i < visitable.Arguments.Count; i++)
123122
{
124-
for (var i = indexOfFirstDefaultArgument; i < visitable.Arguments.Count; i++)
123+
if (i is -1) break;
124+
var overload = new FunctionSymbolId(visitable.Name, parameters[..i].Select(x => x.Type));
125+
var existing = parentTable.FindSymbol(overload);
126+
parentTable.AddSymbol(functionSymbol, overload);
127+
if (existing is not null && existing < functionSymbol)
125128
{
126-
var overload = new FunctionSymbolId(visitable.Name, parameters[..i].Select(x => x.Type));
127-
_symbolTables[visitable.Parent.Scope].AddSymbol(functionSymbol, overload);
129+
parentTable.AddSymbol(existing, overload);
128130
}
129131
}
132+
130133
return visitable.Statements.Accept(This);
131134
}
132135
}

src/Domain/HydraScript.Domain.IR/Impl/Symbols/FunctionSymbol.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,10 @@ public override string ToString() =>
3131
.AppendJoin(',', Parameters)
3232
.Append($") => {Type}")
3333
.ToString();
34+
35+
public static bool operator <(FunctionSymbol left, FunctionSymbol right) =>
36+
left.Parameters.Count < right.Parameters.Count;
37+
38+
public static bool operator >(FunctionSymbol left, FunctionSymbol right) =>
39+
left.Parameters.Count > right.Parameters.Count;
3440
}

0 commit comments

Comments
 (0)