OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 protoc; | 5 part of protoc; |
6 | 6 |
7 class ExtensionGenerator { | 7 class ExtensionGenerator { |
8 final FieldDescriptorProto _descriptor; | 8 final FieldDescriptorProto _descriptor; |
9 final ProtobufContainer _parent; | 9 final ProtobufContainer _parent; |
10 | 10 |
11 // populated by resolve() | 11 // populated by resolve() |
12 ProtobufField _field; | 12 ProtobufField _field; |
| 13 String _extensionName; |
13 String _extendedClassName = ""; | 14 String _extendedClassName = ""; |
14 | 15 |
15 ExtensionGenerator(this._descriptor, this._parent); | 16 ExtensionGenerator(this._descriptor, this._parent); |
16 | 17 |
17 void resolve(GenerationContext ctx) { | 18 void resolve(GenerationContext ctx) { |
18 _field = new ProtobufField(_descriptor, null, _parent, ctx); | 19 _extensionName = extensionName(_descriptor); |
| 20 _field = new ProtobufField.extension(_descriptor, _parent, ctx); |
19 | 21 |
20 ProtobufContainer extendedType = ctx.getFieldType(_descriptor.extendee); | 22 ProtobufContainer extendedType = ctx.getFieldType(_descriptor.extendee); |
21 // TODO(skybrian) When would this be null? | 23 // TODO(skybrian) When would this be null? |
22 if (extendedType != null) { | 24 if (extendedType != null) { |
23 _extendedClassName = extendedType.classname; | 25 _extendedClassName = extendedType.classname; |
24 } | 26 } |
25 } | 27 } |
26 | 28 |
27 String get package => _parent.package; | 29 String get package => _parent.package; |
28 | 30 |
29 /// The generator of the .pb.dart file where this extension will be defined. | 31 /// The generator of the .pb.dart file where this extension will be defined. |
30 FileGenerator get fileGen => _parent.fileGen; | 32 FileGenerator get fileGen => _parent.fileGen; |
31 | 33 |
32 String get name { | 34 String get name { |
33 if (_field == null) throw new StateError("resolve not called"); | 35 if (_field == null) throw new StateError("resolve not called"); |
34 String name = _field.dartFieldName; | 36 String name = _extensionName; |
35 return _parent is MessageGenerator ? '${_parent.classname}.$name' : name; | 37 return _parent is MessageGenerator ? '${_parent.classname}.$name' : name; |
36 } | 38 } |
37 | 39 |
38 bool get needsFixnumImport { | 40 bool get needsFixnumImport { |
39 if (_field == null) throw new StateError("resolve not called"); | 41 if (_field == null) throw new StateError("resolve not called"); |
40 return _field.needsFixnumImport; | 42 return _field.needsFixnumImport; |
41 } | 43 } |
42 | 44 |
43 /// Adds dependencies of [generate] to [imports]. | 45 /// Adds dependencies of [generate] to [imports]. |
44 /// | 46 /// |
(...skipping 20 matching lines...) Expand all Loading... |
65 /// For each .pb.dart file that the generated code needs to import, | 67 /// For each .pb.dart file that the generated code needs to import, |
66 /// add its generator. | 68 /// add its generator. |
67 void addConstantImportsTo(Set<FileGenerator> imports) { | 69 void addConstantImportsTo(Set<FileGenerator> imports) { |
68 if (_field == null) throw new StateError("resolve not called"); | 70 if (_field == null) throw new StateError("resolve not called"); |
69 // No dependencies - nothing to do. | 71 // No dependencies - nothing to do. |
70 } | 72 } |
71 | 73 |
72 void generate(IndentingWriter out) { | 74 void generate(IndentingWriter out) { |
73 if (_field == null) throw new StateError("resolve not called"); | 75 if (_field == null) throw new StateError("resolve not called"); |
74 | 76 |
75 String name = _field.dartFieldName; | 77 String name = _extensionName; |
76 var type = _field.baseType; | 78 var type = _field.baseType; |
77 var dartType = type.getDartType(package); | 79 var dartType = type.getDartType(package); |
78 | 80 |
79 if (_field.isRepeated) { | 81 if (_field.isRepeated) { |
80 out.print('static final Extension $name = ' | 82 out.print('static final Extension $name = ' |
81 'new Extension<$dartType>.repeated(\'$_extendedClassName\',' | 83 'new Extension<$dartType>.repeated(\'$_extendedClassName\',' |
82 ' \'$name\', ${_field.number}, ${_field.typeConstant}'); | 84 ' \'$name\', ${_field.number}, ${_field.typeConstant}'); |
83 if (type.isMessage || type.isGroup) { | 85 if (type.isMessage || type.isGroup) { |
84 out.println(', $dartType.$checkItem, $dartType.create);'); | 86 out.println(', $dartType.$checkItem, $dartType.create);'); |
85 } else if (type.isEnum) { | 87 } else if (type.isEnum) { |
(...skipping 16 matching lines...) Expand all Loading... |
102 var dartEnum = type.getDartType(package); | 104 var dartEnum = type.getDartType(package); |
103 String valueOf = '(var v) => $dartEnum.valueOf(v)'; | 105 String valueOf = '(var v) => $dartEnum.valueOf(v)'; |
104 out.println(", $initializer, null, $valueOf);"); | 106 out.println(", $initializer, null, $valueOf);"); |
105 } else if (initializer != null) { | 107 } else if (initializer != null) { |
106 out.println(", $initializer);"); | 108 out.println(", $initializer);"); |
107 } else { | 109 } else { |
108 out.println(");"); | 110 out.println(");"); |
109 } | 111 } |
110 } | 112 } |
111 } | 113 } |
OLD | NEW |