From 9445cd29ae81d292f4a8b9b5b448e4f79bf7ca1b Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 1 Mar 2025 00:55:22 +0100 Subject: [PATCH 1/5] Fix double not getting parsed correctly for annotations --- .../fixtures/json_default_value/input.dart | 2 ++ .../json_default_value/input.genq.dart | 26 +++++++++++++++- tool/parser/parser.go | 31 +++++++++++++++++-- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/tool/generation_test/fixtures/json_default_value/input.dart b/tool/generation_test/fixtures/json_default_value/input.dart index 8bb7fe5..1f89d20 100644 --- a/tool/generation_test/fixtures/json_default_value/input.dart +++ b/tool/generation_test/fixtures/json_default_value/input.dart @@ -7,6 +7,8 @@ class User with _$User { factory User({ @JsonKey(name: 'full_name', defaultValue: 'Supername') required String name, @JsonKey(defaultValue: 999) required int? age, + @JsonKey(defaultValue: 99.9) required double? someDoubleValueNullable, + @JsonKey(name: 'some_double_value', defaultValue: 99.9) required double someDoubleValue, required bool registered, }) = _User; } diff --git a/tool/generation_test/fixtures/json_default_value/input.genq.dart b/tool/generation_test/fixtures/json_default_value/input.genq.dart index 8f1f6d4..9c74c74 100644 --- a/tool/generation_test/fixtures/json_default_value/input.genq.dart +++ b/tool/generation_test/fixtures/json_default_value/input.genq.dart @@ -3,6 +3,8 @@ part of 'input.dart'; mixin _$User { String get name => throw UnimplementedError(); int? get age => throw UnimplementedError(); + double? get someDoubleValueNullable => throw UnimplementedError(); + double get someDoubleValue => throw UnimplementedError(); bool get registered => throw UnimplementedError(); $UserCopyWith get copyWith => throw UnimplementedError(); @@ -15,12 +17,20 @@ class _User implements User { @override final int? age; + @override + final double? someDoubleValueNullable; + + @override + final double someDoubleValue; + @override final bool registered; _User({ required this.name, required this.age, + required this.someDoubleValueNullable, + required this.someDoubleValue, required this.registered, }); @@ -29,7 +39,7 @@ class _User implements User { @override String toString() { - return "User(name: $name, age: $age, registered: $registered)"; + return "User(name: $name, age: $age, someDoubleValueNullable: $someDoubleValueNullable, someDoubleValue: $someDoubleValue, registered: $registered)"; } @override @@ -38,6 +48,8 @@ class _User implements User { if (other is! User) return false; if (!identical(other.name, name) && other.name != name) return false; if (!identical(other.age, age) && other.age != age) return false; + if (!identical(other.someDoubleValueNullable, someDoubleValueNullable) && other.someDoubleValueNullable != someDoubleValueNullable) return false; + if (!identical(other.someDoubleValue, someDoubleValue) && other.someDoubleValue != someDoubleValue) return false; if (!identical(other.registered, registered) && other.registered != registered) return false; return true; } @@ -48,6 +60,8 @@ class _User implements User { runtimeType, name, age, + someDoubleValueNullable, + someDoubleValue, registered, ); } @@ -57,6 +71,8 @@ abstract class $UserCopyWith { User call({ String name, int? age, + double? someDoubleValueNullable, + double someDoubleValue, bool registered, }); } @@ -70,11 +86,15 @@ class _$UserCopyWithImpl implements $UserCopyWith { User call({ Object? name = genq, Object? age = genq, + Object? someDoubleValueNullable = genq, + Object? someDoubleValue = genq, Object? registered = genq, }) { return User( name: name == genq ? __value.name : name as String, age: age == genq ? __value.age : age as int?, + someDoubleValueNullable: someDoubleValueNullable == genq ? __value.someDoubleValueNullable : someDoubleValueNullable as double?, + someDoubleValue: someDoubleValue == genq ? __value.someDoubleValue : someDoubleValue as double, registered: registered == genq ? __value.registered : registered as bool, ); } @@ -84,6 +104,8 @@ User $UserFromJson(Map json) { return User( name: json['full_name'] == null ? 'Supername' : json['full_name'] as String, age: json['age'] == null ? 999 : (json['age'] as num).toInt(), + someDoubleValueNullable: json['someDoubleValueNullable'] == null ? 99.9 : (json['someDoubleValueNullable'] as num).toDouble(), + someDoubleValue: json['some_double_value'] == null ? 99.9 : (json['some_double_value'] as num).toDouble(), registered: json['registered'] as bool, ); } @@ -92,6 +114,8 @@ Map $UserToJson(User obj) { return { 'full_name': obj.name, 'age': obj.age == null ? null : obj.age!, + 'someDoubleValueNullable': obj.someDoubleValueNullable == null ? null : obj.someDoubleValueNullable!, + 'some_double_value': obj.someDoubleValue, 'registered': obj.registered, }; } \ No newline at end of file diff --git a/tool/parser/parser.go b/tool/parser/parser.go index 1b258ad..6108721 100644 --- a/tool/parser/parser.go +++ b/tool/parser/parser.go @@ -137,11 +137,15 @@ func (p *Parser) parseArgumentList() (GenqArgumentList, *ParsingError) { params := []GenqNamedExpression{} if p.lookahead == TOKEN_PAREN_START { // Annotation is an invocation - p.eat(TOKEN_PAREN_START) + _, err := p.eat(TOKEN_PAREN_START) + if err != nil { + return GenqArgumentList{}, err + } for p.lookahead != TOKEN_PAREN_END { p.markRestorationPoint() v, err := p.parseNamedAssignment() + if err == nil { p.dontRestore() @@ -165,7 +169,7 @@ func (p *Parser) parseArgumentList() (GenqArgumentList, *ParsingError) { } } - _, err := p.eat(TOKEN_PAREN_END) + _, err = p.eat(TOKEN_PAREN_END) if err != nil { return GenqArgumentList{}, err } @@ -192,6 +196,10 @@ func (p *Parser) parseAnnotation() (GenqAnnotation, *ParsingError) { if p.lookahead == TOKEN_PAREN_START { // Annotation is an invocation argumentList, err = p.parseArgumentList() + + if err != nil { + return GenqAnnotation{}, err + } } return GenqAnnotation{ @@ -256,6 +264,25 @@ func (p *Parser) parsePrimitive() (GenqValue, *ParsingError) { }, nil } + if p.lookahead == TOKEN_DECIMAL_NUMBER { + v, err := p.eat(TOKEN_DECIMAL_NUMBER) + if err != nil { + return GenqValue{}, err + } + + floatVal, e := strconv.ParseFloat(v, 64) + if e != nil { + err := fmt.Errorf("Could not parse number: %s", v) + return GenqValue{}, p.produceError(err) + } + + return GenqValue{ + RawValue: v, + IntValue: int(floatVal), + }, nil + + } + if p.lookahead == TOKEN_SINGLE_STRING || p.lookahead == TOKEN_DOUBLE_STRING { v, err := p.eat(p.lookahead) if err != nil { From 9b67733ad94c9a327c61f511094a7f130f6a994d Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 1 Mar 2025 00:57:19 +0100 Subject: [PATCH 2/5] Change number in test case --- tool/generation_test/fixtures/json_default_value/input.dart | 2 +- .../generation_test/fixtures/json_default_value/input.genq.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tool/generation_test/fixtures/json_default_value/input.dart b/tool/generation_test/fixtures/json_default_value/input.dart index 1f89d20..402436e 100644 --- a/tool/generation_test/fixtures/json_default_value/input.dart +++ b/tool/generation_test/fixtures/json_default_value/input.dart @@ -8,7 +8,7 @@ class User with _$User { @JsonKey(name: 'full_name', defaultValue: 'Supername') required String name, @JsonKey(defaultValue: 999) required int? age, @JsonKey(defaultValue: 99.9) required double? someDoubleValueNullable, - @JsonKey(name: 'some_double_value', defaultValue: 99.9) required double someDoubleValue, + @JsonKey(name: 'some_double_value', defaultValue: 1234567.89123456789) required double someDoubleValue, required bool registered, }) = _User; } diff --git a/tool/generation_test/fixtures/json_default_value/input.genq.dart b/tool/generation_test/fixtures/json_default_value/input.genq.dart index 9c74c74..adb3b31 100644 --- a/tool/generation_test/fixtures/json_default_value/input.genq.dart +++ b/tool/generation_test/fixtures/json_default_value/input.genq.dart @@ -105,7 +105,7 @@ User $UserFromJson(Map json) { name: json['full_name'] == null ? 'Supername' : json['full_name'] as String, age: json['age'] == null ? 999 : (json['age'] as num).toInt(), someDoubleValueNullable: json['someDoubleValueNullable'] == null ? 99.9 : (json['someDoubleValueNullable'] as num).toDouble(), - someDoubleValue: json['some_double_value'] == null ? 99.9 : (json['some_double_value'] as num).toDouble(), + someDoubleValue: json['some_double_value'] == null ? 1234567.89123456789 : (json['some_double_value'] as num).toDouble(), registered: json['registered'] as bool, ); } From 7b0714f64b2306891dfbe56c86566346b48aecf3 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 1 Mar 2025 01:14:57 +0100 Subject: [PATCH 3/5] Fix linter warnings in generated code --- tool/generation_test/fixtures/generics/input.genq.dart | 6 +++--- tool/generation_test/fixtures/json_basic/input.genq.dart | 2 +- tool/generation_test/fixtures/json_enum/input.genq.dart | 1 + .../fixtures/json_enum_unknown/input.genq.dart | 1 + tool/templates/copywith.go | 6 +++++- tool/templates/json_enum.go | 1 + 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/tool/generation_test/fixtures/generics/input.genq.dart b/tool/generation_test/fixtures/generics/input.genq.dart index 1754c46..f8b88b2 100644 --- a/tool/generation_test/fixtures/generics/input.genq.dart +++ b/tool/generation_test/fixtures/generics/input.genq.dart @@ -46,16 +46,16 @@ abstract class $UserCopyWith { } class _$UserCopyWithImpl implements $UserCopyWith { - final _$User __value; + final _$User value; - _$UserCopyWithImpl(this.__value); + _$UserCopyWithImpl(this.value); @override User call({ Object? data = genq, }) { return User( - data: data == genq ? __value.data : data as T, + data: data == genq ? value.data : data as T, ); } } \ No newline at end of file diff --git a/tool/generation_test/fixtures/json_basic/input.genq.dart b/tool/generation_test/fixtures/json_basic/input.genq.dart index 03d22a8..79eb293 100644 --- a/tool/generation_test/fixtures/json_basic/input.genq.dart +++ b/tool/generation_test/fixtures/json_basic/input.genq.dart @@ -142,7 +142,7 @@ class _$UserCopyWithImpl implements $UserCopyWith { address: address == genq ? __value.address : address as Address?, birthday: birthday == genq ? __value.birthday : birthday as DateTime?, balance: balance == genq ? __value.balance : balance as BigInt?, - someObject: someObject == genq ? __value.someObject : someObject as Object?, + someObject: someObject == genq ? __value.someObject : someObject, someDynamic: someDynamic == genq ? __value.someDynamic : someDynamic as dynamic, someDoubleValue: someDoubleValue == genq ? __value.someDoubleValue : someDoubleValue as double, someDoubleValueNullable: someDoubleValueNullable == genq ? __value.someDoubleValueNullable : someDoubleValueNullable as double?, diff --git a/tool/generation_test/fixtures/json_enum/input.genq.dart b/tool/generation_test/fixtures/json_enum/input.genq.dart index eefbe09..d2a935a 100644 --- a/tool/generation_test/fixtures/json_enum/input.genq.dart +++ b/tool/generation_test/fixtures/json_enum/input.genq.dart @@ -137,6 +137,7 @@ Object $UserStatusToJson(UserStatus value) { return 0; case UserStatus.blocked: return 1; + // ignore: unreachable_switch_default default: throw UnsupportedError('Could not map $value to a JSON value'); } diff --git a/tool/generation_test/fixtures/json_enum_unknown/input.genq.dart b/tool/generation_test/fixtures/json_enum_unknown/input.genq.dart index 90fac6e..b8e957c 100644 --- a/tool/generation_test/fixtures/json_enum_unknown/input.genq.dart +++ b/tool/generation_test/fixtures/json_enum_unknown/input.genq.dart @@ -113,6 +113,7 @@ Object $AccountTypeToJson(AccountType value) { return "vip"; case AccountType.unknown: return "unknown"; + // ignore: unreachable_switch_default default: throw UnsupportedError('Could not map $value to a JSON value'); } diff --git a/tool/templates/copywith.go b/tool/templates/copywith.go index 3366370..f738b23 100644 --- a/tool/templates/copywith.go +++ b/tool/templates/copywith.go @@ -37,7 +37,11 @@ func templateCopyWith(str []string, classDecl GenqClassDeclaration) []string { str = append(str, indent(4, fmt.Sprintf("return %s(", classDecl.Name))) for _, param := range classDecl.Constructor.ParamList.NamedParams { - str = append(str, indent(6, fmt.Sprintf("%s: %s == genq ? __value.%s : %s as %s,", param.Name, param.Name, param.Name, param.Name, param.ParamType.String()))) + if param.ParamType.String() == "Object?" { + str = append(str, indent(6, fmt.Sprintf("%s: %s == genq ? __value.%s : %s,", param.Name, param.Name, param.Name, param.Name))) + } else { + str = append(str, indent(6, fmt.Sprintf("%s: %s == genq ? __value.%s : %s as %s,", param.Name, param.Name, param.Name, param.Name, param.ParamType.String()))) + } } str = append(str, indent(4, fmt.Sprintf(");"))) diff --git a/tool/templates/json_enum.go b/tool/templates/json_enum.go index 7101b85..a94da7c 100644 --- a/tool/templates/json_enum.go +++ b/tool/templates/json_enum.go @@ -47,6 +47,7 @@ func TemplateJsonEnumToJson(str []string, classDecl GenqJsonEnum) []string { } str = append(str, indent(6, fmt.Sprintf("return %s;", jsonValue))) } + str = append(str, indent(4, "// ignore: unreachable_switch_default")) str = append(str, indent(4, fmt.Sprintf("default:"))) str = append(str, indent(6, fmt.Sprintf("throw UnsupportedError('Could not map $value to a JSON value');"))) str = append(str, indent(2, fmt.Sprintf("}"))) From ad959ae217b4cf2db08e3c4e24b345af1972786f Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 1 Mar 2025 01:21:21 +0100 Subject: [PATCH 4/5] Remove unused code --- tool/parser/parser.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tool/parser/parser.go b/tool/parser/parser.go index 6108721..f1861ea 100644 --- a/tool/parser/parser.go +++ b/tool/parser/parser.go @@ -270,15 +270,8 @@ func (p *Parser) parsePrimitive() (GenqValue, *ParsingError) { return GenqValue{}, err } - floatVal, e := strconv.ParseFloat(v, 64) - if e != nil { - err := fmt.Errorf("Could not parse number: %s", v) - return GenqValue{}, p.produceError(err) - } - return GenqValue{ RawValue: v, - IntValue: int(floatVal), }, nil } From 8635aa294f7493c64a332c79e7a173bf3e1f6003 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 1 Mar 2025 01:23:10 +0100 Subject: [PATCH 5/5] Undo change --- tool/generation_test/fixtures/generics/input.genq.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tool/generation_test/fixtures/generics/input.genq.dart b/tool/generation_test/fixtures/generics/input.genq.dart index f8b88b2..1754c46 100644 --- a/tool/generation_test/fixtures/generics/input.genq.dart +++ b/tool/generation_test/fixtures/generics/input.genq.dart @@ -46,16 +46,16 @@ abstract class $UserCopyWith { } class _$UserCopyWithImpl implements $UserCopyWith { - final _$User value; + final _$User __value; - _$UserCopyWithImpl(this.value); + _$UserCopyWithImpl(this.__value); @override User call({ Object? data = genq, }) { return User( - data: data == genq ? value.data : data as T, + data: data == genq ? __value.data : data as T, ); } } \ No newline at end of file