[dart] Handle enumVarNames for negative names (#8143)

This commit is contained in:
Peter Leibiger 2020-12-10 11:59:23 +01:00 committed by GitHub
parent 9e5610488f
commit a93a60b6eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 44 deletions

View File

@ -352,10 +352,6 @@ public class DartClientCodegen extends DefaultCodegen {
@Override @Override
public String toVarName(String name) { public String toVarName(String name) {
return toVarName(name, "n");
}
private String toVarName(String name, String numberPrefix) {
// replace - with _ e.g. created-at => created_at // replace - with _ e.g. created-at => created_at
name = name.replace("-", "_"); name = name.replace("-", "_");
@ -380,7 +376,7 @@ public class DartClientCodegen extends DefaultCodegen {
name = camelize(name, true); name = camelize(name, true);
if (name.matches("^\\d.*")) { if (name.matches("^\\d.*")) {
name = numberPrefix + name; name = "n" + name;
} }
if (isReservedWord(name) || importMapping().containsKey(name)) { if (isReservedWord(name) || importMapping().containsKey(name)) {
@ -535,7 +531,16 @@ public class DartClientCodegen extends DefaultCodegen {
if (value.length() == 0) { if (value.length() == 0) {
return "empty"; return "empty";
} }
return toVarName(value, "number"); if (("number".equalsIgnoreCase(datatype) ||
"double".equalsIgnoreCase(datatype) ||
"int".equalsIgnoreCase(datatype)) &&
value.matches("^-?\\d.*")) {
// Only rename numeric values when the datatype is numeric
// AND the name is not changed by enum extensions (matches a numeric value).
boolean isNegative = value.startsWith("-");
return toVarName("number" + (isNegative ? "_negative" : "") + value);
}
return toVarName(value);
} }
@Override @Override

View File

@ -341,38 +341,57 @@ public class DartModelTest {
Assert.assertEquals(codegen.toVarName(name), expectedName); Assert.assertEquals(codegen.toVarName(name), expectedName);
} }
private static class EnumVarName {
final String name;
final String expected;
final String dataType;
EnumVarName(String name, String expected, String dataType) {
this.name = name;
this.expected = expected;
this.dataType = dataType;
}
}
@DataProvider(name = "enumVarNames") @DataProvider(name = "enumVarNames")
public static Object[][] enumVarNames() { public static Object[] enumVarNames() {
return new Object[][] { return new Object[] {
{"", "empty"}, new EnumVarName("", "empty", "String"),
{"Double", "double_"}, new EnumVarName("Double", "double_", "String"),
{"double", "double_"}, new EnumVarName("double", "double_", "String"),
{"dynamic", "dynamic_"}, new EnumVarName("dynamic", "dynamic_", "String"),
{"String", "string"}, new EnumVarName("String", "string", "String"),
{"string", "string"}, new EnumVarName("string", "string", "String"),
{"hello", "hello"}, new EnumVarName("hello", "hello", "String"),
{"FOO", "FOO"}, new EnumVarName("FOO", "FOO", "String"),
{"FOO_BAR", "FOO_BAR"}, new EnumVarName("FOO_BAR", "FOO_BAR", "String"),
{"FOO_BAR_BAZ_", "FOO_BAR_BAZ_"}, new EnumVarName("FOO_BAR_BAZ_", "FOO_BAR_BAZ_", "String"),
{"123hello", "number123hello"}, new EnumVarName("123hello", "n123hello", "String"),
{"_hello", "hello"}, new EnumVarName("_hello", "hello", "String"),
{"_double", "double_"}, new EnumVarName("_double", "double_", "String"),
{"_123hello", "number123hello"}, new EnumVarName("_123hello", "n123hello", "String"),
{"_5FOO", "number5fOO"}, new EnumVarName("_5FOO", "n5fOO", "String"),
{"_FOO", "FOO"}, new EnumVarName("_FOO", "FOO", "String"),
{"_$foo", "dollarFoo"}, new EnumVarName("_$foo", "dollarFoo", "String"),
{"_$_foo_", "dollarFoo"}, new EnumVarName("_$_foo_", "dollarFoo", "String"),
{"$special[property.name]", "dollarSpecialLeftSquareBracketPropertyPeriodNameRightSquareBracket"}, new EnumVarName("$special[property.name]", "dollarSpecialLeftSquareBracketPropertyPeriodNameRightSquareBracket", "String"),
{"$", "dollar"}, new EnumVarName("$", "dollar", "String"),
{">=", "greaterThanEqual"}, new EnumVarName(">=", "greaterThanEqual", "String"),
{"foo bar", "fooBar"}, new EnumVarName("foo bar", "fooBar", "String"),
new EnumVarName("1", "number1", "int"),
new EnumVarName("2", "number2", "int"),
new EnumVarName("-1", "numberNegative1", "int"),
new EnumVarName("-99", "numberNegative99", "int"),
new EnumVarName("1", "number1", "double"),
new EnumVarName("1.1", "number1Period1", "double"),
new EnumVarName("-1.2", "numberNegative1Period2", "double"),
}; };
} }
@Test(dataProvider = "enumVarNames", description = "test enum names are correctly escaped") @Test(dataProvider = "enumVarNames", description = "test enum names are correctly escaped")
public void convertEnumVarNames(String name, String expectedName) { public void convertEnumVarNames(EnumVarName enumVar) {
final DefaultCodegen codegen = new DartClientCodegen(); final DefaultCodegen codegen = new DartClientCodegen();
Assert.assertEquals(codegen.toEnumVarName(name, null), expectedName); Assert.assertEquals(codegen.toEnumVarName(enumVar.name, enumVar.dataType), enumVar.expected);
} }
@Test(description = "model names support `--model-name-prefix` and `--model-name-suffix`") @Test(description = "model names support `--model-name-prefix` and `--model-name-suffix`")

View File

@ -99,7 +99,7 @@ class EnumTestEnumInteger extends EnumClass {
@BuiltValueEnumConst(wireNumber: 1) @BuiltValueEnumConst(wireNumber: 1)
static const EnumTestEnumInteger number1 = _$enumTestEnumInteger_number1; static const EnumTestEnumInteger number1 = _$enumTestEnumInteger_number1;
@BuiltValueEnumConst(wireNumber: -1) @BuiltValueEnumConst(wireNumber: -1)
static const EnumTestEnumInteger number1 = _$enumTestEnumInteger_number1; static const EnumTestEnumInteger numberNegative1 = _$enumTestEnumInteger_numberNegative1;
static Serializer<EnumTestEnumInteger> get serializer => _$enumTestEnumIntegerSerializer; static Serializer<EnumTestEnumInteger> get serializer => _$enumTestEnumIntegerSerializer;
@ -113,9 +113,9 @@ class EnumTestEnumInteger extends EnumClass {
class EnumTestEnumNumber extends EnumClass { class EnumTestEnumNumber extends EnumClass {
@BuiltValueEnumConst(wireName: '1.1') @BuiltValueEnumConst(wireName: '1.1')
static const EnumTestEnumNumber number1period1 = _$enumTestEnumNumber_number1period1; static const EnumTestEnumNumber number1Period1 = _$enumTestEnumNumber_number1Period1;
@BuiltValueEnumConst(wireName: '-1.2') @BuiltValueEnumConst(wireName: '-1.2')
static const EnumTestEnumNumber number1period2 = _$enumTestEnumNumber_number1period2; static const EnumTestEnumNumber numberNegative1Period2 = _$enumTestEnumNumber_numberNegative1Period2;
static Serializer<EnumTestEnumNumber> get serializer => _$enumTestEnumNumberSerializer; static Serializer<EnumTestEnumNumber> get serializer => _$enumTestEnumNumberSerializer;

View File

@ -316,12 +316,12 @@ class EnumTestEnumIntegerEnum {
String toJson() => value; String toJson() => value;
static const number1 = EnumTestEnumIntegerEnum._(1); static const number1 = EnumTestEnumIntegerEnum._(1);
static const number1 = EnumTestEnumIntegerEnum._(-1); static const numberNegative1 = EnumTestEnumIntegerEnum._(-1);
/// List of all possible values in this [enum][EnumTestEnumIntegerEnum]. /// List of all possible values in this [enum][EnumTestEnumIntegerEnum].
static const values = <EnumTestEnumIntegerEnum>[ static const values = <EnumTestEnumIntegerEnum>[
number1, number1,
number1, numberNegative1,
]; ];
static EnumTestEnumIntegerEnum fromJson(dynamic value) => static EnumTestEnumIntegerEnum fromJson(dynamic value) =>
@ -355,7 +355,7 @@ class EnumTestEnumIntegerEnumTypeTransformer {
EnumTestEnumIntegerEnum decode(dynamic data, {bool allowNull}) { EnumTestEnumIntegerEnum decode(dynamic data, {bool allowNull}) {
switch (data) { switch (data) {
case 1: return EnumTestEnumIntegerEnum.number1; case 1: return EnumTestEnumIntegerEnum.number1;
case -1: return EnumTestEnumIntegerEnum.number1; case -1: return EnumTestEnumIntegerEnum.numberNegative1;
default: default:
if (allowNull == false) { if (allowNull == false) {
throw ArgumentError('Unknown enum value to decode: $data'); throw ArgumentError('Unknown enum value to decode: $data');
@ -389,13 +389,13 @@ class EnumTestEnumNumberEnum {
String toJson() => value; String toJson() => value;
static const number1period1 = EnumTestEnumNumberEnum._('1.1'); static const number1Period1 = EnumTestEnumNumberEnum._('1.1');
static const number1period2 = EnumTestEnumNumberEnum._('-1.2'); static const numberNegative1Period2 = EnumTestEnumNumberEnum._('-1.2');
/// List of all possible values in this [enum][EnumTestEnumNumberEnum]. /// List of all possible values in this [enum][EnumTestEnumNumberEnum].
static const values = <EnumTestEnumNumberEnum>[ static const values = <EnumTestEnumNumberEnum>[
number1period1, number1Period1,
number1period2, numberNegative1Period2,
]; ];
static EnumTestEnumNumberEnum fromJson(dynamic value) => static EnumTestEnumNumberEnum fromJson(dynamic value) =>
@ -428,8 +428,8 @@ class EnumTestEnumNumberEnumTypeTransformer {
/// and users are still using an old app with the old code. /// and users are still using an old app with the old code.
EnumTestEnumNumberEnum decode(dynamic data, {bool allowNull}) { EnumTestEnumNumberEnum decode(dynamic data, {bool allowNull}) {
switch (data) { switch (data) {
case '1.1': return EnumTestEnumNumberEnum.number1period1; case '1.1': return EnumTestEnumNumberEnum.number1Period1;
case '-1.2': return EnumTestEnumNumberEnum.number1period2; case '-1.2': return EnumTestEnumNumberEnum.numberNegative1Period2;
default: default:
if (allowNull == false) { if (allowNull == false) {
throw ArgumentError('Unknown enum value to decode: $data'); throw ArgumentError('Unknown enum value to decode: $data');