| Index: lib/src/protobuf/builder_info.dart | 
| diff --git a/lib/src/protobuf/builder_info.dart b/lib/src/protobuf/builder_info.dart | 
| index e581284eec79137f1d193d8468061d4ba019c16b..cc5a1dc47828fcf920c70dca89bbb26a6a9453e1 100644 | 
| --- a/lib/src/protobuf/builder_info.dart | 
| +++ b/lib/src/protobuf/builder_info.dart | 
| @@ -18,21 +18,22 @@ class BuilderInfo { | 
|  | 
| BuilderInfo(this.messageName); | 
|  | 
| -  void add(int tagNumber, String name, int fieldType, | 
| -           dynamic defaultOrMaker, | 
| -           CreateBuilderFunc subBuilder, | 
| -           ValueOfFunc valueOf) { | 
| +  void add/*<T>*/( | 
| +      int tagNumber, | 
| +      String name, | 
| +      int fieldType, | 
| +      dynamic defaultOrMaker, | 
| +      CreateBuilderFunc subBuilder, | 
| +      ValueOfFunc valueOf) { | 
| var index = fieldInfo.length; | 
| -    addField(new FieldInfo( | 
| -      name, tagNumber, index, fieldType, defaultOrMaker, subBuilder, valueOf)); | 
| +    addField(new FieldInfo/*<T>*/(name, tagNumber, index, fieldType, | 
| +        defaultOrMaker, subBuilder, valueOf)); | 
| } | 
|  | 
| -  void addRepeated(int tagNumber, String name, int fieldType, | 
| -                   CheckFunc check, | 
| -                   CreateBuilderFunc subBuilder, | 
| -                   ValueOfFunc valueOf) { | 
| +  void addRepeated/*<T>*/(int tagNumber, String name, int fieldType, | 
| +      CheckFunc check, CreateBuilderFunc subBuilder, ValueOfFunc valueOf) { | 
| var index = fieldInfo.length; | 
| -    addField(new FieldInfo.repeated( | 
| +    addField(new FieldInfo/*<T>*/ .repeated( | 
| name, tagNumber, index, fieldType, check, subBuilder, valueOf)); | 
| } | 
|  | 
| @@ -42,41 +43,39 @@ class BuilderInfo { | 
| byName[fi.name] = fi; | 
| } | 
|  | 
| -  void a(int tagNumber, String name, int fieldType, | 
| -         [dynamic defaultOrMaker, | 
| -          CreateBuilderFunc subBuilder, | 
| -          ValueOfFunc valueOf]) { | 
| -    add(tagNumber, name, fieldType, | 
| -        defaultOrMaker, subBuilder, valueOf); | 
| +  void a/*<T>*/(int tagNumber, String name, int fieldType, | 
| +      [dynamic defaultOrMaker, | 
| +      CreateBuilderFunc subBuilder, | 
| +      ValueOfFunc valueOf]) { | 
| +    add/*<T>*/(tagNumber, name, fieldType, defaultOrMaker, subBuilder, valueOf); | 
| } | 
|  | 
| // Enum. | 
| -  void e(int tagNumber, String name, int fieldType, | 
| -         dynamic defaultOrMaker, ValueOfFunc valueOf) { | 
| -    add(tagNumber, name, fieldType, | 
| -        defaultOrMaker, null, valueOf); | 
| +  void e/*<T>*/(int tagNumber, String name, int fieldType, | 
| +      dynamic defaultOrMaker, ValueOfFunc valueOf) { | 
| +    add/*<T>*/(tagNumber, name, fieldType, defaultOrMaker, null, valueOf); | 
| } | 
|  | 
| // Repeated message. | 
| // TODO(skybrian): migrate to pp() and remove. | 
| -  void m(int tagNumber, String name, | 
| -         CreateBuilderFunc subBuilder, MakeDefaultFunc makeDefault) { | 
| -    add(tagNumber, name, PbFieldType._REPEATED_MESSAGE, | 
| -        makeDefault, subBuilder, null); | 
| +  void m/*<T>*/(int tagNumber, String name, CreateBuilderFunc subBuilder, | 
| +      MakeDefaultFunc makeDefault) { | 
| +    add/*<T>*/(tagNumber, name, PbFieldType._REPEATED_MESSAGE, makeDefault, | 
| +        subBuilder, null); | 
| } | 
|  | 
| // Repeated, not a message, group, or enum. | 
| -  void p(int tagNumber, String name, int fieldType) { | 
| +  void p/*<T>*/(int tagNumber, String name, int fieldType) { | 
| assert(!_isGroupOrMessage(fieldType) && !_isEnum(fieldType)); | 
| -    addRepeated(tagNumber, name, fieldType, | 
| -        getCheckFunction(fieldType), null, null); | 
| +    addRepeated/*<T>*/( | 
| +        tagNumber, name, fieldType, getCheckFunction(fieldType), null, null); | 
| } | 
|  | 
| // Repeated message, group, or enum. | 
| -  void pp(int tagNumber, String name, int fieldType, CheckFunc check, | 
| -         [CreateBuilderFunc subBuilder, ValueOfFunc valueOf]) { | 
| +  void pp/*<T>*/(int tagNumber, String name, int fieldType, CheckFunc check, | 
| +      [CreateBuilderFunc subBuilder, ValueOfFunc valueOf]) { | 
| assert(_isGroupOrMessage(fieldType) || _isEnum(fieldType)); | 
| -    addRepeated(tagNumber, name, fieldType, check, subBuilder, valueOf); | 
| +    addRepeated/*<T>*/(tagNumber, name, fieldType, check, subBuilder, valueOf); | 
| } | 
|  | 
| bool containsTagNumber(int tagNumber) => fieldInfo.containsKey(tagNumber); | 
| @@ -123,7 +122,7 @@ class BuilderInfo { | 
| // TODO(skybrian): perhaps the code generator should insert the FieldInfos | 
| // in tag number order, to avoid sorting them? | 
| _sortedByTag = new List<FieldInfo>.from(fieldInfo.values) | 
| -            ..sort((a, b) => a.tagNumber.compareTo(b.tagNumber)); | 
| +      ..sort((a, b) => a.tagNumber.compareTo(b.tagNumber)); | 
| return _sortedByTag; | 
| } | 
|  | 
| @@ -131,14 +130,13 @@ class BuilderInfo { | 
| int tagNumber, ExtensionRegistry extensionRegistry) { | 
| CreateBuilderFunc subBuilderFunc = subBuilder(tagNumber); | 
| if (subBuilderFunc == null && extensionRegistry != null) { | 
| -      subBuilderFunc = extensionRegistry.getExtension(messageName, | 
| -          tagNumber).subBuilder; | 
| +      subBuilderFunc = | 
| +          extensionRegistry.getExtension(messageName, tagNumber).subBuilder; | 
| } | 
| return subBuilderFunc(); | 
| } | 
|  | 
| _decodeEnum(int tagNumber, ExtensionRegistry registry, int rawValue) { | 
| - | 
| ValueOfFunc f = valueOfFunc(tagNumber); | 
| if (f == null && registry != null) { | 
| f = registry.getExtension(messageName, tagNumber).valueOf; | 
|  |