Skip to content

Commit e324764

Browse files
authored
Merge pull request #163 from toxamin/type-functions
Implement type functions
2 parents bdca2ff + 2802798 commit e324764

File tree

11 files changed

+862
-82
lines changed

11 files changed

+862
-82
lines changed

src/Compilers/Lua/Portable/Generated/Loretta.Generators.SyntaxFactsGenerator/Loretta.Generators.SyntaxFactsGenerator.SyntaxFactsGenerator/SyntaxFacts.g.cs

Lines changed: 71 additions & 69 deletions
Large diffs are not rendered by default.

src/Compilers/Lua/Portable/Generated/Loretta.Generators.SyntaxXml/Loretta.Generators.SyntaxXml.SourceGenerator/Syntax.xml.Internal.g.cs

Lines changed: 245 additions & 0 deletions
Large diffs are not rendered by default.

src/Compilers/Lua/Portable/Generated/Loretta.Generators.SyntaxXml/Loretta.Generators.SyntaxXml.SourceGenerator/Syntax.xml.Main.g.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ public partial class LuaSyntaxVisitor<TResult>
184184
/// <summary>Called when the visitor visits a TypeDeclarationStatementSyntax node.</summary>
185185
public virtual TResult? VisitTypeDeclarationStatement(TypeDeclarationStatementSyntax node) => this.DefaultVisit(node);
186186

187+
/// <summary>Called when the visitor visits a TypeFunctionDeclarationStatementSyntax node.</summary>
188+
public virtual TResult? VisitTypeFunctionDeclarationStatement(TypeFunctionDeclarationStatementSyntax node) => this.DefaultVisit(node);
189+
187190
/// <summary>Called when the visitor visits a TypeBindingSyntax node.</summary>
188191
public virtual TResult? VisitTypeBinding(TypeBindingSyntax node) => this.DefaultVisit(node);
189192

@@ -427,6 +430,9 @@ public partial class LuaSyntaxVisitor
427430
/// <summary>Called when the visitor visits a TypeDeclarationStatementSyntax node.</summary>
428431
public virtual void VisitTypeDeclarationStatement(TypeDeclarationStatementSyntax node) => this.DefaultVisit(node);
429432

433+
/// <summary>Called when the visitor visits a TypeFunctionDeclarationStatementSyntax node.</summary>
434+
public virtual void VisitTypeFunctionDeclarationStatement(TypeFunctionDeclarationStatementSyntax node) => this.DefaultVisit(node);
435+
430436
/// <summary>Called when the visitor visits a TypeBindingSyntax node.</summary>
431437
public virtual void VisitTypeBinding(TypeBindingSyntax node) => this.DefaultVisit(node);
432438

@@ -670,6 +676,9 @@ public partial class LuaSyntaxRewriter : LuaSyntaxVisitor<SyntaxNode?>
670676
public override SyntaxNode? VisitTypeDeclarationStatement(TypeDeclarationStatementSyntax node)
671677
=> node.Update(VisitToken(node.ExportKeyword), VisitToken(node.TypeKeyword), VisitToken(node.Name), (TypeParameterListSyntax?)Visit(node.TypeParameterList), VisitToken(node.EqualsToken), (TypeSyntax?)Visit(node.Type) ?? throw new ArgumentNullException("type"), VisitToken(node.SemicolonToken));
672678

679+
public override SyntaxNode? VisitTypeFunctionDeclarationStatement(TypeFunctionDeclarationStatementSyntax node)
680+
=> node.Update(VisitToken(node.ExportKeyword), VisitToken(node.TypeKeyword), VisitToken(node.FunctionKeyword), VisitToken(node.Name), (ParameterListSyntax?)Visit(node.Parameters) ?? throw new ArgumentNullException("parameters"), (TypeBindingSyntax?)Visit(node.TypeBinding), (StatementListSyntax?)Visit(node.Body) ?? throw new ArgumentNullException("body"), VisitToken(node.EndKeyword), VisitToken(node.SemicolonToken));
681+
673682
public override SyntaxNode? VisitTypeBinding(TypeBindingSyntax node)
674683
=> node.Update(VisitToken(node.ColonToken), (TypeSyntax?)Visit(node.Type) ?? throw new ArgumentNullException("type"));
675684

@@ -1947,6 +1956,46 @@ public static TypeDeclarationStatementSyntax TypeDeclarationStatement(SyntaxToke
19471956
public static TypeDeclarationStatementSyntax TypeDeclarationStatement(string name, TypeSyntax type)
19481957
=> SyntaxFactory.TypeDeclarationStatement(default(SyntaxToken), SyntaxFactory.Token(SyntaxKind.TypeKeyword), SyntaxFactory.Identifier(name), default(TypeParameterListSyntax?), SyntaxFactory.Token(SyntaxKind.EqualsToken), type, default(SyntaxToken));
19491958

1959+
/// <summary>
1960+
/// Creates a new
1961+
/// <see cref="TypeFunctionDeclarationStatementSyntax" />
1962+
/// node.
1963+
/// </summary>
1964+
public static TypeFunctionDeclarationStatementSyntax TypeFunctionDeclarationStatement(SyntaxToken exportKeyword, SyntaxToken typeKeyword, SyntaxToken functionKeyword, SyntaxToken name, ParameterListSyntax parameters, TypeBindingSyntax? typeBinding, StatementListSyntax body, SyntaxToken endKeyword, SyntaxToken semicolonToken)
1965+
{
1966+
switch (exportKeyword.Kind())
1967+
{
1968+
case SyntaxKind.ExportKeyword:
1969+
case SyntaxKind.None: break;
1970+
default: throw new ArgumentException("Provided kind is not one of the valid ones.", nameof(exportKeyword));
1971+
}
1972+
if (typeKeyword.Kind() != SyntaxKind.TypeKeyword) throw new ArgumentException($"Invalid kind provided. Expected TypeKeyword but got {typeKeyword.Kind()}.", nameof(typeKeyword));
1973+
if (functionKeyword.Kind() != SyntaxKind.FunctionKeyword) throw new ArgumentException($"Invalid kind provided. Expected FunctionKeyword but got {functionKeyword.Kind()}.", nameof(functionKeyword));
1974+
if (name.Kind() != SyntaxKind.IdentifierToken) throw new ArgumentException($"Invalid kind provided. Expected IdentifierToken but got {name.Kind()}.", nameof(name));
1975+
if (parameters == null) throw new ArgumentNullException(nameof(parameters));
1976+
if (body == null) throw new ArgumentNullException(nameof(body));
1977+
if (endKeyword.Kind() != SyntaxKind.EndKeyword) throw new ArgumentException($"Invalid kind provided. Expected EndKeyword but got {endKeyword.Kind()}.", nameof(endKeyword));
1978+
switch (semicolonToken.Kind())
1979+
{
1980+
case SyntaxKind.SemicolonToken:
1981+
case SyntaxKind.None: break;
1982+
default: throw new ArgumentException("Provided kind is not one of the valid ones.", nameof(semicolonToken));
1983+
}
1984+
return (TypeFunctionDeclarationStatementSyntax)Syntax.InternalSyntax.SyntaxFactory.TypeFunctionDeclarationStatement((Syntax.InternalSyntax.SyntaxToken?)exportKeyword.Node, (Syntax.InternalSyntax.SyntaxToken)typeKeyword.Node!, (Syntax.InternalSyntax.SyntaxToken)functionKeyword.Node!, (Syntax.InternalSyntax.SyntaxToken)name.Node!, (Syntax.InternalSyntax.ParameterListSyntax)parameters.Green, typeBinding == null ? null : (Syntax.InternalSyntax.TypeBindingSyntax)typeBinding.Green, (Syntax.InternalSyntax.StatementListSyntax)body.Green, (Syntax.InternalSyntax.SyntaxToken)endKeyword.Node!, (Syntax.InternalSyntax.SyntaxToken?)semicolonToken.Node).CreateRed();
1985+
}
1986+
1987+
/// <summary>Creates a new TypeFunctionDeclarationStatementSyntax instance.</summary>
1988+
public static TypeFunctionDeclarationStatementSyntax TypeFunctionDeclarationStatement(SyntaxToken name, ParameterListSyntax parameters, TypeBindingSyntax? typeBinding, StatementListSyntax body)
1989+
=> SyntaxFactory.TypeFunctionDeclarationStatement(default(SyntaxToken), SyntaxFactory.Token(SyntaxKind.TypeKeyword), SyntaxFactory.Token(SyntaxKind.FunctionKeyword), name, parameters, typeBinding, body, SyntaxFactory.Token(SyntaxKind.EndKeyword), default(SyntaxToken));
1990+
1991+
/// <summary>Creates a new TypeFunctionDeclarationStatementSyntax instance.</summary>
1992+
public static TypeFunctionDeclarationStatementSyntax TypeFunctionDeclarationStatement(SyntaxToken name, ParameterListSyntax parameters, StatementListSyntax body)
1993+
=> SyntaxFactory.TypeFunctionDeclarationStatement(default(SyntaxToken), SyntaxFactory.Token(SyntaxKind.TypeKeyword), SyntaxFactory.Token(SyntaxKind.FunctionKeyword), name, parameters, default(TypeBindingSyntax?), body, SyntaxFactory.Token(SyntaxKind.EndKeyword), default(SyntaxToken));
1994+
1995+
/// <summary>Creates a new TypeFunctionDeclarationStatementSyntax instance.</summary>
1996+
public static TypeFunctionDeclarationStatementSyntax TypeFunctionDeclarationStatement(string name, ParameterListSyntax parameters, StatementListSyntax body)
1997+
=> SyntaxFactory.TypeFunctionDeclarationStatement(default(SyntaxToken), SyntaxFactory.Token(SyntaxKind.TypeKeyword), SyntaxFactory.Token(SyntaxKind.FunctionKeyword), SyntaxFactory.Identifier(name), parameters, default(TypeBindingSyntax?), body, SyntaxFactory.Token(SyntaxKind.EndKeyword), default(SyntaxToken));
1998+
19501999
/// <summary>
19512000
/// Creates a new
19522001
/// <see cref="TypeBindingSyntax" />

src/Compilers/Lua/Portable/Generated/Loretta.Generators.SyntaxXml/Loretta.Generators.SyntaxXml.SourceGenerator/Syntax.xml.Syntax.g.cs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3669,6 +3669,113 @@ public TypeDeclarationStatementSyntax AddTypeParameterListNames(params TypeParam
36693669
}
36703670
}
36713671

3672+
/// <summary>Represents a type function declaration statement.</summary>
3673+
/// <remarks>
3674+
/// <para>This node is associated with the following syntax kinds:</para>
3675+
/// <list type="bullet">
3676+
/// <item><description><see cref="SyntaxKind.TypeFunctionDeclarationStatement"/></description></item>
3677+
/// </list>
3678+
/// </remarks>
3679+
public sealed partial class TypeFunctionDeclarationStatementSyntax : StatementSyntax
3680+
{
3681+
private ParameterListSyntax? parameters;
3682+
private TypeBindingSyntax? typeBinding;
3683+
private StatementListSyntax? body;
3684+
3685+
internal TypeFunctionDeclarationStatementSyntax(InternalSyntax.LuaSyntaxNode green, SyntaxNode? parent, int position)
3686+
: base(green, parent, position)
3687+
{
3688+
}
3689+
3690+
/// <summary>The 'export' keyword.</summary>
3691+
public SyntaxToken ExportKeyword
3692+
{
3693+
get
3694+
{
3695+
var slot = ((Syntax.InternalSyntax.TypeFunctionDeclarationStatementSyntax)this.Green).exportKeyword;
3696+
return slot != null ? new SyntaxToken(this, slot, Position, 0) : default;
3697+
}
3698+
}
3699+
3700+
/// <summary>The 'type' keyword.</summary>
3701+
public SyntaxToken TypeKeyword => new SyntaxToken(this, ((Syntax.InternalSyntax.TypeFunctionDeclarationStatementSyntax)this.Green).typeKeyword, GetChildPosition(1), GetChildIndex(1));
3702+
3703+
/// <summary>The 'function' keyword.</summary>
3704+
public SyntaxToken FunctionKeyword => new SyntaxToken(this, ((Syntax.InternalSyntax.TypeFunctionDeclarationStatementSyntax)this.Green).functionKeyword, GetChildPosition(2), GetChildIndex(2));
3705+
3706+
/// <summary>Represents the type function's name.</summary>
3707+
public SyntaxToken Name => new SyntaxToken(this, ((Syntax.InternalSyntax.TypeFunctionDeclarationStatementSyntax)this.Green).name, GetChildPosition(3), GetChildIndex(3));
3708+
3709+
/// <summary>The parameter list.</summary>
3710+
public ParameterListSyntax Parameters => GetRed(ref this.parameters, 4)!;
3711+
3712+
/// <summary>The function's (optional) return type.</summary>
3713+
public TypeBindingSyntax? TypeBinding => GetRed(ref this.typeBinding, 5);
3714+
3715+
/// <summary>The function's body.</summary>
3716+
public StatementListSyntax Body => GetRed(ref this.body, 6)!;
3717+
3718+
/// <summary>The 'end' keyword.</summary>
3719+
public SyntaxToken EndKeyword => new SyntaxToken(this, ((Syntax.InternalSyntax.TypeFunctionDeclarationStatementSyntax)this.Green).endKeyword, GetChildPosition(7), GetChildIndex(7));
3720+
3721+
/// <summary>The semicolon at the end of the statement (if any).</summary>
3722+
public override SyntaxToken SemicolonToken
3723+
{
3724+
get
3725+
{
3726+
var slot = ((Syntax.InternalSyntax.TypeFunctionDeclarationStatementSyntax)this.Green).semicolonToken;
3727+
return slot != null ? new SyntaxToken(this, slot, GetChildPosition(8), GetChildIndex(8)) : default;
3728+
}
3729+
}
3730+
3731+
internal override SyntaxNode? GetNodeSlot(int index)
3732+
=> index switch
3733+
{
3734+
4 => GetRed(ref this.parameters, 4)!,
3735+
5 => GetRed(ref this.typeBinding, 5),
3736+
6 => GetRed(ref this.body, 6)!,
3737+
_ => null,
3738+
};
3739+
3740+
internal override SyntaxNode? GetCachedSlot(int index)
3741+
=> index switch
3742+
{
3743+
4 => this.parameters,
3744+
5 => this.typeBinding,
3745+
6 => this.body,
3746+
_ => null,
3747+
};
3748+
3749+
public override void Accept(LuaSyntaxVisitor visitor) => visitor.VisitTypeFunctionDeclarationStatement(this);
3750+
public override TResult? Accept<TResult>(LuaSyntaxVisitor<TResult> visitor) where TResult : default => visitor.VisitTypeFunctionDeclarationStatement(this);
3751+
3752+
public TypeFunctionDeclarationStatementSyntax Update(SyntaxToken exportKeyword, SyntaxToken typeKeyword, SyntaxToken functionKeyword, SyntaxToken name, ParameterListSyntax parameters, TypeBindingSyntax? typeBinding, StatementListSyntax body, SyntaxToken endKeyword, SyntaxToken semicolonToken)
3753+
{
3754+
if (exportKeyword != this.ExportKeyword || typeKeyword != this.TypeKeyword || functionKeyword != this.FunctionKeyword || name != this.Name || parameters != this.Parameters || typeBinding != this.TypeBinding || body != this.Body || endKeyword != this.EndKeyword || semicolonToken != this.SemicolonToken)
3755+
{
3756+
var newNode = SyntaxFactory.TypeFunctionDeclarationStatement(exportKeyword, typeKeyword, functionKeyword, name, parameters, typeBinding, body, endKeyword, semicolonToken);
3757+
var annotations = GetAnnotations();
3758+
return annotations?.Length > 0 ? newNode.WithAnnotations(annotations) : newNode;
3759+
}
3760+
3761+
return this;
3762+
}
3763+
3764+
public TypeFunctionDeclarationStatementSyntax WithExportKeyword(SyntaxToken exportKeyword) => Update(exportKeyword, this.TypeKeyword, this.FunctionKeyword, this.Name, this.Parameters, this.TypeBinding, this.Body, this.EndKeyword, this.SemicolonToken);
3765+
public TypeFunctionDeclarationStatementSyntax WithTypeKeyword(SyntaxToken typeKeyword) => Update(this.ExportKeyword, typeKeyword, this.FunctionKeyword, this.Name, this.Parameters, this.TypeBinding, this.Body, this.EndKeyword, this.SemicolonToken);
3766+
public TypeFunctionDeclarationStatementSyntax WithFunctionKeyword(SyntaxToken functionKeyword) => Update(this.ExportKeyword, this.TypeKeyword, functionKeyword, this.Name, this.Parameters, this.TypeBinding, this.Body, this.EndKeyword, this.SemicolonToken);
3767+
public TypeFunctionDeclarationStatementSyntax WithName(SyntaxToken name) => Update(this.ExportKeyword, this.TypeKeyword, this.FunctionKeyword, name, this.Parameters, this.TypeBinding, this.Body, this.EndKeyword, this.SemicolonToken);
3768+
public TypeFunctionDeclarationStatementSyntax WithParameters(ParameterListSyntax parameters) => Update(this.ExportKeyword, this.TypeKeyword, this.FunctionKeyword, this.Name, parameters, this.TypeBinding, this.Body, this.EndKeyword, this.SemicolonToken);
3769+
public TypeFunctionDeclarationStatementSyntax WithTypeBinding(TypeBindingSyntax? typeBinding) => Update(this.ExportKeyword, this.TypeKeyword, this.FunctionKeyword, this.Name, this.Parameters, typeBinding, this.Body, this.EndKeyword, this.SemicolonToken);
3770+
public TypeFunctionDeclarationStatementSyntax WithBody(StatementListSyntax body) => Update(this.ExportKeyword, this.TypeKeyword, this.FunctionKeyword, this.Name, this.Parameters, this.TypeBinding, body, this.EndKeyword, this.SemicolonToken);
3771+
public TypeFunctionDeclarationStatementSyntax WithEndKeyword(SyntaxToken endKeyword) => Update(this.ExportKeyword, this.TypeKeyword, this.FunctionKeyword, this.Name, this.Parameters, this.TypeBinding, this.Body, endKeyword, this.SemicolonToken);
3772+
internal override StatementSyntax WithSemicolonTokenCore(SyntaxToken semicolonToken) => WithSemicolonToken(semicolonToken);
3773+
public new TypeFunctionDeclarationStatementSyntax WithSemicolonToken(SyntaxToken semicolonToken) => Update(this.ExportKeyword, this.TypeKeyword, this.FunctionKeyword, this.Name, this.Parameters, this.TypeBinding, this.Body, this.EndKeyword, semicolonToken);
3774+
3775+
public TypeFunctionDeclarationStatementSyntax AddParametersParameters(params ParameterSyntax[] items) => WithParameters(this.Parameters.WithParameters(this.Parameters.Parameters.AddRange(items)));
3776+
public TypeFunctionDeclarationStatementSyntax AddBodyStatements(params StatementSyntax[] items) => WithBody(this.Body.WithStatements(this.Body.Statements.AddRange(items)));
3777+
}
3778+
36723779
/// <summary>The base node for type annotations</summary>
36733780
public abstract partial class TypeSyntax : LuaSyntaxNode
36743781
{

0 commit comments

Comments
 (0)