Index: lib/protobuf/plugin/EnumGenerator.dart |
diff --git a/lib/protobuf/plugin/EnumGenerator.dart b/lib/protobuf/plugin/EnumGenerator.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..589f3868d966332c97c30137cb47bb7eeb7a038a |
--- /dev/null |
+++ b/lib/protobuf/plugin/EnumGenerator.dart |
@@ -0,0 +1,127 @@ |
+// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+class EnumAlias { |
+ EnumAlias(GoogleProtobuf_EnumValueDescriptorProto this.value, |
+ GoogleProtobuf_EnumValueDescriptorProto this.canonicalValue); |
+ GoogleProtobuf_EnumValueDescriptorProto value; |
+ GoogleProtobuf_EnumValueDescriptorProto canonicalValue; |
+} |
+ |
+class EnumGenerator implements ProtobufContainer { |
+ |
+ // Whitespace |
+ static final String sp = MessageGenerator.sp; |
+ |
+ EnumGenerator(GoogleProtobuf_EnumDescriptorProto this._descriptor, |
+ ProtobufContainer this._parent, GenerationContext this._context) |
+ : _canonicalValues = [], _aliases = [] { |
+ _classname = _parent === null ? |
+ _descriptor.name : |
+ "${_parent.classname}_${_descriptor.name}"; |
+ _fqname = _parent === null ? |
+ _descriptor.name : |
+ "${_parent.fqname}.${_descriptor.name}"; |
+ _optimizeFor = _parent != null ? _parent.optimizeFor : null; |
+ |
+ for (GoogleProtobuf_EnumValueDescriptorProto value in _descriptor.value) { |
+ GoogleProtobuf_EnumValueDescriptorProto canonicalValue = |
+ findValueByNumber(value.number); |
+ if (value === canonicalValue) { |
+ _canonicalValues.add(value); |
+ } else { |
+ _aliases.add(new EnumAlias(value, canonicalValue)); |
+ } |
+ } |
+ _context.register(this); |
+ } |
+ |
+ GoogleProtobuf_EnumValueDescriptorProto findValueByNumber(int number) { |
+ for (GoogleProtobuf_EnumValueDescriptorProto value in _descriptor.value) { |
+ if (value.number == number) return value; |
+ } |
+ return null; |
+ } |
+ |
+ /* |
+ * Not clear on the Reflection-labeled section. |
+ */ |
+ void generate(IndentingWriter out) { |
+ out.addBlock("class ${_classname} extends ProtobufEnum " |
+ "implements Hashable {", "}\n", () { |
+ // ----------------------------------------------------------------- |
+ // define enum types |
+ int index = 0; |
+ for (GoogleProtobuf_EnumValueDescriptorProto val in _canonicalValues) { |
+ out.println("static ${_classname} get ${val.name}()${sp}=>" |
+ "${sp}values[${index++}];"); |
+ } |
+ out.println("static List<${_classname}> _byIndex;"); |
+ out.println("static Map<int, ${_classname}> _byValue;"); |
+ out.blankLine(); |
+ out.println("static void _init()${sp}{"); |
+ out.println("${sp}${sp}_byIndex${sp}=${sp}const${sp}["); |
+ index = 0; |
+ for (GoogleProtobuf_EnumValueDescriptorProto val in _canonicalValues) { |
+ out.println("${sp}${sp}${sp}${sp}const ${_classname}._(${index++}," |
+ "${sp}${val.number},${sp}'${val.name}'),"); |
+ } |
+ out.println("${sp}${sp}];"); |
+ out.println("${sp}${sp}_byValue = " |
+ "ProtobufEnum.initByValue(_byIndex);"); |
+ out.println("}"); |
+ out.blankLine(); |
+ out.println("static List<${_classname}> get values()${sp}{"); |
+ out.println("${sp}${sp}if (null${sp}==${sp}_byIndex)${sp}_init();"); |
+ out.println("${sp}${sp}return${sp}_byIndex;"); |
+ out.println("}"); |
+ out.blankLine(); |
+ out.println("static ${_classname} valueOf(int value)${sp}{"); |
+ out.println("${sp}${sp}if (null${sp}==${sp}_byValue)${sp}_init();"); |
+ out.println("${sp}${sp}return _byValue[value];"); |
+ out.println("}"); |
+ |
+ // ----------------------------------------------------------------- |
+ // define aliases and _VALUE fields |
+ if (!_aliases.isEmpty()) { |
+ out.blankLine(); |
+ } |
+ for (EnumAlias alias in _aliases) { |
+ out.println("static final ${_classname} ${alias.value.name} =" |
+ " ${alias.canonicalValue.name};"); |
+ } |
+ out.blankLine(); |
+ |
+ // ----------------------------------------------------------------- |
+ // define equals operator |
+ out.addBlock("bool operator ==(Object o) {", "}", () { |
+ out.println("if (o is ${_classname}) {"); |
+ out.println(" ${_classname} p = o;"); |
+ out.println(" return value == p.value;"); |
+ out.println("} else {"); |
+ out.println(" return false;"); |
+ out.println("}"); |
+ }); |
+ out.blankLine(); |
+ |
+ // ----------------------------------------------------------------- |
+ // constructor |
+ out.println("const ${_classname}._(int i,${sp}int v,${sp}String n)${sp}" |
+ ":${sp}super(i,${sp}v,${sp}n);"); |
+ }); |
+ } |
+ |
+ String get classname() => _classname; |
+ String get fqname() => _fqname; |
+ GoogleProtobuf_FileOptions_OptimizeMode get optimizeFor() => _optimizeFor; |
+ |
+ GoogleProtobuf_EnumDescriptorProto _descriptor; |
+ ProtobufContainer _parent; |
+ GenerationContext _context; |
+ String _classname; |
+ String _fqname; |
+ List<GoogleProtobuf_EnumValueDescriptorProto> _canonicalValues; |
+ List<EnumAlias> _aliases; |
+ GoogleProtobuf_FileOptions_OptimizeMode _optimizeFor; |
+} |