-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathLiteralExpressionTranspiler.cs
More file actions
94 lines (79 loc) · 4.64 KB
/
Copy pathLiteralExpressionTranspiler.cs
File metadata and controls
94 lines (79 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
namespace War3Net.CodeAnalysis.Transpilers
{
public partial class JassToLuaTranspiler
{
public LuaExpressionSyntax Transpile(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
return literalExpression.SyntaxKind switch
{
JassSyntaxKind.TrueLiteralExpression => TranspileTrueLiteral(out type),
JassSyntaxKind.FalseLiteralExpression => TranspileFalseLiteral(out type),
JassSyntaxKind.NullLiteralExpression => TranspileNullLiteral(out type),
JassSyntaxKind.DecimalLiteralExpression => TranspileDecimalLiteral(literalExpression, out type),
JassSyntaxKind.OctalLiteralExpression => TranspileOctalLiteral(literalExpression, out type),
JassSyntaxKind.HexadecimalLiteralExpression => TranspileHexadecimalLiteral(literalExpression, out type),
JassSyntaxKind.FourCCLiteralExpression => TranspileFourCCLiteral(literalExpression, out type),
JassSyntaxKind.CharacterLiteralExpression => TranspileCharacterLiteral(literalExpression, out type),
JassSyntaxKind.RealLiteralExpression => TranspileRealLiteral(literalExpression, out type),
JassSyntaxKind.StringLiteralExpression => TranspileStringLiteral(literalExpression, out type),
};
}
private LuaExpressionSyntax TranspileTrueLiteral(out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Boolean;
return new LuaIdentifierLiteralExpressionSyntax(LuaIdentifierNameSyntax.True);
}
private LuaExpressionSyntax TranspileFalseLiteral(out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Boolean;
return new LuaIdentifierLiteralExpressionSyntax(LuaIdentifierNameSyntax.False);
}
private LuaExpressionSyntax TranspileNullLiteral(out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Handle;
return new LuaIdentifierLiteralExpressionSyntax(LuaIdentifierNameSyntax.Nil);
}
private LuaExpressionSyntax TranspileDecimalLiteral(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Integer;
return new LuaIdentifierLiteralExpressionSyntax(literalExpression.Token.Text);
}
private LuaExpressionSyntax TranspileOctalLiteral(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Integer;
var text = JassLiteral.ParseOctal(literalExpression.Token.Text).ToString(CultureInfo.InvariantCulture);
return new LuaIdentifierLiteralExpressionSyntax(text);
}
private LuaExpressionSyntax TranspileHexadecimalLiteral(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Integer;
var text = literalExpression.Token.Text.Replace(JassSymbol.Dollar, "0x", StringComparison.Ordinal);
return new LuaIdentifierLiteralExpressionSyntax(text);
}
private LuaExpressionSyntax TranspileFourCCLiteral(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Integer;
var text = $"FourCC(\"{literalExpression.Token.Text[1..^1]}\")";
return new LuaIdentifierLiteralExpressionSyntax(text);
}
private LuaExpressionSyntax TranspileCharacterLiteral(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Integer;
var text = ((int)JassLiteral.ParseChar(literalExpression.Token.Text)).ToString(CultureInfo.InvariantCulture);
return new LuaIdentifierLiteralExpressionSyntax(text);
}
private LuaExpressionSyntax TranspileRealLiteral(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.Real;
return new LuaIdentifierLiteralExpressionSyntax(literalExpression.Token.Text);
}
private LuaExpressionSyntax TranspileStringLiteral(JassLiteralExpressionSyntax literalExpression, out JassTypeSyntax type)
{
type = JassPredefinedTypeSyntax.String;
var text = JassLiteral.ParseString(literalExpression.Token.Text)
.Replace(JassSymbol.CarriageReturn, @"\r", StringComparison.Ordinal)
.Replace(JassSymbol.LineFeed, @"\n", StringComparison.Ordinal);
return new LuaStringLiteralExpressionSyntax(text);
}
}
}