@@ -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}
0 commit comments