Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(331)

Side by Side Diff: lib/src/protobuf/generated_message.dart

Issue 1282103003: fix inconsistent firing of events for extension fields (Closed) Base URL: git@github.com:dart-lang/dart-protobuf.git@fieldtype
Patch Set: tweak a comment Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/src/protobuf/event_plugin.dart ('k') | lib/src/protobuf/mixins/map_mixin.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of protobuf; 5 part of protobuf;
6 6
7 typedef GeneratedMessage CreateBuilderFunc(); 7 typedef GeneratedMessage CreateBuilderFunc();
8 typedef Object MakeDefaultFunc(); 8 typedef Object MakeDefaultFunc();
9 typedef ProtobufEnum ValueOfFunc(int value); 9 typedef ProtobufEnum ValueOfFunc(int value);
10 10
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 146
147 /// Clears all data that was set in this message. 147 /// Clears all data that was set in this message.
148 /// 148 ///
149 /// After calling [clear], [getField] will still return default values for 149 /// After calling [clear], [getField] will still return default values for
150 /// unset fields. 150 /// unset fields.
151 void clear() { 151 void clear() {
152 unknownFields.clear(); 152 unknownFields.clear();
153 153
154 if (_hasObservers) { 154 if (_hasObservers) {
155 for (int key in _fieldValues.keys) { 155 for (int key in _fieldValues.keys) {
156 eventPlugin.beforeClearField(key); 156 if (info_.containsTagNumber(key)) {
157 eventPlugin.beforeClearField(key);
158 }
157 } 159 }
158 } 160 }
159 _fieldValues.clear(); 161 _fieldValues.clear();
160 } 162 }
161 163
162 // TODO(antonm): move to getters. 164 // TODO(antonm): move to getters.
163 int getTagNumber(String fieldName) => info_.tagNumber(fieldName); 165 int getTagNumber(String fieldName) => info_.tagNumber(fieldName);
164 166
165 bool operator ==(other) { 167 bool operator ==(other) {
166 if (other is! GeneratedMessage) return false; 168 if (other is! GeneratedMessage) return false;
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 319
318 while (true) { 320 while (true) {
319 int tag = input.readTag(); 321 int tag = input.readTag();
320 if (tag == 0) { 322 if (tag == 0) {
321 return; 323 return;
322 } 324 }
323 int wireType = tag & 0x7; 325 int wireType = tag & 0x7;
324 int tagNumber = tag >> 3; 326 int tagNumber = tag >> 3;
325 int fieldType = -1; 327 int fieldType = -1;
326 328
329 Extension extension;
327 if (info_.containsTagNumber(tagNumber)) { 330 if (info_.containsTagNumber(tagNumber)) {
328 fieldType = info_.fieldType(tagNumber); 331 fieldType = info_.fieldType(tagNumber);
329 } else { 332 } else {
330 Extension extension = extensionRegistry 333 extension = extensionRegistry
331 .getExtension(info_.messageName, tagNumber); 334 .getExtension(info_.messageName, tagNumber);
332 if (extension != null) { 335 if (extension != null) {
333 _addExtensionToMap(extension); 336 _addExtensionToMap(extension);
334 fieldType = extension.type; 337 fieldType = extension.type;
335 } 338 }
336 } 339 }
337 if (fieldType == -1 || !_wireTypeMatches(fieldType, wireType)) { 340 if (fieldType == -1 || !_wireTypeMatches(fieldType, wireType)) {
338 if (!unknownFields.mergeFieldFromBuffer(tag, input)) { 341 if (!unknownFields.mergeFieldFromBuffer(tag, input)) {
339 return; 342 return;
340 } else { 343 } else {
341 continue; 344 continue;
342 } 345 }
343 } 346 }
344 347
345 // Ignore required/optional packed/unpacked. 348 // Ignore required/optional packed/unpacked.
346 fieldType &= ~(FieldType._PACKED_BIT | FieldType._REQUIRED_BIT); 349 fieldType &= ~(FieldType._PACKED_BIT | FieldType._REQUIRED_BIT);
347 switch (fieldType) { 350 switch (fieldType) {
348 case FieldType._OPTIONAL_BOOL: 351 case FieldType._OPTIONAL_BOOL:
349 _setField(tagNumber, input.readBool()); 352 _setField(tagNumber, input.readBool(), extension);
350 break; 353 break;
351 case FieldType._OPTIONAL_BYTES: 354 case FieldType._OPTIONAL_BYTES:
352 _setField(tagNumber, input.readBytes()); 355 _setField(tagNumber, input.readBytes(), extension);
353 break; 356 break;
354 case FieldType._OPTIONAL_STRING: 357 case FieldType._OPTIONAL_STRING:
355 _setField(tagNumber, input.readString()); 358 _setField(tagNumber, input.readString(), extension);
356 break; 359 break;
357 case FieldType._OPTIONAL_FLOAT: 360 case FieldType._OPTIONAL_FLOAT:
358 _setField(tagNumber, input.readFloat()); 361 _setField(tagNumber, input.readFloat(), extension);
359 break; 362 break;
360 case FieldType._OPTIONAL_DOUBLE: 363 case FieldType._OPTIONAL_DOUBLE:
361 _setField(tagNumber, input.readDouble()); 364 _setField(tagNumber, input.readDouble(), extension);
362 break; 365 break;
363 case FieldType._OPTIONAL_ENUM: 366 case FieldType._OPTIONAL_ENUM:
364 int rawValue = input.readEnum(); 367 int rawValue = input.readEnum();
365 var value = _getValueOfFunc(tagNumber, extensionRegistry)(rawValue); 368 var value = _getValueOfFunc(tagNumber, extensionRegistry)(rawValue);
366 if (value == null) { 369 if (value == null) {
367 unknownFields.mergeVarintField(tagNumber, new Int64(rawValue)); 370 unknownFields.mergeVarintField(tagNumber, new Int64(rawValue));
368 } else { 371 } else {
369 _setField(tagNumber, value); 372 _setField(tagNumber, value, extension);
370 } 373 }
371 break; 374 break;
372 case FieldType._OPTIONAL_GROUP: 375 case FieldType._OPTIONAL_GROUP:
373 GeneratedMessage subMessage = 376 GeneratedMessage subMessage =
374 _getEmptyMessage(tagNumber, extensionRegistry); 377 _getEmptyMessage(tagNumber, extensionRegistry);
375 if (_fieldValues.containsKey(tagNumber)) { 378 if (_fieldValues.containsKey(tagNumber)) {
376 subMessage.mergeFromMessage(getField(tagNumber)); 379 subMessage.mergeFromMessage(getField(tagNumber));
377 } 380 }
378 input.readGroup(tagNumber, subMessage, extensionRegistry); 381 input.readGroup(tagNumber, subMessage, extensionRegistry);
379 _setField(tagNumber, subMessage); 382 _setField(tagNumber, subMessage, extension);
380 break; 383 break;
381 case FieldType._OPTIONAL_INT32: 384 case FieldType._OPTIONAL_INT32:
382 _setField(tagNumber, input.readInt32()); 385 _setField(tagNumber, input.readInt32(), extension);
383 break; 386 break;
384 case FieldType._OPTIONAL_INT64: 387 case FieldType._OPTIONAL_INT64:
385 _setField(tagNumber, input.readInt64()); 388 _setField(tagNumber, input.readInt64(), extension);
386 break; 389 break;
387 case FieldType._OPTIONAL_SINT32: 390 case FieldType._OPTIONAL_SINT32:
388 _setField(tagNumber, input.readSint32()); 391 _setField(tagNumber, input.readSint32(), extension);
389 break; 392 break;
390 case FieldType._OPTIONAL_SINT64: 393 case FieldType._OPTIONAL_SINT64:
391 _setField(tagNumber, input.readSint64()); 394 _setField(tagNumber, input.readSint64(), extension);
392 break; 395 break;
393 case FieldType._OPTIONAL_UINT32: 396 case FieldType._OPTIONAL_UINT32:
394 _setField(tagNumber, input.readUint32()); 397 _setField(tagNumber, input.readUint32(), extension);
395 break; 398 break;
396 case FieldType._OPTIONAL_UINT64: 399 case FieldType._OPTIONAL_UINT64:
397 _setField(tagNumber, input.readUint64()); 400 _setField(tagNumber, input.readUint64(), extension);
398 break; 401 break;
399 case FieldType._OPTIONAL_FIXED32: 402 case FieldType._OPTIONAL_FIXED32:
400 _setField(tagNumber, input.readFixed32()); 403 _setField(tagNumber, input.readFixed32(), extension);
401 break; 404 break;
402 case FieldType._OPTIONAL_FIXED64: 405 case FieldType._OPTIONAL_FIXED64:
403 _setField(tagNumber, input.readFixed64()); 406 _setField(tagNumber, input.readFixed64(), extension);
404 break; 407 break;
405 case FieldType._OPTIONAL_SFIXED32: 408 case FieldType._OPTIONAL_SFIXED32:
406 _setField(tagNumber, input.readSfixed32()); 409 _setField(tagNumber, input.readSfixed32(), extension);
407 break; 410 break;
408 case FieldType._OPTIONAL_SFIXED64: 411 case FieldType._OPTIONAL_SFIXED64:
409 _setField(tagNumber, input.readSfixed64()); 412 _setField(tagNumber, input.readSfixed64(), extension);
410 break; 413 break;
411 case FieldType._OPTIONAL_MESSAGE: 414 case FieldType._OPTIONAL_MESSAGE:
412 GeneratedMessage subMessage = 415 GeneratedMessage subMessage =
413 _getEmptyMessage(tagNumber, extensionRegistry); 416 _getEmptyMessage(tagNumber, extensionRegistry);
414 if (_fieldValues.containsKey(tagNumber)) { 417 if (_fieldValues.containsKey(tagNumber)) {
415 subMessage.mergeFromMessage(getField(tagNumber)); 418 subMessage.mergeFromMessage(getField(tagNumber));
416 } 419 }
417 input.readMessage(subMessage, extensionRegistry); 420 input.readMessage(subMessage, extensionRegistry);
418 _setField(tagNumber, subMessage); 421 _setField(tagNumber, subMessage, extension);
419 break; 422 break;
420 case FieldType._REPEATED_BOOL: 423 case FieldType._REPEATED_BOOL:
421 readPackable(wireType, tagNumber, input.readBool); 424 readPackable(wireType, tagNumber, input.readBool);
422 break; 425 break;
423 case FieldType._REPEATED_BYTES: 426 case FieldType._REPEATED_BYTES:
424 appendToRepeated(tagNumber, input.readBytes()); 427 appendToRepeated(tagNumber, input.readBytes());
425 break; 428 break;
426 case FieldType._REPEATED_STRING: 429 case FieldType._REPEATED_STRING:
427 appendToRepeated(tagNumber, input.readString()); 430 appendToRepeated(tagNumber, input.readString());
428 break; 431 break;
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 } 611 }
609 if (_isRepeated(fieldType)) { 612 if (_isRepeated(fieldType)) {
610 List thisList = getField(tagNumber); 613 List thisList = getField(tagNumber);
611 for (var value in fieldValue) { 614 for (var value in fieldValue) {
612 thisList.add(_convertJsonValue(value, tagNumber, fieldType, 615 thisList.add(_convertJsonValue(value, tagNumber, fieldType,
613 extensionRegistry)); 616 extensionRegistry));
614 } 617 }
615 } else { 618 } else {
616 var value = _convertJsonValue(fieldValue, tagNumber, fieldType, 619 var value = _convertJsonValue(fieldValue, tagNumber, fieldType,
617 extensionRegistry); 620 extensionRegistry);
618 setField(tagNumber, value, fieldType); 621 _validate(tagNumber, fieldType, value);
622 _setField(tagNumber, value, extension);
619 } 623 }
620 } 624 }
621 } 625 }
622 626
623 _convertJsonValue(value, int tagNumber, int fieldType, 627 _convertJsonValue(value, int tagNumber, int fieldType,
624 ExtensionRegistry extensionRegistry) { 628 ExtensionRegistry extensionRegistry) {
625 String expectedType; // for exception message 629 String expectedType; // for exception message
626 switch (FieldType._baseType(fieldType)) { 630 switch (FieldType._baseType(fieldType)) {
627 case FieldType._BOOL_BIT: 631 case FieldType._BOOL_BIT:
628 if (value is bool) { 632 if (value is bool) {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 if (!_isRepeated(extension.type)) { 750 if (!_isRepeated(extension.type)) {
747 throw new ArgumentError( 751 throw new ArgumentError(
748 'Cannot add to a non-repeated field (use setExtension())'); 752 'Cannot add to a non-repeated field (use setExtension())');
749 } 753 }
750 // Validate type and range. 754 // Validate type and range.
751 _validate(extension.tagNumber, extension.type, value); 755 _validate(extension.tagNumber, extension.type, value);
752 756
753 var list = _fieldValues[extension.tagNumber]; 757 var list = _fieldValues[extension.tagNumber];
754 if (list == null) { 758 if (list == null) {
755 list = extension.makeDefault(); 759 list = extension.makeDefault();
756 _setExtension(extension, list); 760 _addExtensionToMap(extension);
761 _setField(extension.tagNumber, list, extension);
757 } 762 }
758 763
759 list.add(value); 764 list.add(value);
760 } 765 }
761 766
762 void clearExtension(Extension extension) { 767 void clearExtension(Extension extension) {
763 _checkExtension(extension); 768 _checkExtension(extension);
764 _fieldValues.remove(extension.tagNumber); 769 _fieldValues.remove(extension.tagNumber);
765 var value = extension.makeDefault(); 770 var value = extension.makeDefault();
766 if (value is List) { 771 if (value is List) {
767 _setExtension(extension, value); 772 _addExtensionToMap(extension);
773 _setField(extension.tagNumber, value, extension);
768 } else { 774 } else {
769 _extensions.remove(extension.tagNumber); 775 _extensions.remove(extension.tagNumber);
770 } 776 }
771 } 777 }
772 778
773 /// Clears the contents of a given field. 779 /// Clears the contents of a given field.
774 void clearField(int tagNumber) { 780 void clearField(int tagNumber) {
775 if (_hasObservers) { 781 if (_hasObservers) {
776 eventPlugin.beforeClearField(tagNumber); 782 if (info_.containsTagNumber(tagNumber)) {
783 eventPlugin.beforeClearField(tagNumber);
784 }
777 } 785 }
778 _fieldValues.remove(tagNumber); 786 _fieldValues.remove(tagNumber);
779 } 787 }
780 788
781 bool extensionsAreInitialized() { 789 bool extensionsAreInitialized() {
782 return _extensions.keys.every((int tagNumber) { 790 return _extensions.keys.every((int tagNumber) {
783 return info_._isFieldInitialized(_fieldValues, tagNumber, 791 return info_._isFieldInitialized(_fieldValues, tagNumber,
784 _extensions[tagNumber].type); 792 _extensions[tagNumber].type);
785 }); 793 });
786 } 794 }
787 795
788 /// Returns the value of [extension]. 796 /// Returns the value of [extension].
789 /// 797 ///
790 /// For repeated fields that have not been set previously, [:null:] is 798 /// For repeated fields that have not been set previously, [:null:] is
791 /// returned. 799 /// returned.
792 getExtension(Extension extension) { 800 getExtension(Extension extension) {
793 _checkExtension(extension); 801 _checkExtension(extension);
794 _addExtensionToMap(extension); 802 _addExtensionToMap(extension);
795 return getField(extension.tagNumber); 803 return getField(extension.tagNumber);
796 } 804 }
797 805
798 /// Returns the value of the field associated with [tagNumber], or the 806 /// Returns the value of the field associated with [tagNumber], or the
799 /// default value if it is not set. 807 /// default value if it is not set.
800 getField(int tagNumber) { 808 getField(int tagNumber) {
801 var value = _fieldValues[tagNumber]; 809 var value = _fieldValues[tagNumber];
802 if (value != null) return value; 810 if (value != null) return value;
803 811
812 // Find the default function
813 MakeDefaultFunc f = info_.makeDefault(tagNumber);
814
815 Extension extension;
816 if (f == null) {
817 var extension = _extensions[tagNumber];
818 if (extension == null) {
819 throw new ArgumentError(
820 "tag $tagNumber not defined in ${info_.messageName}");
821 }
822 f = extension.makeDefault;
823 }
824
804 // Initialize the field. 825 // Initialize the field.
805 value = _callDefaultFunction(tagNumber); 826 value = f();
806 if (value is List) { 827 if (value is List) {
807 return _getDefaultRepeatedField(tagNumber, value); 828 return _getDefaultRepeatedField(tagNumber, value, extension);
808 } 829 }
809 return value; 830 return value;
810 } 831 }
811 832
812 List _getDefaultRepeatedField(int tagNumber, List value) { 833 List _getDefaultRepeatedField(int tagNumber, List value, Extension ext) {
813 // Automatically save the repeated field so that changes won't be lost. 834 // Automatically save the repeated field so that changes won't be lost.
814 // 835 //
815 // TODO(skybrian) we could avoid this by generating another 836 // TODO(skybrian) we could avoid this by generating another
816 // method for repeated fields: 837 // method for repeated fields:
817 // 838 //
818 // msg.mutableFoo().add(123); 839 // msg.mutableFoo().add(123);
819 // 840 //
820 // Then msg.foo could return an immutable empty list by default. 841 // Then msg.foo could return an immutable empty list by default.
821 // But it doesn't seem urgent or worth the migration. 842 // But it doesn't seem urgent or worth the migration.
822 _setField(tagNumber, value); 843 _setField(tagNumber, value, ext);
823 return value; 844 return value;
824 } 845 }
825 846
826 /// Returns the value of a field, ignoring any defaults. 847 /// Returns the value of a field, ignoring any defaults.
827 /// 848 ///
828 /// For unset or cleared fields, returns null. 849 /// For unset or cleared fields, returns null.
829 /// Also returns null for unknown tag numbers. 850 /// Also returns null for unknown tag numbers.
830 getFieldOrNull(int tagNumber) => _fieldValues[tagNumber]; 851 getFieldOrNull(int tagNumber) => _fieldValues[tagNumber];
831 852
832 /// Returns the default value for the given field. 853 /// Returns the default value for the given field.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 892
872 /// Merges the contents of the [other] into this message. 893 /// Merges the contents of the [other] into this message.
873 /// 894 ///
874 /// Singular fields that are set in [other] overwrite the corresponding fields 895 /// Singular fields that are set in [other] overwrite the corresponding fields
875 /// in this message. Repeated fields are appended. Singular sub-messages are 896 /// in this message. Repeated fields are appended. Singular sub-messages are
876 /// recursively merged. 897 /// recursively merged.
877 void mergeFromMessage(GeneratedMessage other) { 898 void mergeFromMessage(GeneratedMessage other) {
878 for (int tagNumber in other._fieldValues.keys) { 899 for (int tagNumber in other._fieldValues.keys) {
879 var fieldValue = other._fieldValues[tagNumber]; 900 var fieldValue = other._fieldValues[tagNumber];
880 901
881 if (other._extensions.containsKey(tagNumber)) { 902 var extension = other._extensions[tagNumber];
882 _addExtensionToMap(other._extensions[tagNumber]); 903 if (extension != null) {
904 _addExtensionToMap(extension);
883 } 905 }
884 int fieldType = other._getFieldType(tagNumber); 906 int fieldType = other._getFieldType(tagNumber);
885 var cloner = (x) => x; 907 var cloner = (x) => x;
886 if ((fieldType & (FieldType._GROUP_BIT | FieldType._MESSAGE_BIT)) != 0) { 908 if (_isGroupOrMessage(fieldType)) {
887 cloner = (message) => message.clone(); 909 cloner = (message) => message.clone();
888 } 910 }
889 if (_isRepeated(fieldType)) { 911 if (_isRepeated(fieldType)) {
890 getField(tagNumber).addAll(new List.from(fieldValue).map(cloner)); 912 getField(tagNumber).addAll(new List.from(fieldValue).map(cloner));
891 } else { 913 } else {
892 setField(tagNumber, cloner(fieldValue), fieldType); 914 fieldValue = cloner(fieldValue);
915 _validate(tagNumber, fieldType, fieldValue);
916 _setField(tagNumber, fieldValue, extension);
893 } 917 }
894 } 918 }
895 919
896 mergeUnknownFields(other.unknownFields); 920 mergeUnknownFields(other.unknownFields);
897 } 921 }
898 922
899 void mergeUnknownFields(UnknownFieldSet unknownFieldSet) { 923 void mergeUnknownFields(UnknownFieldSet unknownFieldSet) {
900 unknownFields.mergeFromUnknownFieldSet(unknownFieldSet); 924 unknownFields.mergeFromUnknownFieldSet(unknownFieldSet);
901 } 925 }
902 926
903 /// Sets the value of a non-repeated extension field to [value]. 927 /// Sets the value of a non-repeated extension field to [value].
904 void setExtension(Extension extension, value) { 928 void setExtension(Extension extension, value) {
929 if (value == null) {
930 throw new ArgumentError('value is null');
931 } else if (_isRepeated(extension.type)) {
932 throw new ArgumentError(_generateMessage(tagNumber, value,
933 'repeating field (use get + .add())'));
934 }
905 _checkExtension(extension); 935 _checkExtension(extension);
906 _addExtensionToMap(extension); 936 _addExtensionToMap(extension);
907 setField(extension.tagNumber, value, extension.type); 937 _validate(extension.tagNumber, extension.type, value);
938 _setField(extension.tagNumber, value, extension);
908 } 939 }
909 940
910 /// Sets the value of a given field by its [tagNumber]. 941 /// Sets the value of a non-extension field by its [tagNumber].
911 /// 942 ///
912 /// Throws an [:ArgumentError:] if [value] does not match the type 943 /// Throws an [:ArgumentError:] if [value] does not match the type
913 /// associated with [tagNumber]. 944 /// associated with [tagNumber].
914 /// 945 ///
915 /// Throws an [:ArgumentError:] if [value] is [:null:]. To clear a field of 946 /// Throws an [:ArgumentError:] if [value] is [:null:]. To clear a field of
916 /// it's current value, use [clearField] instead. 947 /// it's current value, use [clearField] instead.
917 void setField(int tagNumber, value, [int fieldType = null]) { 948 void setField(int tagNumber, value) {
Søren Gjesse 2015/08/10 13:37:19 This is a breaking change. Is the pubspec.yaml upd
skybrian 2015/08/10 18:26:12 Updated CHANGELOG. I will bump the version number
918 if (value == null) { 949 if (value == null) throw new ArgumentError('value is null');
919 throw new ArgumentError('value is null'); 950
951 if (!info_.containsTagNumber(tagNumber)) {
952 throw new ArgumentError('Unknown tag: $tagNumber');
920 } 953 }
921 if (fieldType == null) { 954 var fieldType = info_.fieldType(tagNumber);
922 if (!info_.containsTagNumber(tagNumber)) {
923 throw new ArgumentError('Unknown tag: $tagNumber');
924 }
925 fieldType = info_.fieldType(tagNumber);
926 }
927 if (_isRepeated(fieldType)) { 955 if (_isRepeated(fieldType)) {
928 throw new ArgumentError(_generateMessage(tagNumber, value, 956 throw new ArgumentError(_generateMessage(tagNumber, value,
929 'repeating field (use get + .add())')); 957 'repeating field (use get + .add())'));
930 } 958 }
931 959
932 // Validate type and range. 960 // Validate type and range.
933 _validate(tagNumber, fieldType, value); 961 _validate(tagNumber, fieldType, value);
934 962 _setField(tagNumber, value, null);
935 _setField(tagNumber, value);
936 } 963 }
937 964
938 void _setField(int tagNumber, value) { 965 void _setField(int tagNumber, value, Extension extension) {
939 if (_hasObservers) { 966 if (_hasObservers && extension == null) {
940 eventPlugin.beforeSetField(tagNumber, value); 967 eventPlugin.beforeSetField(tagNumber, value);
941 } 968 }
942 _fieldValues[tagNumber] = value; 969 _fieldValues[tagNumber] = value;
943 } 970 }
944 971
945 void _addExtensionToMap(Extension extension) { 972 void _addExtensionToMap(Extension extension) {
946 _extensions[extension.tagNumber] = extension; 973 _extensions[extension.tagNumber] = extension;
947 } 974 }
948 975
949 void _checkExtension(Extension extension) { 976 void _checkExtension(Extension extension) {
(...skipping 29 matching lines...) Expand all
979 ValueOfFunc _getValueOfFunc(int tagNumber, 1006 ValueOfFunc _getValueOfFunc(int tagNumber,
980 ExtensionRegistry extensionRegistry) { 1007 ExtensionRegistry extensionRegistry) {
981 ValueOfFunc valueOfFunc = info_.valueOfFunc(tagNumber); 1008 ValueOfFunc valueOfFunc = info_.valueOfFunc(tagNumber);
982 if (valueOfFunc == null && extensionRegistry != null) { 1009 if (valueOfFunc == null && extensionRegistry != null) {
983 valueOfFunc = extensionRegistry.getExtension(info_.messageName, 1010 valueOfFunc = extensionRegistry.getExtension(info_.messageName,
984 tagNumber).valueOf; 1011 tagNumber).valueOf;
985 } 1012 }
986 return valueOfFunc; 1013 return valueOfFunc;
987 } 1014 }
988 1015
989 // Does not perform validation.
990 void _setExtension(Extension extension, var value) {
991 _addExtensionToMap(extension);
992 _fieldValues[extension.tagNumber] = value;
993 }
994
995 String _generateMessage(int tagNumber, var value, String detail) { 1016 String _generateMessage(int tagNumber, var value, String detail) {
996 String fieldName; 1017 String fieldName;
997 if (_extensions[tagNumber] != null) { 1018 if (_extensions[tagNumber] != null) {
998 fieldName = _extensions[tagNumber].name; 1019 fieldName = _extensions[tagNumber].name;
999 } else { 1020 } else {
1000 fieldName = info_.fieldName(tagNumber); 1021 fieldName = info_.fieldName(tagNumber);
1001 } 1022 }
1002 String messageType = info_.messageName; 1023 String messageType = info_.messageName;
1003 return 'Illegal to set field $fieldName ($tagNumber) of $messageType' 1024 return 'Illegal to set field $fieldName ($tagNumber) of $messageType'
1004 ' to value ($value): $detail'; 1025 ' to value ($value): $detail';
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 _generateMessage(tagNumber, value, 'not a GeneratedMessage')); 1174 _generateMessage(tagNumber, value, 'not a GeneratedMessage'));
1154 } 1175 }
1155 break; 1176 break;
1156 default: 1177 default:
1157 throw new ArgumentError( 1178 throw new ArgumentError(
1158 _generateMessage(tagNumber, value, 'field has unknown type ' 1179 _generateMessage(tagNumber, value, 'field has unknown type '
1159 '$fieldType')); 1180 '$fieldType'));
1160 } 1181 }
1161 } 1182 }
1162 } 1183 }
OLDNEW
« no previous file with comments | « lib/src/protobuf/event_plugin.dart ('k') | lib/src/protobuf/mixins/map_mixin.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698