Skip to content

Commit 2cc3e6e

Browse files
authored
[pigeon] fixed java generics for Maps (#449)
1 parent fafa664 commit 2cc3e6e

File tree

4 files changed

+58
-6
lines changed

4 files changed

+58
-6
lines changed

packages/pigeon/lib/functional.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,10 @@ Iterable<int> _count() sync* {
6868

6969
/// All integers starting at zero.
7070
final Iterable<int> wholeNumbers = _count();
71+
72+
/// Repeats an [item] [n] times.
73+
Iterable<T> repeat<T>(T item, int n) sync* {
74+
for (int i = 0; i < n; ++i) {
75+
yield item;
76+
}
77+
}

packages/pigeon/lib/java_generator.dart

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,17 @@ String _flattenTypeArguments(List<TypeDeclaration> args) {
318318
return args.map<String>(_javaTypeForDartType).join(', ');
319319
}
320320

321+
String _javaTypeForBuiltinGenericDartType(
322+
TypeDeclaration type,
323+
int numberTypeArguments,
324+
) {
325+
if (type.typeArguments.isEmpty) {
326+
return '${type.baseName}<${repeat('Object', numberTypeArguments).join(', ')}>';
327+
} else {
328+
return '${type.baseName}<${_flattenTypeArguments(type.typeArguments)}>';
329+
}
330+
}
331+
321332
String? _javaTypeForBuiltinDartType(TypeDeclaration type) {
322333
const Map<String, String> javaTypeForDartTypeMap = <String, String>{
323334
'bool': 'Boolean',
@@ -328,16 +339,13 @@ String? _javaTypeForBuiltinDartType(TypeDeclaration type) {
328339
'Int32List': 'int[]',
329340
'Int64List': 'long[]',
330341
'Float64List': 'double[]',
331-
'Map': 'Map<Object, Object>',
332342
};
333343
if (javaTypeForDartTypeMap.containsKey(type.baseName)) {
334344
return javaTypeForDartTypeMap[type.baseName];
335345
} else if (type.baseName == 'List') {
336-
if (type.typeArguments.isEmpty) {
337-
return 'List<Object>';
338-
} else {
339-
return 'List<${_flattenTypeArguments(type.typeArguments)}>';
340-
}
346+
return _javaTypeForBuiltinGenericDartType(type, 1);
347+
} else if (type.baseName == 'Map') {
348+
return _javaTypeForBuiltinGenericDartType(type, 2);
341349
} else {
342350
return null;
343351
}

packages/pigeon/test/functional_test.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,12 @@ void main() {
6969
expect(result[1], 1);
7070
expect(result[2], 2);
7171
});
72+
73+
test('repeat', () {
74+
final List<int> result = repeat(123, 3).toList();
75+
expect(result.length, 3);
76+
expect(result[0], 123);
77+
expect(result[1], 123);
78+
expect(result[2], 123);
79+
});
7280
}

packages/pigeon/test/java_generator_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,35 @@ void main() {
653653
expect(code, contains('List<Long> field1;'));
654654
});
655655

656+
test('generics - maps', () {
657+
final Class klass = Class(
658+
name: 'Foobar',
659+
fields: <NamedType>[
660+
NamedType(
661+
type: TypeDeclaration(
662+
baseName: 'Map',
663+
isNullable: true,
664+
typeArguments: <TypeDeclaration>[
665+
TypeDeclaration(baseName: 'String', isNullable: true),
666+
TypeDeclaration(baseName: 'String', isNullable: true),
667+
]),
668+
name: 'field1',
669+
offset: null),
670+
],
671+
);
672+
final Root root = Root(
673+
apis: <Api>[],
674+
classes: <Class>[klass],
675+
enums: <Enum>[],
676+
);
677+
final StringBuffer sink = StringBuffer();
678+
const JavaOptions javaOptions = JavaOptions(className: 'Messages');
679+
generateJava(javaOptions, root, sink);
680+
final String code = sink.toString();
681+
expect(code, contains('class Foobar'));
682+
expect(code, contains('Map<String, String> field1;'));
683+
});
684+
656685
test('host generics argument', () {
657686
final Root root = Root(
658687
apis: <Api>[

0 commit comments

Comments
 (0)