Make generated type names unique.
authorAtsushi Eno <atsushi@ximian.com>
Thu, 21 Oct 2010 10:06:56 +0000 (19:06 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Thu, 21 Oct 2010 10:06:56 +0000 (19:06 +0900)
mcs/class/System.ServiceModel/System.ServiceModel.Description/ServiceContractGenerator.cs

index 3168534dbeb28bfce37fbe4c94d164af5dfde60c..ef24544793ce179c23df88c79195868797200f23 100644 (file)
@@ -51,6 +51,7 @@ namespace System.ServiceModel.Description
        {
                CodeCompileUnit ccu;
                ConfigurationType config;
+               CodeIdentifiers identifiers = new CodeIdentifiers ();
                Collection<MetadataConversionError> errors
                        = new Collection<MetadataConversionError> ();
                Dictionary<string,string> nsmappings
@@ -194,6 +195,7 @@ namespace System.ServiceModel.Description
                        string name = cd.Name + "Client";
                        if (name [0] == 'I')
                                name = name.Substring (1);
+                       name = identifiers.AddUnique (name, null);
                        CodeTypeDeclaration type = GetTypeDeclaration (cns, name);
                        if (type != null)
                                return; // already imported
@@ -276,6 +278,7 @@ namespace System.ServiceModel.Description
                void GenerateChannelInterface (ContractDescription cd, CodeNamespace cns)
                {
                        string name = cd.Name + "Channel";
+                       name = identifiers.AddUnique (name, null);
                        CodeTypeDeclaration type = GetTypeDeclaration (cns, name);
                        if (type != null)
                                return;
@@ -298,7 +301,7 @@ namespace System.ServiceModel.Description
                        type.TypeAttributes = TypeAttributes.Interface;
                        type.TypeAttributes |= TypeAttributes.Public;
                        cns.Types.Add (type);
-                       type.Name = cd.Name;
+                       type.Name = identifiers.AddUnique (cd.Name, null);
                        CodeAttributeDeclaration ad = 
                                new CodeAttributeDeclaration (
                                        new CodeTypeReference (
@@ -585,9 +588,10 @@ namespace System.ServiceModel.Description
 
                        AddMethodParam (cm, typeof (object), "state");
 
+                       string argsname = identifiers.AddUnique (od.Name + "CompletedEventArgs", null);
                        var iaargs = new CodeTypeReference ("InvokeAsyncCompletedEventArgs"); // avoid messy System.Type instance for generic nested type :|
                        var iaref = new CodeVariableReferenceExpression ("args");
-                       var methodEventArgs = new CodeObjectCreateExpression (new CodeTypeReference (od.Name + "CompletedEventArgs"),
+                       var methodEventArgs = new CodeObjectCreateExpression (new CodeTypeReference (argsname),
                                new CodePropertyReferenceExpression (iaref, "Results"),
                                new CodePropertyReferenceExpression (iaref, "Error"),
                                new CodePropertyReferenceExpression (iaref, "Cancelled"),
@@ -604,7 +608,7 @@ namespace System.ServiceModel.Description
                        type.Members.Add (new CodeMemberField (new CodeTypeReference (typeof (SendOrPostCallback)), "on" + od.Name + "CompletedDelegate"));
 
                        // XxxCompletedEventArgs class
-                       var argsType = new CodeTypeDeclaration (od.Name + "CompletedEventArgs");
+                       var argsType = new CodeTypeDeclaration (argsname);
                        argsType.BaseTypes.Add (new CodeTypeReference (typeof (AsyncCompletedEventArgs)));
                        cns.Types.Add (argsType);