diff --git a/protobuf/lib/protobuf.dart b/protobuf/lib/protobuf.dart index e2d5cdcb2..f7fc90c4b 100644 --- a/protobuf/lib/protobuf.dart +++ b/protobuf/lib/protobuf.dart @@ -6,7 +6,13 @@ library protobuf; import 'dart:collection' show ListBase, MapBase; import 'dart:convert' - show base64Decode, base64Encode, jsonEncode, jsonDecode, Utf8Codec; + show + base64Decode, + base64Encode, + jsonEncode, + jsonDecode, + Utf8Codec, + Utf8Encoder; import 'dart:math' as math; import 'dart:typed_data' show TypedData, Uint8List, ByteData, Endian; diff --git a/protobuf/lib/src/protobuf/coded_buffer.dart b/protobuf/lib/src/protobuf/coded_buffer.dart index 45c3f4e09..6100eef71 100644 --- a/protobuf/lib/src/protobuf/coded_buffer.dart +++ b/protobuf/lib/src/protobuf/coded_buffer.dart @@ -195,7 +195,7 @@ void _mergeFromCodedBufferReader(BuilderInfo meta, _FieldSet fs, } void _readPackable(BuilderInfo meta, _FieldSet fs, CodedBufferReader input, - int wireType, FieldInfo fi, Function readFunc) { + int wireType, FieldInfo fi, Object Function() readFunc) { void readToList(List list) => list.add(readFunc()); _readPackableToList(meta, fs, input, wireType, fi, readToList); } @@ -222,8 +222,13 @@ void _readPackableToListEnum( _readPackableToList(meta, fs, input, wireType, fi, readToList); } -void _readPackableToList(BuilderInfo meta, _FieldSet fs, - CodedBufferReader input, int wireType, FieldInfo fi, Function readToList) { +void _readPackableToList( + BuilderInfo meta, + _FieldSet fs, + CodedBufferReader input, + int wireType, + FieldInfo fi, + void Function(List) readToList) { var list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { diff --git a/protobuf/lib/src/protobuf/coded_buffer_reader.dart b/protobuf/lib/src/protobuf/coded_buffer_reader.dart index 7dfe56a2f..5384b50aa 100644 --- a/protobuf/lib/src/protobuf/coded_buffer_reader.dart +++ b/protobuf/lib/src/protobuf/coded_buffer_reader.dart @@ -35,7 +35,7 @@ class CodedBufferReader { bool isAtEnd() => _bufferPos >= _currentLimit; - void _withLimit(int byteLimit, callback) { + void _withLimit(int byteLimit, void Function() callback) { if (byteLimit < 0) { throw ArgumentError( 'CodedBufferReader encountered an embedded string or message' diff --git a/protobuf/lib/src/protobuf/coded_buffer_writer.dart b/protobuf/lib/src/protobuf/coded_buffer_writer.dart index b1821d898..218d36fda 100644 --- a/protobuf/lib/src/protobuf/coded_buffer_writer.dart +++ b/protobuf/lib/src/protobuf/coded_buffer_writer.dart @@ -64,11 +64,11 @@ class CodedBufferWriter { _commitChunk(true); } - void writeField(int fieldNumber, int fieldType, fieldValue) { + void writeField(int fieldNumber, int fieldType, dynamic fieldValue) { final valueType = fieldType & ~0x07; if ((fieldType & PbFieldType._PACKED_BIT) != 0) { - if (!fieldValue.isEmpty) { + if (fieldValue.isNotEmpty) { _writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED); final mark = _startLengthDelimited(); for (var value in fieldValue) { @@ -340,7 +340,7 @@ class CodedBufferWriter { value is TypedData ? value : Uint8List.fromList(value)); break; case PbFieldType._STRING_BIT: - _writeBytesNoTag(_utf8.encode(value)); + _writeBytesNoTag(const Utf8Encoder().convert(value)); break; case PbFieldType._DOUBLE_BIT: _writeDouble(value); @@ -349,9 +349,11 @@ class CodedBufferWriter { _writeFloat(value); break; case PbFieldType._ENUM_BIT: + // `value` is [ProtobufEnum]. _writeVarint32(value.value & 0xffffffff); break; case PbFieldType._GROUP_BIT: + // `value` is [GeneratedMessage] or [UnknownFieldSet]. value.writeToCodedBufferWriter(this); break; case PbFieldType._INT32_BIT: @@ -386,6 +388,7 @@ class CodedBufferWriter { break; case PbFieldType._MESSAGE_BIT: final mark = _startLengthDelimited(); + // `value` is [GeneratedMessage]. value.writeToCodedBufferWriter(this); _endLengthDelimited(mark); break; @@ -393,6 +396,7 @@ class CodedBufferWriter { } void _writeBytesNoTag(dynamic value) { + // `value` is [TypedData]&[List]. writeInt32NoTag(value.length); writeRawBytes(value); } diff --git a/protobuf/lib/src/protobuf/extension_registry.dart b/protobuf/lib/src/protobuf/extension_registry.dart index be1f3d134..5328c9e80 100644 --- a/protobuf/lib/src/protobuf/extension_registry.dart +++ b/protobuf/lib/src/protobuf/extension_registry.dart @@ -134,7 +134,7 @@ T _reparseMessage( resultMap ??= ensureResult()._fieldSet._values[field.index!]; if (field.isRepeated) { - final messageEntries = message._fieldSet._values[field.index!]; + final /*List*/ messageEntries = message._fieldSet._values[field.index!]; if (messageEntries == null) continue; if (field.isGroupOrMessage) { for (var i = 0; i < messageEntries.length; i++) { @@ -146,7 +146,8 @@ T _reparseMessage( } } } else if (field is MapFieldInfo) { - final messageMap = message._fieldSet._values[field.index!]; + final /*PbMap*/ messageMap = message._fieldSet._values[field.index!]; + if (messageMap == null) continue; if (_isGroupOrMessage(field.valueFieldType!)) { for (var key in messageMap.keys) { diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart index f137aad50..7186ef880 100644 --- a/protobuf/lib/src/protobuf/field_set.dart +++ b/protobuf/lib/src/protobuf/field_set.dart @@ -175,7 +175,7 @@ class _FieldSet { _frozenState = true; for (var field in _meta.sortedByTag) { if (field.isRepeated) { - final entries = _values[field.index!]; + final /*PbList*/ entries = _values[field.index!]; if (entries == null) continue; if (field.isGroupOrMessage) { for (var subMessage in entries as List) { @@ -668,7 +668,9 @@ class _FieldSet { } else if (!_isEnum(fi.type)) { hash = _HashUtils._combine(hash, value.hashCode); } else if (fi.isRepeated) { - hash = _HashUtils._hashObjects(value.map((enm) => enm.value)); + // `value` is [List]. + hash = _HashUtils._hashObjects( + value.map((/*ProtobufEnum*/ enm) => enm.value)); } else { ProtobufEnum enm = value; hash = _HashUtils._combine(hash, enm.value); @@ -802,6 +804,7 @@ class _FieldSet { var mustClone = _isGroupOrMessage(otherFi.type); if (fi!.isMapField) { + // `fieldValue` is [Map]. var f = fi as MapFieldInfo; mustClone = _isGroupOrMessage(f.valueFieldType!); var map = f._ensureMapField(meta, this) as PbMap; @@ -832,7 +835,7 @@ class _FieldSet { } if (otherFi.isGroupOrMessage) { - final currentFi = isExtension! + final GeneratedMessage? currentFi = isExtension! ? _ensureExtensions()._getFieldOrNull(fi as Extension) : _values[fi.index!]; diff --git a/protobuf/lib/src/protobuf/json.dart b/protobuf/lib/src/protobuf/json.dart index c2c736853..dbb467c8d 100644 --- a/protobuf/lib/src/protobuf/json.dart +++ b/protobuf/lib/src/protobuf/json.dart @@ -9,6 +9,7 @@ Map _writeToJsonMap(_FieldSet fs) { var baseType = PbFieldType._baseType(fieldType); if (_isRepeated(fieldType)) { + // `fieldValue` is [List]. return List.from(fieldValue.map((e) => convertToMap(e, baseType))); } @@ -27,6 +28,7 @@ Map _writeToJsonMap(_FieldSet fs) { // Encode 'bytes' as a base64-encoded string. return base64Encode(fieldValue as List); case PbFieldType._ENUM_BIT: + // `fieldValue` is [ProtobufEnum]. return fieldValue.value; // assume |value| < 2^52 case PbFieldType._INT64_BIT: case PbFieldType._SINT64_BIT: @@ -34,16 +36,18 @@ Map _writeToJsonMap(_FieldSet fs) { return fieldValue.toString(); case PbFieldType._UINT64_BIT: case PbFieldType._FIXED64_BIT: + // `fieldValue` is [Int64]. return fieldValue.toStringUnsigned(); case PbFieldType._GROUP_BIT: case PbFieldType._MESSAGE_BIT: + // `fieldValue` is [GeneratedMessage]. return fieldValue.writeToJsonMap(); default: throw 'Unknown type $fieldType'; } } - List _writeMap(dynamic fieldValue, MapFieldInfo fi) => + List _writeMap(Map fieldValue, MapFieldInfo fi) => List.from(fieldValue.entries.map((MapEntry e) => { '${PbMap._keyFieldNumber}': convertToMap(e.key, fi.keyFieldType!), '${PbMap._valueFieldNumber}': diff --git a/protobuf/lib/src/protobuf/utils.dart b/protobuf/lib/src/protobuf/utils.dart index 0c7e4e531..011be8efb 100644 --- a/protobuf/lib/src/protobuf/utils.dart +++ b/protobuf/lib/src/protobuf/utils.dart @@ -31,7 +31,7 @@ bool _areMapsEqual(Map lhs, Map rhs) { } bool _areByteDataEqual(ByteData lhs, ByteData rhs) { - Uint8List asBytes(d) => + Uint8List asBytes(ByteData d) => Uint8List.view(d.buffer, d.offsetInBytes, d.lengthInBytes); return _areListsEqual(asBytes(lhs), asBytes(rhs)); }