Skip to content

Commit b7eac12

Browse files
authored
Fix Float JSON decoding (#673)
* fix Float JSON decoding
1 parent a2536fc commit b7eac12

19 files changed

Lines changed: 540 additions & 28 deletions

File tree

examples/auth_token_with_isolate/client/linux/flutter/generated_plugins.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
66
)
77

88
list(APPEND FLUTTER_FFI_PLUGIN_LIST
9+
jni
910
)
1011

1112
set(PLUGIN_BUNDLED_LIBRARIES)

examples/auth_token_with_isolate/client/windows/flutter/generated_plugins.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
66
)
77

88
list(APPEND FLUTTER_FFI_PLUGIN_LIST
9+
jni
910
)
1011

1112
set(PLUGIN_BUNDLED_LIBRARIES)

examples/pokemon_explorer/linux/flutter/generated_plugins.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
66
)
77

88
list(APPEND FLUTTER_FFI_PLUGIN_LIST
9+
jni
910
)
1011

1112
set(PLUGIN_BUNDLED_LIBRARIES)

examples/pokemon_explorer/windows/flutter/generated_plugins.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
66
)
77

88
list(APPEND FLUTTER_FFI_PLUGIN_LIST
9+
jni
910
)
1011

1112
set(PLUGIN_BUNDLED_LIBRARIES)

packages/ferry_generator2/lib/src/emit/data_emitter_fields.dart

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import "../ir/model.dart";
99
import "../ir/names.dart";
1010
import "../ir/types.dart";
1111
import "../utils/naming.dart";
12+
import "emitter_helpers.dart";
1213

1314
List<FieldSpec> buildFieldSpecs({
1415
required DataEmitterContext ctx,
@@ -161,7 +162,8 @@ bool canUseListFrom({
161162
}) {
162163
if (namedType.kind != GraphQLTypeKind.scalar) return false;
163164
if (override?.fromJsonFunctionName != null) return false;
164-
if (_isBuiltinScalarName(typeName)) return true;
165+
if (canUseListFromForBuiltinScalar(typeName)) return true;
166+
if (isBuiltinScalarName(typeName)) return false;
165167
final overrideType = override?.type;
166168
if (overrideType == null) return false;
167169
final normalized = overrideType.replaceAll(" ", "");
@@ -173,15 +175,6 @@ bool canUseListFrom({
173175
return true;
174176
}
175177

176-
bool _isBuiltinScalarName(String typeName) => switch (typeName) {
177-
"Int" => true,
178-
"Float" => true,
179-
"Boolean" => true,
180-
"ID" => true,
181-
"String" => true,
182-
_ => false,
183-
};
184-
185178
Reference typeReferenceWithNullability(
186179
Reference typeRef, {
187180
required bool isNullable,

packages/ferry_generator2/lib/src/emit/data_emitter_json.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import "../config/builder_config.dart";
55
import "data_emitter_context.dart";
66
import "data_emitter_fields.dart";
77
import "data_emitter_types.dart";
8+
import "emitter_helpers.dart";
89
import "../ir/types.dart";
910

1011
Expression fromJsonExpression({
@@ -138,7 +139,12 @@ Expression _fromJsonForNamedType({
138139
}
139140

140141
final scalarType = scalarReference(ctx: ctx, typeName: typeName);
141-
final castExpr = valueExpr.asA(scalarType);
142+
final castExpr = scalarFromJsonExpression(
143+
typeName: typeName,
144+
valueExpr: valueExpr,
145+
scalarType: scalarType,
146+
overrideType: override?.type,
147+
);
142148
return ctx.collections.wrapMap(
143149
typeName: typeName,
144150
innerExpr: castExpr,

packages/ferry_generator2/lib/src/emit/emitter_helpers.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,43 @@ Expression conditionalExpression(
128128
);
129129
}
130130

131+
Expression scalarFromJsonExpression({
132+
required String typeName,
133+
required Expression valueExpr,
134+
required Reference scalarType,
135+
required String? overrideType,
136+
}) {
137+
if (shouldCoerceFloatFromJson(
138+
typeName: typeName,
139+
overrideType: overrideType,
140+
)) {
141+
return valueExpr.asA(refer("num")).property("toDouble").call([]);
142+
}
143+
return valueExpr.asA(scalarType);
144+
}
145+
146+
bool shouldCoerceFloatFromJson({
147+
required String typeName,
148+
required String? overrideType,
149+
}) {
150+
if (typeName != "Float") return false;
151+
if (overrideType == null) return true;
152+
final normalized = overrideType.replaceAll(" ", "");
153+
return normalized == "double" || normalized == "double?";
154+
}
155+
156+
bool isBuiltinScalarName(String typeName) => switch (typeName) {
157+
"Int" => true,
158+
"Float" => true,
159+
"Boolean" => true,
160+
"ID" => true,
161+
"String" => true,
162+
_ => false,
163+
};
164+
165+
bool canUseListFromForBuiltinScalar(String typeName) =>
166+
isBuiltinScalarName(typeName) && typeName != "Float";
167+
131168
String copyWithIsSetName(String propertyName) =>
132169
identifier("${propertyName}IsSet");
133170

packages/ferry_generator2/lib/src/emit/schema_emitter.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,12 @@ class _SchemaEmitter {
952952
}
953953

954954
final scalarType = _scalarReference(typeName);
955-
final castExpr = valueExpr.asA(scalarType);
955+
final castExpr = scalarFromJsonExpression(
956+
typeName: typeName,
957+
valueExpr: valueExpr,
958+
scalarType: scalarType,
959+
overrideType: override?.type,
960+
);
956961
return _collections.wrapMap(
957962
typeName: typeName,
958963
innerExpr: castExpr,

packages/ferry_generator2/lib/src/emit/vars_emitter.dart

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,8 @@ class VarsEmitter {
375375
}) {
376376
if (namedType.kind != GraphQLTypeKind.scalar) return false;
377377
if (override?.fromJsonFunctionName != null) return false;
378-
if (_isBuiltinScalarName(typeName)) return true;
378+
if (canUseListFromForBuiltinScalar(typeName)) return true;
379+
if (isBuiltinScalarName(typeName)) return false;
379380
final overrideType = override?.type;
380381
if (overrideType == null) return false;
381382
final normalized = overrideType.replaceAll(" ", "");
@@ -387,15 +388,6 @@ class VarsEmitter {
387388
return true;
388389
}
389390

390-
bool _isBuiltinScalarName(String typeName) => switch (typeName) {
391-
"Int" => true,
392-
"Float" => true,
393-
"Boolean" => true,
394-
"ID" => true,
395-
"String" => true,
396-
_ => false,
397-
};
398-
399391
Reference _typeReferenceWithNullability(
400392
Reference typeRef, {
401393
required bool isNullable,
@@ -576,7 +568,12 @@ class VarsEmitter {
576568
}
577569

578570
final scalarType = _scalarReference(typeName);
579-
final castExpr = valueExpr.asA(scalarType);
571+
final castExpr = scalarFromJsonExpression(
572+
typeName: typeName,
573+
valueExpr: valueExpr,
574+
scalarType: scalarType,
575+
overrideType: override?.type,
576+
);
580577
return _collections.wrapMap(
581578
typeName: typeName,
582579
innerExpr: castExpr,

packages/ferry_generator2_end_to_end/lib/edge_cases/__generated__/numeric_value.ast.gql.dart

Lines changed: 58 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)