Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions protoc_plugin/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 22.0.2-wip

* Fix factory argument types for protobuf `Map` fields. ([#975])

[#975]: https://github.com/google/protobuf.dart/issues/975

## 22.0.1

* Bump `protobuf` constraint to `^4.0.0`
Expand Down
11 changes: 10 additions & 1 deletion protoc_plugin/lib/src/message_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,12 @@ class MessageGenerator extends ProtobufContainer {
if (field.isRepeated && !field.isMapField) {
out.println(
' ${field.baseType.getRepeatedDartTypeIterable(fileGen)}? ${field.memberNames!.fieldName},');
} else if (field.isMapField) {
final keyType = field.getDartMapKeyType();
final valueType = field.getDartMapValueType();
out.println(
' $coreImportPrefix.Iterable<$coreImportPrefix.MapEntry<$keyType, $valueType>>? '
'${field.memberNames!.fieldName},');
} else {
out.println(
' ${field.getDartType()}? ${field.memberNames!.fieldName},');
Expand All @@ -459,9 +465,12 @@ class MessageGenerator extends ProtobufContainer {
if (field.isDeprecated) {
out.println(' // ignore: deprecated_member_use_from_same_package');
}
if (field.isRepeated || field.isMapField) {
if (field.isRepeated && !field.isMapField) {
out.println(
' \$result.${field.memberNames!.fieldName}.addAll(${field.memberNames!.fieldName});');
} else if (field.isMapField) {
out.println(
' \$result.${field.memberNames!.fieldName}.addEntries(${field.memberNames!.fieldName});');
} else {
out.println(
' \$result.${field.memberNames!.fieldName} = ${field.memberNames!.fieldName};');
Expand Down
26 changes: 22 additions & 4 deletions protoc_plugin/lib/src/protobuf_field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -140,18 +140,36 @@ class ProtobufField {
// for example in package:protobuf/src/protobuf/mixins/well_known.dart.
}

/// Returns the expression to use for the Dart type.
/// Returns the type to use for the Dart field type.
String getDartType() {
if (isMapField) {
final d = baseType.generator as MessageGenerator;
final keyType = d._fieldList[0].baseType.getDartType(parent.fileGen!);
final valueType = d._fieldList[1].baseType.getDartType(parent.fileGen!);
final keyType = getDartMapKeyType();
final valueType = getDartMapValueType();
return '$protobufImportPrefix.PbMap<$keyType, $valueType>';
}
if (isRepeated) return baseType.getRepeatedDartType(parent.fileGen!);
return baseType.getDartType(parent.fileGen!);
}

/// Only for map fields: returns the type to use for Dart map field key type.
String getDartMapKeyType() {
assert(isMapField);
return (baseType.generator as MessageGenerator)
._fieldList[0]
.baseType
.getDartType(parent.fileGen!);
}

/// Only for map fields: returns the type to use for Dart map field value
/// type.
String getDartMapValueType() {
assert(isMapField);
return (baseType.generator as MessageGenerator)
._fieldList[1]
.baseType
.getDartType(parent.fileGen!);
}

/// Returns the tag number of the underlying proto field.
int get number => descriptor.number;

Expand Down
2 changes: 1 addition & 1 deletion protoc_plugin/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: protoc_plugin
version: 22.0.1
version: 22.0.2-wip
description: A protobuf protoc compiler plugin used to generate Dart code.
repository: https://github.com/google/protobuf.dart/tree/master/protoc_plugin

Expand Down
15 changes: 15 additions & 0 deletions protoc_plugin/test/map_field_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'dart:convert';
import 'package:protobuf/protobuf.dart';
import 'package:test/test.dart';

import '../out/protos/constructor_args/map_field.pb.dart' as with_constructors;
import '../out/protos/map_field.pb.dart';

void main() {
Expand Down Expand Up @@ -454,4 +455,18 @@ void main() {
msg.int32ToInt32Field[0] = 1;
}, throwsA(const TypeMatcher<UnsupportedError>()));
});

test('Constructor map arguments accept key-value iterators', () {
final msg = with_constructors.TestMap(
stringToInt32Field: [
MapEntry('a', 1),
MapEntry('b', 2),
MapEntry('a', 3)
],
int32ToStringField: {1: 'hi'}.entries,
);
expect(msg.stringToInt32Field['a'], 3);
expect(msg.stringToInt32Field['b'], 2);
expect(msg.int32ToStringField[1], 'hi');
});
}