Browse Source

QuickProto improvements to more correctly observe package names and map_entry options

Tim Burks 9 years ago
parent
commit
916601d46c

+ 27 - 3
Packages/QuickProto/Sources/FileDescriptor.swift

@@ -32,9 +32,22 @@
  */
 import Foundation
 
+extension String {
+  func stripPrefix(_ prefix: String) -> String {
+    if self.hasPrefix(prefix) {
+      return self.replacingOccurrences(of: prefix, with: "")
+    } else {
+      return self
+    }
+  }
+}
+
 /// A collection of descriptors that were read from a compiled .proto file
 class FileDescriptor {
   var messageDescriptors : [MessageDescriptor] = []
+  var name : String = ""
+  var package : String = ""
+  var syntax : String = ""
 
   // the base FileDescriptor is the FileDescriptor for FileDescriptor
   init() {
@@ -49,20 +62,31 @@ class FileDescriptor {
       let messageDescriptor = MessageDescriptor(message: field.message())
       messageDescriptors.append(messageDescriptor)
     }
+    message.forOneField("name") { (field) in
+      name = field.string()
+    }
+    message.forOneField("package") { (field) in
+      package = field.string()
+    }
+    message.forOneField("syntax") { (field) in
+      syntax = field.string()
+    }
   }
 
   // finds and returns a descriptor for a specified message
   func messageDescriptor(name: String) -> MessageDescriptor? {
+    // search message descriptors for the desired message
+    let messageName = name.stripPrefix("." + self.package + ".")
     for messageDescriptor in messageDescriptors {
-      if messageDescriptor.name == name {
+      if messageDescriptor.name == messageName {
         return messageDescriptor
       } else {
+        let messageName = messageName.stripPrefix(messageDescriptor.name + ".")
         for nestedMessageDescriptor in messageDescriptor.nestedTypes {
-          if nestedMessageDescriptor.name == name {
+          if nestedMessageDescriptor.name == messageName {
             return nestedMessageDescriptor
           }
         }
-
       }
     }
     return nil

+ 1 - 4
Packages/QuickProto/Sources/FileDescriptorSet.swift

@@ -69,11 +69,8 @@ public class FileDescriptorSet {
   }
 
   func messageDescriptor(name: String) -> MessageDescriptor? {
-    let parts = name.components(separatedBy: ".")
-    let messageName = parts.last!
-
     for fileDescriptor in fileDescriptors {
-      if let messageDescriptor = fileDescriptor.messageDescriptor(name:messageName) {
+      if let messageDescriptor = fileDescriptor.messageDescriptor(name:name) {
         return messageDescriptor
       }
     }

+ 13 - 3
Packages/QuickProto/Sources/MessageDescriptor.swift

@@ -37,19 +37,29 @@ public class MessageDescriptor {
   var name: String = ""
   var fieldDescriptors: [FieldDescriptor] = []
   var nestedTypes: [MessageDescriptor] = []
+  var optionMapEntry : Bool = false
 
-  init(message:Message) { // the message should be a DescriptorProto (descriptor.proto)
+  // creates a MessageDescriptor from a DescriptorProto (descriptor.proto)
+  init(message:Message) {
     if let field = message.oneField("name") {
       name = field.string()
     }
-    message.forEachField("field") {(field) in
+    message.forEachField("field") { (field) in
       let fieldDescriptor = FieldDescriptor(message:field.message())
       fieldDescriptors.append(fieldDescriptor)
     }
-    message.forEachField("nested_type") {(field) in
+    message.forEachField("nested_type") { (field) in
       let nestedType = MessageDescriptor(message:field.message())
       nestedTypes.append(nestedType)
     }
+    message.forEachField("options") { (field) in
+      let options = field.message()
+      options.forOneField("map_entry") { (field) in
+        if field.bool() {
+          optionMapEntry = true
+        }
+      }
+    }
   }
 
   init(description:[String:Any]) {