Skip to content

Commit

Permalink
fix #479
Browse files Browse the repository at this point in the history
  • Loading branch information
yanghuan committed Jan 8, 2024
1 parent 42fe1d7 commit 80f45ee
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 24 deletions.
2 changes: 1 addition & 1 deletion CSharp.lua/CSharp.lua.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.6.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
</ItemGroup>

<ItemGroup>
Expand Down
25 changes: 11 additions & 14 deletions CSharp.lua/LuaAst/LuaIfStatementSyntax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,29 +63,26 @@ internal override void Render(LuaRenderer renderer) {

public sealed class LuaSwitchAdapterStatementSyntax : LuaStatementSyntax {
public readonly LuaRepeatStatementSyntax RepeatStatement = new(LuaIdentifierNameSyntax.One);
public LuaIdentifierNameSyntax Temp { get; }
public LuaBlockSyntax Body => RepeatStatement.Body;

public LuaIdentifierNameSyntax Temp { get; set; }
private LuaBlockSyntax defaultBlock_;
private readonly LuaLocalVariablesSyntax caseLabelVariables_ = new();
public LuaIdentifierNameSyntax DefaultLabel { get; set; }
public readonly Dictionary<int, LuaIdentifierNameSyntax> CaseLabels = new();
private LuaIfStatementSyntax headIfStatement_;

public LuaSwitchAdapterStatementSyntax(LuaIdentifierNameSyntax temp) {
Temp = temp;
public LuaSwitchAdapterStatementSyntax() {
}

public void Fill(LuaExpressionSyntax expression, IEnumerable<LuaStatementSyntax> sections) {
if (expression == null) {
throw new ArgumentNullException(nameof(expression));
}
public void Fill(IEnumerable<LuaStatementSyntax> sections) {
if (sections == null) {
throw new ArgumentNullException(nameof(sections));
}

var body = RepeatStatement.Body;
var body = Body;
body.Statements.Add(caseLabelVariables_);
body.Statements.Add(new LuaLocalVariableDeclaratorSyntax(Temp, expression));


LuaIfStatementSyntax ifStatement = null;
foreach (var section in sections) {
if (section is LuaIfStatementSyntax statement) {
Expand Down Expand Up @@ -122,10 +119,10 @@ private void CheckHasDefaultLabel() {
Contract.Assert(defaultBlock_ != null);
caseLabelVariables_.Variables.Add(DefaultLabel);
LuaLabeledStatement labeledStatement = new LuaLabeledStatement(DefaultLabel);
RepeatStatement.Body.Statements.Add(labeledStatement);
Body.Statements.Add(labeledStatement);
LuaIfStatementSyntax ifStatement = new LuaIfStatementSyntax(DefaultLabel);
ifStatement.Body.Statements.AddRange(defaultBlock_.Statements);
RepeatStatement.Body.Statements.Add(ifStatement);
Body.Statements.Add(ifStatement);
}
}

Expand All @@ -143,10 +140,10 @@ private void CheckHasCaseLabel() {
caseLabelVariables_.Variables.AddRange(CaseLabels.Values);
foreach (var (index, labelIdentifier) in CaseLabels) {
var caseLabelStatement = FindMatchIfStatement(index);
RepeatStatement.Body.Statements.Add(new LuaLabeledStatement(labelIdentifier));
Body.Statements.Add(new LuaLabeledStatement(labelIdentifier));
LuaIfStatementSyntax ifStatement = new LuaIfStatementSyntax(labelIdentifier);
ifStatement.Body.Statements.AddRange(caseLabelStatement.Statements);
RepeatStatement.Body.Statements.Add(ifStatement);
Body.Statements.Add(ifStatement);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions CSharp.lua/LuaSyntaxNodeTransform.Object.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1444,7 +1444,7 @@ private LuaExpressionSyntax BuildPatternExpression(LuaExpressionSyntax targetExp
case SyntaxKind.RecursivePattern: {
var recursivePattern = (RecursivePatternSyntax)notPattern.Pattern;
var governingIdentifier = GetIdentifierNameFromExpression(targetExpression);
var expression = BuildRecursivePatternExpression(recursivePattern, governingIdentifier, null, targetNode);
var expression = BuildRecursivePatternExpression(recursivePattern, governingIdentifier, targetNode);
return expression.Parenthesized().Not();
}
case SyntaxKind.ConstantPattern: {
Expand Down Expand Up @@ -1490,7 +1490,7 @@ private LuaExpressionSyntax BuildPatternExpression(LuaExpressionSyntax targetExp
} else {
name = GetIdentifierNameFromExpression(targetExpression);
}
return BuildRecursivePatternExpression(recursivePattern, name, null, targetNode);
return BuildRecursivePatternExpression(recursivePattern, name, targetNode);
}
}
}
Expand Down
31 changes: 24 additions & 7 deletions CSharp.lua/LuaSyntaxNodeTransform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3675,11 +3675,19 @@ public override LuaSyntaxNode VisitElseClause(ElseClauseSyntax node) {
}

public override LuaSyntaxNode VisitSwitchStatement(SwitchStatementSyntax node) {
var temp = GetTempIdentifier();
var switchStatement = new LuaSwitchAdapterStatementSyntax(temp);
var switchStatement = new LuaSwitchAdapterStatementSyntax();
switches_.Push(switchStatement);
PushBlock(switchStatement.Body);
var expression = node.Expression.AcceptExpression(this);
switchStatement.Fill(expression, node.Sections.Select(i => i.Accept<LuaStatementSyntax>(this)));
if (expression is LuaIdentifierNameSyntax name) {
switchStatement.Temp = name;
} else {
var temp = GetTempIdentifier();
switchStatement.Temp = temp;
switchStatement.Body.Statements.Add(new LuaLocalVariableDeclaratorSyntax(temp, expression));
}
switchStatement.Fill(node.Sections.Select(i => i.Accept<LuaStatementSyntax>(this)));
PopBlock();
switches_.Pop();
return switchStatement;
}
Expand Down Expand Up @@ -3770,7 +3778,11 @@ public override LuaSyntaxNode VisitCasePatternSwitchLabel(CasePatternSwitchLabel
case SyntaxKind.RecursivePattern: {
var recursivePattern = (RecursivePatternSyntax)node.Pattern;
var switchStatement = (SwitchStatementSyntax)FindParent(node, SyntaxKind.SwitchStatement);
var expression = BuildRecursivePatternExpression(recursivePattern, left, null, switchStatement.Expression);
LuaLocalVariablesSyntax deconstruct = null;
var expression = BuildRecursivePatternExpression(recursivePattern, left, ref deconstruct, switchStatement.Expression);
if (deconstruct != null) {
CurBlock.AddStatement(deconstruct);
}
return BuildSwitchLabelWhenClause(expression, node.WhenClause);
}
case SyntaxKind.AndPattern:
Expand Down Expand Up @@ -3856,7 +3868,12 @@ public override LuaSyntaxNode VisitRelationalPattern(RelationalPatternSyntax nod
return node.Expression.AcceptExpression(this);
}

private LuaExpressionSyntax BuildRecursivePatternExpression(RecursivePatternSyntax recursivePattern, LuaIdentifierNameSyntax governingIdentifier, LuaLocalVariablesSyntax deconstruct, ExpressionSyntax governingExpression) {
private LuaExpressionSyntax BuildRecursivePatternExpression(RecursivePatternSyntax recursivePattern, LuaIdentifierNameSyntax governingIdentifier, ExpressionSyntax governingExpression) {
LuaLocalVariablesSyntax deconstruct = null;
return BuildRecursivePatternExpression(recursivePattern, governingIdentifier, ref deconstruct, governingExpression);
}

private LuaExpressionSyntax BuildRecursivePatternExpression(RecursivePatternSyntax recursivePattern, LuaIdentifierNameSyntax governingIdentifier, ref LuaLocalVariablesSyntax deconstruct, ExpressionSyntax governingExpression) {
var subpatterns = recursivePattern.PropertyPatternClause?.Subpatterns ?? recursivePattern.PositionalPatternClause.Subpatterns;
var subpatternExpressions = new List<LuaExpressionSyntax>();
int subpatternIndex = 0;
Expand Down Expand Up @@ -3884,8 +3901,8 @@ private LuaExpressionSyntax BuildRecursivePatternExpression(RecursivePatternSynt
var variable = deconstruct.Variables[subpatternIndex];
subpatternExpressions.Add(variable.EqualsEquals(expression));
}
++subpatternIndex;
}
++subpatternIndex;
var condition = subpatternExpressions.Count > 0
? subpatternExpressions.Aggregate((x, y) => x.And(y))
: governingIdentifier.NotEquals(LuaIdentifierNameSyntax.Nil);
Expand Down Expand Up @@ -3935,7 +3952,7 @@ public override LuaSyntaxNode VisitSwitchExpression(SwitchExpressionSyntax node)
if (recursivePattern.Designation != null) {
AddLocalVariableMapping(governingIdentifier, recursivePattern.Designation);
}
var condition = BuildRecursivePatternExpression(recursivePattern, governingIdentifier, deconstruct, node.GoverningExpression);
var condition = BuildRecursivePatternExpression(recursivePattern, governingIdentifier, ref deconstruct, node.GoverningExpression);
FillSwitchPatternSyntax(ref ifStatement, condition, arm.WhenClause, result, arm.Expression);
break;
}
Expand Down

0 comments on commit 80f45ee

Please sign in to comment.