diff --git a/CHANGELOG.md b/CHANGELOG.md index 24110bd2..06605967 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ # 8.9.0-wip - Add ignoring types that the StandardJsonPlugin should leave as a List. +- Allow non alphanumeric characters in enum class names. # 8.8.1 diff --git a/built_value_generator/lib/src/enum_source_class.dart b/built_value_generator/lib/src/enum_source_class.dart index dabdbb26..d468a811 100644 --- a/built_value_generator/lib/src/enum_source_class.dart +++ b/built_value_generator/lib/src/enum_source_class.dart @@ -81,8 +81,8 @@ abstract class EnumSourceClass if (getter == null) return null; var source = parsedLibrary.getElementDeclaration(getter)!.node.toSource(); var matches = RegExp(r'static BuiltSet<' + - element.displayName + - r'> get values => (_\$\w+)\;') + RegExp.escape(element.displayName) + + r'> get values => (_\$[\w$]+)\;') .allMatches(source); return matches.isEmpty ? null : matches.first.group(1); } @@ -93,8 +93,8 @@ abstract class EnumSourceClass if (getter == null) return null; var source = parsedLibrary.getElementDeclaration(getter)!.node.toSource(); var matches = RegExp(r'static ' + - element.displayName + - r' valueOf\((?:final )?String name\) \=\> (\_\$\w+)\(name\)\;') + RegExp.escape(element.displayName) + + r' valueOf\((?:final )?String name\) \=\> (\_\$[\w$]+)\(name\)\;') .allMatches(source); return matches.isEmpty ? null : matches.first.group(1); } @@ -153,9 +153,10 @@ abstract class EnumSourceClass } Iterable _checkConstructor() { - var expectedCode = - RegExp('const $name._\\((?:final )?String name\\) : super\\(name\\);'); - var expectedCode217 = RegExp('const $name._\\(super.name\\);'); + var expectedCode = RegExp( + 'const ${RegExp.escape(name)}._\\((?:final )?String name\\) : super\\(name\\);'); + var expectedCode217 = + RegExp('const ${RegExp.escape(name)}._\\(super.name\\);'); return constructors.length == 1 && (constructors.single.contains(expectedCode) || constructors.single.contains(expectedCode217)) diff --git a/end_to_end_test/lib/enums.dart b/end_to_end_test/lib/enums.dart index b9b1a31d..522a731f 100644 --- a/end_to_end_test/lib/enums.dart +++ b/end_to_end_test/lib/enums.dart @@ -119,3 +119,23 @@ class FallbackNumberEnum extends EnumClass { static BuiltSet get values => _$fbNumberValues; static FallbackNumberEnum valueOf(String name) => _$fbNumberValueOf(name); } + +class EnumWith$Dollar_UnderScore extends EnumClass { + static Serializer get serializer => + _$enumWith$DollarUnderScoreSerializer; + + @BuiltValueEnumConst(wireNumber: 0) + static const EnumWith$Dollar_UnderScore $value = + _$dollar_UnderScoreEnum$Value; + + @BuiltValueEnumConst(wireNumber: -1, fallback: true) + static const EnumWith$Dollar_UnderScore value$ = + _$dollar_UnderScoreEnumValue$; + + const EnumWith$Dollar_UnderScore._(String name) : super(name); + + static BuiltSet get values => + _$enum$Dollar_UnderScoreValues; + static EnumWith$Dollar_UnderScore valueOf(String name) => + _$enum$Dollar_UnderScoreValueOf(name); +} diff --git a/end_to_end_test/lib/enums.g.dart b/end_to_end_test/lib/enums.g.dart index 3782f7bd..391ccd39 100644 --- a/end_to_end_test/lib/enums.g.dart +++ b/end_to_end_test/lib/enums.g.dart @@ -176,6 +176,28 @@ final BuiltSet _$fbNumberValues = _$fbNumberNo, ]); +const EnumWith$Dollar_UnderScore _$dollar_UnderScoreEnum$Value = + const EnumWith$Dollar_UnderScore._('\$value'); +const EnumWith$Dollar_UnderScore _$dollar_UnderScoreEnumValue$ = + const EnumWith$Dollar_UnderScore._('value\$'); + +EnumWith$Dollar_UnderScore _$enum$Dollar_UnderScoreValueOf(String name) { + switch (name) { + case '\$value': + return _$dollar_UnderScoreEnum$Value; + case 'value\$': + return _$dollar_UnderScoreEnumValue$; + default: + return _$dollar_UnderScoreEnumValue$; + } +} + +final BuiltSet _$enum$Dollar_UnderScoreValues = + new BuiltSet(const [ + _$dollar_UnderScoreEnum$Value, + _$dollar_UnderScoreEnumValue$, +]); + Serializer _$testEnumSerializer = new _$TestEnumSerializer(); Serializer _$wireNameEnumSerializer = new _$WireNameEnumSerializer(); @@ -187,6 +209,8 @@ Serializer _$fallbackEnumSerializer = new _$FallbackEnumSerializer(); Serializer _$fallbackNumberEnumSerializer = new _$FallbackNumberEnumSerializer(); +Serializer _$enumWith$DollarUnderScoreSerializer = + new _$EnumWith$Dollar_UnderScoreSerializer(); class _$TestEnumSerializer implements PrimitiveSerializer { @override @@ -335,4 +359,33 @@ class _$FallbackNumberEnumSerializer _fromWire[serialized] ?? (serialized is String ? serialized : '')); } +class _$EnumWith$Dollar_UnderScoreSerializer + implements PrimitiveSerializer { + static const Map _toWire = const { + '\$value': 0, + 'value\$': -1, + }; + static const Map _fromWire = const { + 0: '\$value', + -1: 'value\$', + }; + + @override + final Iterable types = const [EnumWith$Dollar_UnderScore]; + @override + final String wireName = 'EnumWith\$Dollar_UnderScore'; + + @override + Object serialize(Serializers serializers, EnumWith$Dollar_UnderScore object, + {FullType specifiedType = FullType.unspecified}) => + _toWire[object.name] ?? object.name; + + @override + EnumWith$Dollar_UnderScore deserialize( + Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) => + EnumWith$Dollar_UnderScore.valueOf( + _fromWire[serialized] ?? (serialized is String ? serialized : '')); +} + // ignore_for_file: deprecated_member_use_from_same_package,type=lint