Skip to content

Commit ea4c588

Browse files
Support other types in constants in Dart generator
1 parent 4e19bc4 commit ea4c588

5 files changed

Lines changed: 74 additions & 29 deletions

File tree

src/Tools/LeanCode.ContractsGenerator/CodeGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ private IEnumerable<InterfaceStatement> GenerateClassesAndInterfaces(SemanticMod
214214
switch (value)
215215
{
216216
case bool v:
217-
return v.ToString().ToLower();
217+
return v.ToString().ToLowerInvariant();
218218

219219
case string v:
220220
return '"' + v + '"';

src/Tools/LeanCode.ContractsGenerator/Extensions/StringExtensions.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,12 @@ namespace LeanCode.ContractsGenerator.Extensions
22
{
33
internal static class StringExtensions
44
{
5-
public static string Uncapitalize(this string str)
5+
public static string ToCamelCase(this string str)
66
{
7-
if (str == str.ToUpperInvariant())
8-
{
9-
return str;
10-
}
11-
127
return char.ToLowerInvariant(str[0]) + str[1..];
138
}
149

15-
public static string Capitalize(this string str)
10+
public static string ToPascalCase(this string str)
1611
{
1712
return char.ToUpperInvariant(str[0]) + str[1..];
1813
}

src/Tools/LeanCode.ContractsGenerator/Languages/Dart/DartVisitor.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,29 +51,35 @@ private void AddContractsPreamble(ClientStatement statement)
5151
private void GenerateHelpers()
5252
{
5353
definitionsBuilder
54-
.AppendLine("List<T> _listFromJson<T>(")
55-
.AppendLine("Iterable<dynamic> decodedJson, T itemFromJson(Map<String, dynamic> map)) {")
56-
.AppendLine("return decodedJson?.map((dynamic e) => itemFromJson(e as Map<String,dynamic>))?.toList()?.cast<T>(); }");
54+
.AppendLine("List<T> _listFromJson<T>(Iterable<dynamic> decodedJson, T itemFromJson(Map<String, dynamic> map)) {")
55+
.AppendLine(" return decodedJson")
56+
.AppendLine(" ?.map((dynamic e) => itemFromJson(e as Map<String,dynamic>))")
57+
.AppendLine(" ?.toList()")
58+
.AppendLine(" ?.cast<T>();")
59+
.AppendLine("}");
5760

5861
definitionsBuilder
5962
.AppendLine("DateTime _dateTimeFromJson(String value) {")
60-
.AppendLine("return DateTime.parse('${value.substring(0, 19)} Z'); }");
63+
.AppendLine(" return DateTime.parse('${value.substring(0, 19)} Z');")
64+
.AppendLine("}");
6165

6266
definitionsBuilder
6367
.AppendLine("DateTime _nullableDateTimeFromJson(String value) {")
64-
.AppendLine("return value == null ? null : _dateTimeFromJson(value); }");
68+
.AppendLine(" return value == null ? null : _dateTimeFromJson(value);")
69+
.AppendLine("}");
6570

6671
definitionsBuilder
6772
.AppendLine("double _doubleFromJson(dynamic value) {")
68-
.AppendLine("if (value is double) { return value; }")
69-
.AppendLine("else if (value is String) { return double.parse(value); }")
70-
.AppendLine("else if (value is int) { return value.toDouble(); }")
71-
.AppendLine("throw Exception('Invalid argument type ${value.runtimeType}');")
73+
.AppendLine(" if (value is double) { return value; }")
74+
.AppendLine(" else if (value is String) { return double.parse(value); }")
75+
.AppendLine(" else if (value is int) { return value.toDouble(); }")
76+
.AppendLine(" else { throw Exception('Invalid argument type ${value.runtimeType}'); }")
7277
.AppendLine("}");
7378

7479
definitionsBuilder
7580
.AppendLine("double _nullableDoubleFromJson(dynamic value) {")
76-
.AppendLine("return value == null ? null : _doubleFromJson(value); }");
81+
.AppendLine(" return value == null ? null : _doubleFromJson(value);")
82+
.AppendLine("}");
7783
}
7884

7985
private void GenerateTypeNames(ClientStatement statement)
@@ -502,11 +508,11 @@ private void GenerateConstants(List<ConstStatement> constants, int level)
502508

503509
foreach (var constant in constants)
504510
{
505-
var name = char.ToLower(constant.Name[0]) + constant.Name[1..];
511+
var name = constant.Name.ToCamelCase();
506512

507513
definitionsBuilder
508514
.AppendSpaces(level + 1)
509-
.AppendLine($"static const int {name} = {constant.Value};");
515+
.AppendLine($"static const {name} = {constant.Value};");
510516
}
511517
}
512518
}
@@ -580,7 +586,7 @@ private static string MakeName(string namespaceName, string name, int depth)
580586

581587
private static string TranslateIdentifier(string identifier)
582588
{
583-
var translated = identifier.Uncapitalize();
589+
var translated = identifier.ToCamelCase();
584590

585591
if (translated == "new" || translated == "default")
586592
{

src/Tools/LeanCode.ContractsGenerator/Languages/TypeScript/TypeScriptVisitor.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ private void VisitTypeStatement(TypeStatement statement, StringBuilder stringBui
140140

141141
stringBuilder.Append('>');
142142
}
143-
else if (configuration.TypeTranslations.TryGetValue(statement.Name.ToLower(), out var name))
143+
else if (configuration.TypeTranslations.TryGetValue(statement.Name.ToLowerInvariant(), out var name))
144144
{
145145
stringBuilder.Append(name);
146146
}
@@ -216,7 +216,7 @@ private void VisitCommandStatement(CommandStatement statement, int level, string
216216
{
217217
VisitInterfaceStatement(statement, level, parentName);
218218

219-
var name = char.ToLower(statement.Name[0]) + statement.Name[1..];
219+
var name = statement.Name.ToCamelCase();
220220

221221
clientBuilder
222222
.AppendSpaces(2)
@@ -250,7 +250,7 @@ private void VisitQueryStatement(QueryStatement statement, int level, string? pa
250250
{
251251
VisitInterfaceStatement(statement, level, parentName);
252252

253-
var name = char.ToLower(statement.Name[0]) + statement.Name[1..];
253+
var name = statement.Name.ToCamelCase();
254254

255255
clientBuilder.AppendSpaces(2)
256256
.Append(name)

test/Tools/LeanCode.ContractsGenerator.Tests/Dart/ContractsGeneratorTests.ConstantsGeneration.cs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public void Commands_error_code_is_generated()
1212

1313
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
1414

15-
Assert.Contains("static const int invalid = 1", contracts);
15+
Assert.Contains("static const invalid = 1", contracts);
1616
}
1717

1818
[Fact]
@@ -24,7 +24,7 @@ public void Const_in_nested_static_class_is_generated()
2424

2525
Assert.Contains("Constants {", contracts);
2626
Assert.Contains("Constants2 {", contracts);
27-
Assert.Contains("static const int value = 1", contracts);
27+
Assert.Contains("static const value = 1", contracts);
2828
}
2929

3030
[Fact]
@@ -34,8 +34,8 @@ public void Multiple_command_error_codes_are_generated()
3434

3535
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
3636

37-
Assert.Contains("static const int invalid = 1", contracts);
38-
Assert.Contains("static const int empty = 2", contracts);
37+
Assert.Contains("static const invalid = 1", contracts);
38+
Assert.Contains("static const empty = 2", contracts);
3939
}
4040

4141
[Fact]
@@ -46,7 +46,51 @@ public void Constants_in_static_classes_are_generated()
4646
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
4747

4848
Assert.Contains("StaticClass {", contracts);
49-
Assert.Contains("static const int someConstant = 1", contracts);
49+
Assert.Contains("static const someConstant = 1", contracts);
50+
}
51+
52+
[Fact]
53+
public void String_constants_are_generated()
54+
{
55+
var generator = CreateDartGeneratorFromNamespace("public static class StaticClass { public const string SomeConstant = \"TEST\"; }");
56+
57+
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
58+
59+
Assert.Contains("StaticClass {", contracts);
60+
Assert.Contains("static const someConstant = \"TEST\"", contracts);
61+
}
62+
63+
[Fact]
64+
public void Double_constants_are_generated()
65+
{
66+
var generator = CreateDartGeneratorFromNamespace("public static class StaticClass { public const double SomeConstant = 1.23; }");
67+
68+
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
69+
70+
Assert.Contains("StaticClass {", contracts);
71+
Assert.Contains("static const someConstant = 1.23", contracts);
72+
}
73+
74+
[Fact]
75+
public void Float_constants_are_generated()
76+
{
77+
var generator = CreateDartGeneratorFromNamespace("public static class StaticClass { public const float SomeConstant = 1.23; }");
78+
79+
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
80+
81+
Assert.Contains("StaticClass {", contracts);
82+
Assert.Contains("static const someConstant = 1.23", contracts);
83+
}
84+
85+
[Fact]
86+
public void Char_constants_are_generated()
87+
{
88+
var generator = CreateDartGeneratorFromNamespace("public static class StaticClass { public const char SomeConstant = 'a'; }");
89+
90+
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
91+
92+
Assert.Contains("StaticClass {", contracts);
93+
Assert.Contains("static const someConstant = \"a\"", contracts);
5094
}
5195
}
5296
}

0 commit comments

Comments
 (0)