Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |