Skip to content

Commit e6014b6

Browse files
Merge pull request #192 from leancodepl/improve-contracts
Generate non-`int` constants in Dart
2 parents 08f6b50 + 9e94b6b commit e6014b6

22 files changed

Lines changed: 103 additions & 58 deletions

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: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,9 @@ 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
}
14-
15-
public static string Capitalize(this string str)
16-
{
17-
return char.ToUpperInvariant(str[0]) + str[1..];
18-
}
199
}
2010
}

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/ContractsGeneratorTestHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace {namespaceName}
3232
");
3333
}
3434

35-
public static readonly GeneratorConfiguration DefaultDartConfiguration = new GeneratorConfiguration()
35+
public static readonly GeneratorConfiguration DefaultDartConfiguration = new()
3636
{
3737
Name = "Test",
3838
Dart = new DartConfiguration { },

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace LeanCode.ContractsGenerator.Tests.Dart
55
{
6-
public partial class ContractsGeneratorTests
6+
public class ContractsGeneratorTests_ClassGeneration
77
{
88
[Fact]
99
public void Private_class_is_not_resolved()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace LeanCode.ContractsGenerator.Tests.Dart
55
{
6-
public partial class ContractsGeneratorTests
6+
public class ContractsGeneratorTests_CommandQueryGeneration
77
{
88
[Fact]
99
public void Remote_query_contains_mapping_from_json_for_DTO()
Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,96 @@
1-
using System.Text.RegularExpressions;
21
using Xunit;
32
using static LeanCode.ContractsGenerator.Tests.Dart.ContractsGeneratorTestHelpers;
43

54
namespace LeanCode.ContractsGenerator.Tests.Dart
65
{
7-
public partial class ContractsGeneratorTests
6+
public class ContractsGeneratorTests_ConstantsGeneration
87
{
98
[Fact]
10-
public void Commands_error_code_is_resolved_correctly()
9+
public void Commands_error_code_is_generated()
1110
{
1211
var generator = CreateDartGeneratorFromNamespace("public class TestClass : IRemoteCommand { public static class ErrorCodes { public const int Invalid = 1; } }");
1312

1413
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
1514

16-
Assert.Contains("invalid = 1", contracts);
15+
Assert.Contains("static const invalid = 1", contracts);
1716
}
1817

1918
[Fact]
20-
public void Const_in_nested_static_class_is_resolved_correctly()
19+
public void Const_in_nested_static_class_is_generated()
2120
{
2221
var generator = CreateDartGeneratorFromNamespace("public static class Constants { public static class Constants2 { public const int Value = 1; } }");
2322

2423
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
2524

2625
Assert.Contains("Constants {", contracts);
2726
Assert.Contains("Constants2 {", contracts);
28-
Assert.Contains("value = 1", contracts);
27+
Assert.Contains("static const value = 1", contracts);
2928
}
3029

3130
[Fact]
32-
public void Multiple_command_error_codes_are_resolved_correctly()
31+
public void Multiple_command_error_codes_are_generated()
3332
{
3433
var generator = CreateDartGeneratorFromNamespace("public class TestClass : IRemoteCommand { public static class ErrorCodes { public const int Invalid = 1; public const int Empty = 2; } }");
3534

3635
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
3736

38-
Assert.Contains("invalid = 1", contracts);
39-
Assert.Contains("empty = 2", contracts);
37+
Assert.Contains("static const invalid = 1", contracts);
38+
Assert.Contains("static const empty = 2", contracts);
39+
}
40+
41+
[Fact]
42+
public void Constants_in_static_classes_are_generated()
43+
{
44+
var generator = CreateDartGeneratorFromNamespace("public static class StaticClass { public const int SomeConstant = 1; }");
45+
46+
var contracts = GetContracts(generator.Generate(DefaultDartConfiguration));
47+
48+
Assert.Contains("StaticClass {", 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);
4094
}
4195
}
4296
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace LeanCode.ContractsGenerator.Tests.Dart
55
{
6-
public partial class ContractsGeneratorTests
6+
public class ContractsGeneratorTests_EnumGeneration
77
{
88
[Fact]
99
public void Enums_have_correct_values()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace LeanCode.ContractsGenerator.Tests.Dart
55
{
6-
public partial class ContractsGeneratorTests
6+
public class ContractsGeneratorTests_MultilinePreambles
77
{
88
[Fact]
99
public void Empty_configuration_contains_default_preamble()

0 commit comments

Comments
 (0)