Skip to content

Commit 27c9853

Browse files
authored
[pigeon] fix int bug (flutter#7725)
fixes flutter/flutter#155512
1 parent 03e1bfa commit 27c9853

File tree

9 files changed

+136
-35
lines changed

9 files changed

+136
-35
lines changed

packages/pigeon/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 22.4.1
2+
3+
* [dart] Fixes bug where special handling of ints is ignored if no custom types are used.
4+
15
## 22.4.0
26

37
* Adds support for non-nullable types in collections.

packages/pigeon/lib/dart_generator.dart

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -339,44 +339,42 @@ class DartGenerator extends StructuredGenerator<DartOptions> {
339339
indent.write('class $_pigeonCodec extends StandardMessageCodec');
340340
indent.addScoped(' {', '}', () {
341341
indent.writeln('const $_pigeonCodec();');
342-
if (enumeratedTypes.isNotEmpty) {
343-
indent.writeln('@override');
344-
indent.write('void writeValue(WriteBuffer buffer, Object? value) ');
345-
indent.addScoped('{', '}', () {
346-
indent.writeScoped('if (value is int) {', '}', () {
347-
indent.writeln('buffer.putUint8(4);');
348-
indent.writeln('buffer.putInt64(value);');
349-
}, addTrailingNewline: false);
350-
351-
enumerate(enumeratedTypes,
352-
(int index, final EnumeratedType customType) {
353-
writeEncodeLogic(customType);
354-
});
355-
indent.addScoped(' else {', '}', () {
356-
indent.writeln('super.writeValue(buffer, value);');
357-
});
342+
indent.writeln('@override');
343+
indent.write('void writeValue(WriteBuffer buffer, Object? value) ');
344+
indent.addScoped('{', '}', () {
345+
indent.writeScoped('if (value is int) {', '}', () {
346+
indent.writeln('buffer.putUint8(4);');
347+
indent.writeln('buffer.putInt64(value);');
348+
}, addTrailingNewline: false);
349+
350+
enumerate(enumeratedTypes,
351+
(int index, final EnumeratedType customType) {
352+
writeEncodeLogic(customType);
358353
});
359-
indent.newln();
360-
indent.writeln('@override');
361-
indent.write('Object? readValueOfType(int type, ReadBuffer buffer) ');
354+
indent.addScoped(' else {', '}', () {
355+
indent.writeln('super.writeValue(buffer, value);');
356+
});
357+
});
358+
indent.newln();
359+
indent.writeln('@override');
360+
indent.write('Object? readValueOfType(int type, ReadBuffer buffer) ');
361+
indent.addScoped('{', '}', () {
362+
indent.write('switch (type) ');
362363
indent.addScoped('{', '}', () {
363-
indent.write('switch (type) ');
364-
indent.addScoped('{', '}', () {
365-
for (final EnumeratedType customType in enumeratedTypes) {
366-
if (customType.enumeration < maximumCodecFieldKey) {
367-
writeDecodeLogic(customType);
368-
}
364+
for (final EnumeratedType customType in enumeratedTypes) {
365+
if (customType.enumeration < maximumCodecFieldKey) {
366+
writeDecodeLogic(customType);
369367
}
370-
if (root.requiresOverflowClass) {
371-
writeDecodeLogic(overflowClass);
372-
}
373-
indent.writeln('default:');
374-
indent.nest(1, () {
375-
indent.writeln('return super.readValueOfType(type, buffer);');
376-
});
368+
}
369+
if (root.requiresOverflowClass) {
370+
writeDecodeLogic(overflowClass);
371+
}
372+
indent.writeln('default:');
373+
indent.nest(1, () {
374+
indent.writeln('return super.readValueOfType(type, buffer);');
377375
});
378376
});
379-
}
377+
});
380378
});
381379
}
382380

packages/pigeon/lib/generator_tools.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'ast.dart';
1414
/// The current version of pigeon.
1515
///
1616
/// This must match the version in pubspec.yaml.
17-
const String pigeonVersion = '22.4.0';
17+
const String pigeonVersion = '22.4.1';
1818

1919
/// Read all the content from [stdin] to a String.
2020
String readStdin() {

packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/background_platform_channels.gen.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,23 @@ PlatformException _createConnectionError(String channelName) {
2121

2222
class _PigeonCodec extends StandardMessageCodec {
2323
const _PigeonCodec();
24+
@override
25+
void writeValue(WriteBuffer buffer, Object? value) {
26+
if (value is int) {
27+
buffer.putUint8(4);
28+
buffer.putInt64(value);
29+
} else {
30+
super.writeValue(buffer, value);
31+
}
32+
}
33+
34+
@override
35+
Object? readValueOfType(int type, ReadBuffer buffer) {
36+
switch (type) {
37+
default:
38+
return super.readValueOfType(type, buffer);
39+
}
40+
}
2441
}
2542

2643
class BackgroundApi2Host {

packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/multiple_arity.gen.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,23 @@ List<Object?> wrapResponse(
3232

3333
class _PigeonCodec extends StandardMessageCodec {
3434
const _PigeonCodec();
35+
@override
36+
void writeValue(WriteBuffer buffer, Object? value) {
37+
if (value is int) {
38+
buffer.putUint8(4);
39+
buffer.putInt64(value);
40+
} else {
41+
super.writeValue(buffer, value);
42+
}
43+
}
44+
45+
@override
46+
Object? readValueOfType(int type, ReadBuffer buffer) {
47+
switch (type) {
48+
default:
49+
return super.readValueOfType(type, buffer);
50+
}
51+
}
3552
}
3653

3754
class MultipleArityHostApi {

packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/nullable_returns.gen.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,23 @@ List<Object?> wrapResponse(
3232

3333
class _PigeonCodec extends StandardMessageCodec {
3434
const _PigeonCodec();
35+
@override
36+
void writeValue(WriteBuffer buffer, Object? value) {
37+
if (value is int) {
38+
buffer.putUint8(4);
39+
buffer.putInt64(value);
40+
} else {
41+
super.writeValue(buffer, value);
42+
}
43+
}
44+
45+
@override
46+
Object? readValueOfType(int type, ReadBuffer buffer) {
47+
switch (type) {
48+
default:
49+
return super.readValueOfType(type, buffer);
50+
}
51+
}
3552
}
3653

3754
class NullableReturnHostApi {

packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/primitive.gen.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,23 @@ List<Object?> wrapResponse(
3232

3333
class _PigeonCodec extends StandardMessageCodec {
3434
const _PigeonCodec();
35+
@override
36+
void writeValue(WriteBuffer buffer, Object? value) {
37+
if (value is int) {
38+
buffer.putUint8(4);
39+
buffer.putInt64(value);
40+
} else {
41+
super.writeValue(buffer, value);
42+
}
43+
}
44+
45+
@override
46+
Object? readValueOfType(int type, ReadBuffer buffer) {
47+
switch (type) {
48+
default:
49+
return super.readValueOfType(type, buffer);
50+
}
51+
}
3552
}
3653

3754
class PrimitiveHostApi {

packages/pigeon/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: pigeon
22
description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
33
repository: https://github.com/flutter/packages/tree/main/packages/pigeon
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+pigeon%22
5-
version: 22.4.0 # This must match the version in lib/generator_tools.dart
5+
version: 22.4.1 # This must match the version in lib/generator_tools.dart
66

77
environment:
88
sdk: ^3.3.0

packages/pigeon/test/dart_generator_test.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,4 +1771,35 @@ name: foobar
17711771
final String mainCode = mainCodeSink.toString();
17721772
expect(mainCode, contains('List<Object?> wrapResponse('));
17731773
});
1774+
1775+
test('writes custom int codec without custom types', () {
1776+
final Root root = Root(
1777+
apis: <Api>[
1778+
AstHostApi(name: 'Api', methods: <Method>[
1779+
Method(
1780+
name: 'doit',
1781+
location: ApiLocation.host,
1782+
returnType: const TypeDeclaration(
1783+
baseName: 'int',
1784+
isNullable: true,
1785+
),
1786+
parameters: <Parameter>[])
1787+
])
1788+
],
1789+
classes: <Class>[],
1790+
enums: <Enum>[],
1791+
);
1792+
final StringBuffer sink = StringBuffer();
1793+
const DartGenerator generator = DartGenerator();
1794+
generator.generate(
1795+
const DartOptions(),
1796+
root,
1797+
sink,
1798+
dartPackageName: DEFAULT_PACKAGE_NAME,
1799+
);
1800+
final String code = sink.toString();
1801+
expect(code, contains('if (value is int) {'));
1802+
expect(code, contains('buffer.putUint8(4);'));
1803+
expect(code, contains('buffer.putInt64(value);'));
1804+
});
17741805
}

0 commit comments

Comments
 (0)