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

Unified Diff: lib/protobuf/plugin/ExtensionGenerator.dart

Issue 10595002: Protocol Buffer runtime library and 'protoc' plugin (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Work around http://code.google.com/p/dart/issues/detail?id=3806 Created 8 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/protobuf/plugin/EnumGenerator.dart ('k') | lib/protobuf/plugin/IndentingWriter.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/protobuf/plugin/ExtensionGenerator.dart
diff --git a/lib/protobuf/plugin/ExtensionGenerator.dart b/lib/protobuf/plugin/ExtensionGenerator.dart
new file mode 100644
index 0000000000000000000000000000000000000000..dbc652a799ef60bcb536cefdb6a09b5a05b94abd
--- /dev/null
+++ b/lib/protobuf/plugin/ExtensionGenerator.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2012, 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 ExtensionGenerator implements ProtobufContainer {
+
+ // Whitespace
+ static final String sp = MessageGenerator.sp;
+
+ // List of all ExtensionGenerators encountered during a compilation run
+ static List<ExtensionGenerator> allExtensions;
+
+ ExtensionGenerator(GoogleProtobuf_FieldDescriptorProto descriptor,
+ ProtobufContainer parent, GenerationContext context)
+ : this._descriptor = descriptor,
+ this._parent = parent,
+ this._context = context,
+ fqname = parent.fqname == "." ?
+ ".${descriptor.name}" :
+ "${parent.fqname}.${descriptor.name}" {
+ if (allExtensions == null) {
+ allExtensions = new List<ExtensionGenerator>();
+ }
+ allExtensions.add(this);
+ }
+
+ String get classname() {
+ if (_classname == null) {
+ String name = new ProtobufField(_descriptor, _context).externalFieldName;
+ if (_parent is MessageGenerator) {
+ MessageGenerator mg = _parent;
+ _classname = "${mg._classname}.$name";
+ } else {
+ _classname = name;
+ }
+ }
+ return _classname;
+ }
+
+ void generate(IndentingWriter out) {
+ ProtobufField field = new ProtobufField(_descriptor, _context);
+ String baseType = field.baseType;
+
+ String name = field.externalFieldName;
+ String type = field.shortTypeName;
+
+ String typeName = "";
+ ProtobufContainer typeNameContainer = _context[_descriptor.typeName];
+ if (typeNameContainer != null) {
+ typeName = typeNameContainer.classname;
+ }
+
+ String extendee = "";
+ ProtobufContainer extendeeContainer = _context[_descriptor.extendee];
+ if (extendeeContainer != null) {
+ extendee = extendeeContainer.classname;
+ }
+
+ out.println("static Extension _$name${sp}=${sp}null;");
+ out.println("static Extension get $name()${sp}{");
+ out.println("${sp}${sp}if${sp}(null${sp}==${sp}_$name${sp}) {");
+
+ String initializer = "";
+ String builder = "";
+ String valueOf = "";
+
+ if (_descriptor.type == GoogleProtobuf_FieldDescriptorProto_Type.TYPE_MESSAGE ||
+ _descriptor.type == GoogleProtobuf_FieldDescriptorProto_Type.TYPE_GROUP) {
+ if (_descriptor.label ==
+ GoogleProtobuf_FieldDescriptorProto_Label.LABEL_REPEATED) {
+ initializer = ",${sp}()${sp}=>${sp}new PbList<${typeName}>(null)";
+ builder = ",${sp}()${sp}=>${sp}new ${typeName}_Builder()";
+ } else {
+ initializer = ",${sp}()${sp}=>${sp}${typeName}.defaultInstance";
+ builder = ",${sp}()${sp}=>${sp}new ${typeName}_Builder()";
+ }
+ } else {
+ if (_descriptor.label ==
+ GoogleProtobuf_FieldDescriptorProto_Label.LABEL_REPEATED) {
+ initializer = ",${sp}()${sp}=>${sp}new PbList<${baseType}>(null)";
+ } else if (field.hasInitialization) {
+ initializer = ",${sp}${field.initialization}";
+ }
+ }
+
+ if (field.enum) {
+ if (initializer.isEmpty()) {
+ initializer = ",${sp}null";
+ }
+ if (builder.isEmpty()) {
+ builder = ",${sp}null";
+ }
+ valueOf = ",${sp}(var v)${sp}=>${sp}${field.baseType}.valueOf(v)";
+ }
+
+ out.println("${sp}${sp}${sp}${sp}_$name${sp}="
+ "${sp}new Extension(\"$extendee\",${sp}\"$name\",${sp}"
+ "${_descriptor.number},${sp}Builder.$type"
+ "${initializer}${builder}${valueOf}"
+ ");");
+
+ out.println("${sp}${sp}}");
+ out.println("${sp}${sp}return _$name;");
+ out.println("}");
+ }
+
+ String get name() => classname;
+ GoogleProtobuf_FileOptions_OptimizeMode get optimizeFor() => _parent.optimizeFor;
+
+ final String fqname;
+ String _classname;
+ GoogleProtobuf_FieldDescriptorProto _descriptor;
+ ProtobufContainer _parent;
+ GenerationContext _context;
+}
« no previous file with comments | « lib/protobuf/plugin/EnumGenerator.dart ('k') | lib/protobuf/plugin/IndentingWriter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698