diff --git a/Upsilon/Binder/Binder.cs b/Upsilon/Binder/Binder.cs index 94a6cd9..0ef1a3f 100644 --- a/Upsilon/Binder/Binder.cs +++ b/Upsilon/Binder/Binder.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Text; using Upsilon.BaseTypes; using Upsilon.BaseTypes.Number; using Upsilon.Parser; @@ -423,12 +424,23 @@ namespace Upsilon.Binder parameters.Add(vari); innerScope.DefineLocalVariable(vari); } - + var commentData = new List(); + if (e.CommentData != null) + { + foreach (var comment in e.CommentData) + { + commentData.Add(comment); + } + } if (!Scope.TryGetVariable(name, !isLocal, out var variable)) { - variable = new FunctionVariableSymbol(name, Type.Function, isLocal, parameters.ToImmutable()); - ((FunctionVariableSymbol) variable).IsBound = !(func is UnboundFunctionExpression); + var functionVariable = new FunctionVariableSymbol(name, Type.Function, isLocal, parameters.ToImmutable()) + { + CommentValue = commentData.ToArray() + }; + variable = functionVariable; + functionVariable.IsBound = !(func is UnboundFunctionExpression); if (isLocal) Scope.DefineLocalVariable(variable); else @@ -451,6 +463,7 @@ namespace Upsilon.Binder } } + return new BoundFunctionAssignmentStatement(variable, func, e.Span); } diff --git a/Upsilon/Binder/BoundVariableSymbol.cs b/Upsilon/Binder/BoundVariableSymbol.cs index 91402f0..aecca45 100644 --- a/Upsilon/Binder/BoundVariableSymbol.cs +++ b/Upsilon/Binder/BoundVariableSymbol.cs @@ -11,6 +11,7 @@ namespace Upsilon.Binder } public VariableSymbol VariableSymbol { get; } + public override BoundKind Kind => BoundKind.BoundVariableSymbol; public override BoundNode GetNodeAtPosition(int characterPosition) { diff --git a/Upsilon/Binder/VariableSymbol.cs b/Upsilon/Binder/VariableSymbol.cs index eaa545d..a7ce4ca 100644 --- a/Upsilon/Binder/VariableSymbol.cs +++ b/Upsilon/Binder/VariableSymbol.cs @@ -15,6 +15,8 @@ namespace Upsilon.Binder public Type Type { get; set; } public bool Local { get; } public string Name { get; } + public string[] CommentValue { get; set; } + } public class FunctionVariableSymbol : VariableSymbol diff --git a/Upsilon/Parser/Lexer.cs b/Upsilon/Parser/Lexer.cs index 85c9fe0..be612ed 100644 --- a/Upsilon/Parser/Lexer.cs +++ b/Upsilon/Parser/Lexer.cs @@ -1,4 +1,4 @@ -using System; +using System.Collections.Generic; using System.Collections.Immutable; using System.Text; using Upsilon.Text; @@ -26,7 +26,7 @@ namespace Upsilon.Parser private char Current => _position >= _text.Length ? '\0' : _text[_position]; private char Next => _position + 1 >= _text.Length ? '\0' : _text[_position + 1]; - + private readonly List _activeComments = new List(); private ImmutableArray Lex() { var array = ImmutableArray.CreateBuilder(); @@ -35,8 +35,19 @@ namespace Upsilon.Parser var next = LexNext(); if (next.Kind != SyntaxKind.WhiteSpace) { - if (next.Kind == SyntaxKind.Comment) - continue; + switch (next.Kind) + { + case SyntaxKind.Comment: + _activeComments.Add(next.Value.ToString()); + continue; + case SyntaxKind.FunctionKeyword: + case SyntaxKind.LocalKeyword: + case SyntaxKind.Identifier: + next.CommentData = _activeComments.ToArray(); + break; + } + + _activeComments.Clear(); array.Add(next); if (next.Kind == SyntaxKind.EndOfFile) break; diff --git a/Upsilon/Parser/Parser.cs b/Upsilon/Parser/Parser.cs index 278de3a..425a8c5 100644 --- a/Upsilon/Parser/Parser.cs +++ b/Upsilon/Parser/Parser.cs @@ -228,11 +228,17 @@ namespace Upsilon.Parser private StatementSyntax ParseFunctionAssignmentStatement() { SyntaxToken localToken = null; + string[] commentData = null; if (Current.Kind == SyntaxKind.LocalKeyword) { localToken = NextToken(); + commentData = localToken.CommentData; } var functionToken = MatchToken(SyntaxKind.FunctionKeyword); + if (commentData == null) + { + commentData = functionToken.CommentData; + } var identifier = MatchToken(SyntaxKind.Identifier); var openParenthesis = MatchToken(SyntaxKind.OpenParenthesis); var variableBuilder = ImmutableArray.CreateBuilder(); @@ -254,7 +260,10 @@ namespace Upsilon.Parser var endToken = MatchToken(SyntaxKind.EndKeyword); var functionExpression = new FunctionExpressionSyntax(functionToken, openParenthesis, variableBuilder.ToImmutable(), closeParenthesis, (BlockStatementSyntax) block, endToken); - return new FunctionAssignmentStatementSyntax(localToken, (IdentifierToken) identifier, functionExpression); + return new FunctionAssignmentStatementSyntax(localToken, (IdentifierToken) identifier, functionExpression) + { + CommentData = commentData + }; } private StatementSyntax ParseExpressionStatement() diff --git a/Upsilon/Parser/StatementSyntax/FunctionAssignmentStatementSyntax.cs b/Upsilon/Parser/StatementSyntax/FunctionAssignmentStatementSyntax.cs index a041563..180aec5 100644 --- a/Upsilon/Parser/StatementSyntax/FunctionAssignmentStatementSyntax.cs +++ b/Upsilon/Parser/StatementSyntax/FunctionAssignmentStatementSyntax.cs @@ -18,6 +18,7 @@ namespace Upsilon.Parser public SyntaxToken LocalToken { get; } public IdentifierToken Identifier { get; } public FunctionExpressionSyntax FunctionExpression { get; } + public string[] CommentData { get; set; } public override SyntaxKind Kind => SyntaxKind.FunctionAssignmentStatement; public override IEnumerable ChildNodes() diff --git a/Upsilon/Parser/SyntaxToken.cs b/Upsilon/Parser/SyntaxToken.cs index f350dfd..8501f0f 100644 --- a/Upsilon/Parser/SyntaxToken.cs +++ b/Upsilon/Parser/SyntaxToken.cs @@ -14,6 +14,7 @@ namespace Upsilon.Parser public override SyntaxKind Kind { get; } public object Value { get; } + public string[] CommentData { get; set; } public override IEnumerable ChildNodes() {