From 27bfcc5e1a7a3aacd828475c1996e114e34055d2 Mon Sep 17 00:00:00 2001 From: csharptest Date: Thu, 2 Jun 2011 12:04:06 -0500 Subject: Slight refactoring of Extensions to support lookup by name, added compatibility tests for text and binary formats. --- src/ProtocolBuffers/ExtensionRegistry.cs | 57 +++++++++++--------------------- 1 file changed, 19 insertions(+), 38 deletions(-) (limited to 'src/ProtocolBuffers/ExtensionRegistry.cs') diff --git a/src/ProtocolBuffers/ExtensionRegistry.cs b/src/ProtocolBuffers/ExtensionRegistry.cs index 60f2633b..98f2fb4d 100644 --- a/src/ProtocolBuffers/ExtensionRegistry.cs +++ b/src/ProtocolBuffers/ExtensionRegistry.cs @@ -93,53 +93,27 @@ namespace Google.ProtocolBuffers /// public sealed partial class ExtensionRegistry { -#if !LITE - private static readonly ExtensionRegistry empty = new ExtensionRegistry( - new Dictionary(), - new Dictionary(), - true); - - private readonly IDictionary extensionsByName; - - private ExtensionRegistry(IDictionary extensionsByName, - IDictionary extensionsByNumber, - bool readOnly) - : this(extensionsByNumber, readOnly) - { - this.extensionsByName = extensionsByName; - } - - /// - /// Construct a new, empty instance. - /// - public static ExtensionRegistry CreateInstance() - { - return new ExtensionRegistry(new Dictionary(), - new Dictionary(), false); - } - - public ExtensionRegistry AsReadOnly() - { - return new ExtensionRegistry(extensionsByName, extensionsByNumber, true); - } -#endif - /// /// Finds an extension by fully-qualified field name, in the /// proto namespace, i.e. result.Descriptor.FullName will match /// if a match is found. A null /// reference is returned if the extension can't be found. /// + [Obsolete("Please use the FindByName method instead.", true)] public ExtensionInfo this[string fullName] { get { - ExtensionInfo ret; - extensionsByName.TryGetValue(fullName, out ret); - return ret; + foreach (IGeneratedExtensionLite ext in extensionsByNumber.Values) + { + if (StringComparer.Ordinal.Equals(ext.Descriptor.FullName, fullName)) + return ext as ExtensionInfo; + } + return null; } } +#if !LITE /// /// Finds an extension by containing type and field number. /// A null reference is returned if the extension can't be found. @@ -154,6 +128,12 @@ namespace Google.ProtocolBuffers } } + public ExtensionInfo FindByName(MessageDescriptor containingType, string fieldName) + { + return FindExtensionByName(containingType, fieldName) as ExtensionInfo; + } +#endif + /// /// Add an extension from a generated file to the registry. /// @@ -210,9 +190,8 @@ namespace Google.ProtocolBuffers + "regular (non-extension) field."); } - extensionsByName[extension.Descriptor.FullName] = extension; - extensionsByNumber[new ExtensionIntPair(extension.Descriptor.ContainingType, - extension.Descriptor.FieldNumber)] = extension; + IGeneratedExtensionLite liteExtension = extension; + Add(liteExtension); FieldDescriptor field = extension.Descriptor; if (field.ContainingType.Options.MessageSetWireFormat @@ -223,7 +202,9 @@ namespace Google.ProtocolBuffers // This is an extension of a MessageSet type defined within the extension // type's own scope. For backwards-compatibility, allow it to be looked // up by type name. - extensionsByName[field.MessageType.FullName] = extension; + Dictionary map; + if (extensionsByName.TryGetValue(liteExtension.ContainingType, out map)) + map[field.MessageType.FullName] = extension; } } } -- cgit v1.2.3