From 4927a6edd93022346cf2b6c8f3d9d9d5f5d6c9c7 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 17 Apr 2012 21:39:40 +0100 Subject: [PATCH] Use project's root namespace when generating service reference proxy classes. --- .../AddServiceReferenceViewModel.cs | 7 +-- .../IProjectWithServiceReferences.cs | 1 + .../ProjectWithServiceReferences.cs | 9 +++ .../ServiceReferenceGenerator.cs | 5 +- .../ServiceReferenceGeneratorOptions.cs | 16 +++++- .../ProjectWithServiceReferencesTests.cs | 18 ++++++ .../ServiceReferenceGeneratorTests.cs | 55 +++++++++++++------ 7 files changed, 83 insertions(+), 28 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs index d614655282..e49ec09e1a 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs @@ -29,7 +29,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference string waitMessage = "Please wait...."; string defaultNameSpace; string serviceDescriptionMessage; - string namespacePrefix = String.Empty; ObservableCollection twoValues; @@ -153,9 +152,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference /// string GetDefaultNamespace() { - if (namespacePrefix.Length > 0 && discoveryUri != null) { - return String.Concat(namespacePrefix, ".", discoveryUri.Host); - } else if (discoveryUri != null) { + if (discoveryUri != null) { return discoveryUri.Host; } return String.Empty; @@ -295,7 +292,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference return; try { - serviceGenerator.Options.Namespace = defaultNameSpace; + serviceGenerator.Options.ServiceName = defaultNameSpace; serviceGenerator.Options.Url = uri.ToString(); serviceGenerator.AddServiceReference(); new RefreshProjectBrowser().Run(); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs index f5134f3f10..adfdaff955 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs @@ -11,6 +11,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { string ServiceReferencesFolder { get; } string Language { get; } + string RootNamespace { get; } ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName); ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs index 26835a5fc6..78dec9ce42 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs @@ -41,6 +41,15 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference get { return project.Language; } } + public string RootNamespace { + get { + if (project.RootNamespace != null) { + return project.RootNamespace; + } + return String.Empty; + } + } + public ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName) { return new ServiceReferenceFileName(ServiceReferencesFolder, serviceReferenceName); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs index d5ff5f84ae..2ac5a1942e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs @@ -65,7 +65,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference ServiceReferenceFileName GenerateProxyFile() { - ServiceReferenceFileName referenceFileName = project.GetServiceReferenceFileName(fileGenerator.Options.Namespace); + ServiceReferenceFileName referenceFileName = project.GetServiceReferenceFileName(fileGenerator.Options.ServiceName); CreateFolderForFileIfFolderMissing(referenceFileName.Path); Options.OutputFileName = referenceFileName.Path; @@ -73,6 +73,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference Options.NoAppConfig = false; Options.MergeAppConfig = project.HasAppConfigFile(); Options.MapProjectLanguage(project.Language); + Options.GenerateNamespace(project.RootNamespace); Options.AddProjectReferencesIfUsingTypesFromProjectReferences(project.GetReferences()); fileGenerator.GenerateProxyFile(); @@ -81,7 +82,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference ServiceReferenceMapFileName CreateServiceReferenceMapFile() { - ServiceReferenceMapFileName mapFileName = project.GetServiceReferenceMapFileName(fileGenerator.Options.Namespace); + ServiceReferenceMapFileName mapFileName = project.GetServiceReferenceMapFileName(fileGenerator.Options.ServiceName); var mapFile = new ServiceReferenceMapFile(mapFileName); fileGenerator.GenerateServiceReferenceMapFile(mapFile); return mapFileName; diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGeneratorOptions.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGeneratorOptions.cs index e1f240b4d1..77ab44cef1 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGeneratorOptions.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGeneratorOptions.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference this.AppConfigFileName = String.Empty; this.MergeAppConfig = false; this.OutputFileName = String.Empty; - this.Namespace = String.Empty; + this.ServiceName = String.Empty; this.Language = "CS"; this.NoAppConfig = true; this.UseTypesInProjectReferences = true; @@ -33,6 +33,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference this.DictionaryCollectionType = DictionaryCollectionTypes.Dictionary; } + public string ServiceName { get; set; } public string Namespace { get; set; } public string OutputFileName { get; set; } public string Url { get; set; } @@ -47,7 +48,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public bool UseTypesInSpecifiedAssemblies { get; set; } public CollectionTypes ArrayCollectionType { get; set; } public DictionaryCollectionTypes DictionaryCollectionType { get; set; } - + public void MapProjectLanguage(string language) { if (language == "VBNet") { @@ -64,7 +65,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public ServiceReferenceGeneratorOptions Clone() { return new ServiceReferenceGeneratorOptions(this.assemblies) { - Namespace = this.Namespace, + ServiceName = this.ServiceName, OutputFileName = this.OutputFileName, Url = this.Url, Language = this.Language, @@ -154,5 +155,14 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } } } + + public void GenerateNamespace(string rootNamespace) + { + if (String.IsNullOrEmpty(rootNamespace)) { + Namespace = ServiceName; + } else { + Namespace = rootNamespace + "." + ServiceName; + } + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index d50fedb752..de3917af7c 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -299,6 +299,24 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences Assert.AreEqual("VBNet", project.Language); } + [Test] + public void RootNamespace_MSBuildProjectHasRootNamespace_RootNamespaceReturned() + { + CreateProjectWithMSBuildProject(); + msbuildProject.RootNamespace = "Test"; + + Assert.AreEqual("Test", project.RootNamespace); + } + + [Test] + public void RootNamespace_MSBuildProjectHasNullRootNamespace_EmptyStringReturned() + { + CreateProjectWithMSBuildProject(); + msbuildProject.Name = null; + + Assert.AreEqual(String.Empty, project.RootNamespace); + } + [Test] public void AddAppConfigFile_ProjectHasNoAppConfig_ProjectItemAddedToProjectForAppConfig() { diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs index e9a5fbdc83..e3fc6565c0 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs @@ -39,6 +39,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences generator = new ServiceReferenceGenerator(fakeProject, fileGenerator, fakeFileSystem); } + void SetProjectRootNamespace(string rootNamespace) + { + fakeProject.Stub(p => p.RootNamespace).Return(rootNamespace); + } + void SetServiceReferenceFileName(string serviceReferenceName, ServiceReferenceFileName fileName) { fakeProject.Stub(p => p.GetServiceReferenceFileName(serviceReferenceName)).Return(fileName); @@ -134,7 +139,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); AddMapFileNameForServiceName("MyServiceRef"); - generator.Options.Namespace = "MyServiceRef"; + generator.Options.ServiceName = "MyServiceRef"; generator.AddServiceReference(); @@ -147,7 +152,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); AddMapFileNameForServiceName("MyServiceRef"); - generator.Options.Namespace = "MyServiceRef"; + generator.Options.ServiceName = "MyServiceRef"; generator.AddServiceReference(); string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; @@ -161,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyService1"); AddMapFileNameForServiceName("MyService1"); - generator.Options.Namespace = "MyService1"; + generator.Options.ServiceName = "MyService1"; generator.AddServiceReference(); @@ -177,7 +182,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences ServiceReferenceFileName expectedProxyFileName = AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); AddMapFileNameForServiceName("MyServiceRef"); - generator.Options.Namespace = "MyServiceRef"; + generator.Options.ServiceName = "MyServiceRef"; generator.AddServiceReference(); @@ -190,7 +195,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyServiceRef"); AddMapFileNameForServiceName("MyServiceRef"); - generator.Options.Namespace = "MyServiceRef"; + generator.Options.ServiceName = "MyServiceRef"; generator.AddServiceReference(); @@ -203,7 +208,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); - generator.Options.Namespace = "MyServiceRef"; + generator.Options.ServiceName = "MyServiceRef"; generator.AddServiceReference(); @@ -221,7 +226,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences AddProxyFileNameForServiceName("MyServiceRef"); ServiceReferenceMapFileName expectedMapFileName = AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); - generator.Options.Namespace = "MyServiceRef"; + generator.Options.ServiceName = "MyServiceRef"; generator.AddServiceReference(); @@ -234,7 +239,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; generator.AddServiceReference(); @@ -247,7 +252,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; fakeProject .Stub(p => p.Save()) @@ -262,9 +267,23 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateGenerator(); AddProxyFileNameForServiceName("MyServiceRef"); - ServiceReferenceMapFileName expectedMapFileName = - AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); - generator.Options.Namespace = "MyServiceRef"; + AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + generator.Options.ServiceName = "MyServiceRef"; + SetProjectRootNamespace("Test"); + + generator.AddServiceReference(); + + Assert.AreEqual("Test.MyServiceRef", fakeProxyGenerator.Options.Namespace); + } + + [Test] + public void AddServiceReference_ProjectHasNoRootNamespace_NamespaceSetOnProxyGeneratorMatchesServiceName() + { + CreateGenerator(); + AddProxyFileNameForServiceName("MyServiceRef"); + AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + generator.Options.ServiceName = "MyServiceRef"; + SetProjectRootNamespace(String.Empty); generator.AddServiceReference(); @@ -277,7 +296,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; UseCSharpProject(); generator.AddServiceReference(); @@ -291,7 +310,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; UseVisualBasicProject(); generator.AddServiceReference(); @@ -305,7 +324,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; UseVisualBasicProject(); string expectedAppConfigFileName = @"d:\projects\MyProject\app.config"; SetProjectAppConfigFileName(expectedAppConfigFileName); @@ -325,7 +344,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; UseVisualBasicProject(); string expectedAppConfigFileName = @"d:\projects\MyProject\app.config"; SetProjectAppConfigFileName(expectedAppConfigFileName); @@ -345,7 +364,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; generator.Options.UseTypesInProjectReferences = true; AddReferenceToProject("System.Windows.Forms"); @@ -367,7 +386,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); AddProxyFileNameForServiceName("MyService"); AddMapFileNameForServiceName("MyService"); - generator.Options.Namespace = "MyService"; + generator.Options.ServiceName = "MyService"; generator.Options.UseTypesInProjectReferences = false; AddReferenceToProject("System.Windows.Forms");