From 05e78b11528255488061296bdb7b4665e5e70997 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Tue, 30 Jul 2013 01:15:46 +0200 Subject: [PATCH] Moved CreateAssemblyModelFromFile utility methods from ClassBrowserPad to separate ModelFactoryExtensions class (as extension methods). --- .../Project/Dom/ModelFactoryExtensions.cs | 59 +++++++++++++++++++ .../Project/ICSharpCode.SharpDevelop.csproj | 1 + .../Dom/ClassBrowser/ClassBrowserPad.cs | 45 +------------- .../SharpDevelop/Dom/ClassBrowser/Commands.cs | 10 ++-- 4 files changed, 69 insertions(+), 46 deletions(-) create mode 100644 src/Main/Base/Project/Dom/ModelFactoryExtensions.cs diff --git a/src/Main/Base/Project/Dom/ModelFactoryExtensions.cs b/src/Main/Base/Project/Dom/ModelFactoryExtensions.cs new file mode 100644 index 0000000000..b62942cadb --- /dev/null +++ b/src/Main/Base/Project/Dom/ModelFactoryExtensions.cs @@ -0,0 +1,59 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Linq; +using System.IO; +using ICSharpCode.NRefactory; +using ICSharpCode.NRefactory.TypeSystem; + +namespace ICSharpCode.SharpDevelop.Dom +{ + public static class ModelFactoryExtensions + { + /// + /// Creates an from a file name. + /// + /// Model factory. + /// Assembly file name. + /// Created . + public static IAssemblyModel CreateAssemblyModelFromFile(this IModelFactory modelFactory, string fileName) + { + var loader = new CecilLoader(); + loader.IncludeInternalMembers = true; + loader.LazyLoad = true; + var assembly = loader.LoadAssemblyFile(fileName); + + IEntityModelContext context = new AssemblyEntityModelContext(assembly); + IAssemblyModel model = modelFactory.CreateAssemblyModel(context); + if (model is IUpdateableAssemblyModel) { + ((IUpdateableAssemblyModel)model).Update(EmptyList.Instance, assembly.TopLevelTypeDefinitions.ToList()); + ((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName; + } + return model; + } + + /// + /// Creates an from a file name and catches + /// errors by showing messages to user. + /// + /// Model factory. + /// Assembly file name. + /// + /// Created or null, + /// if model couldn't be created. + /// + public static IAssemblyModel SafelyCreateAssemblyModelFromFile(this IModelFactory modelFactory, string fileName) + { + try { + return modelFactory.CreateAssemblyModelFromFile(fileName); + } catch (BadImageFormatException) { + SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(fileName)); + } catch (FileNotFoundException) { + SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", fileName); + } + + return null; + } + } +} \ No newline at end of file diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 91a1577bd1..903be95510 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -114,6 +114,7 @@ + diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs index 1c536d2306..19194cdfc7 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs @@ -216,54 +216,15 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser SD.PropertyService.SetList(PersistedWorkspaceSetting, persistedWorkspaces); } - public static IAssemblyModel CreateAssemblyModelFromFile(string fileName) - { - try { - var loader = new CecilLoader(); - loader.IncludeInternalMembers = true; - loader.LazyLoad = true; - var assembly = loader.LoadAssemblyFile(fileName); - - IEntityModelContext context = new AssemblyEntityModelContext(assembly); - IAssemblyModel model = SD.GetRequiredService().CreateAssemblyModel(context); - if (model is IUpdateableAssemblyModel) { - ((IUpdateableAssemblyModel)model).Update(EmptyList.Instance, assembly.TopLevelTypeDefinitions.ToList()); - ((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName; - } - return model; - } catch (BadImageFormatException) { - SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(fileName)); - } catch (FileNotFoundException) { - SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", fileName); - } - - return null; - } - - static IAssemblyModel CreateAssemblyModelOrThrowException(string fileName) - { - var loader = new CecilLoader(); - loader.IncludeInternalMembers = true; - loader.LazyLoad = true; - var assembly = loader.LoadAssemblyFile(fileName); - - IEntityModelContext context = new AssemblyEntityModelContext(assembly); - IAssemblyModel model = SD.GetRequiredService().CreateAssemblyModel(context); - if (model is IUpdateableAssemblyModel) { - ((IUpdateableAssemblyModel)model).Update(EmptyList.Instance, assembly.TopLevelTypeDefinitions.ToList()); - ((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName; - } - return model; - } - static IAssemblyModel SafelyCreateAssemblyModelFromFile(string fileName) { + var modelFactory = SD.GetRequiredService(); try { - return CreateAssemblyModelOrThrowException(fileName); + return modelFactory.CreateAssemblyModelFromFile(fileName); } catch (Exception) { // Special AssemblyModel for unresolved file references IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName); - IAssemblyModel unresolvedModel = SD.GetRequiredService().CreateAssemblyModel(unresolvedContext); + IAssemblyModel unresolvedModel = modelFactory.CreateAssemblyModel(unresolvedContext); if (unresolvedModel is IUpdateableAssemblyModel) { ((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName; } diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs index 000d46a701..da857e22a2 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs @@ -16,14 +16,15 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser public override void Execute(object parameter) { var classBrowser = SD.GetService(); - if (classBrowser != null) { + var modelFactory = SD.GetService(); + if ((classBrowser != null) && (modelFactory != null)) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Assembly files (*.exe, *.dll)|*.exe;*.dll"; openFileDialog.CheckFileExists = true; openFileDialog.CheckPathExists = true; if (openFileDialog.ShowDialog() ?? false) { - IAssemblyModel assemblyModel = ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName); + IAssemblyModel assemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(openFileDialog.FileName); if (assemblyModel != null) classBrowser.AssemblyList.Assemblies.Add(assemblyModel); } @@ -39,12 +40,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser public override void Execute(object parameter) { var classBrowser = SD.GetService(); - if (classBrowser != null) { + var modelFactory = SD.GetService(); + if ((classBrowser != null) && (modelFactory != null)) { OpenFromGacDialog gacDialog = new OpenFromGacDialog(); if (gacDialog.ShowDialog() ?? false) { foreach (string assemblyFile in gacDialog.SelectedFileNames) { - IAssemblyModel assemblyModel = ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile); + IAssemblyModel assemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(assemblyFile); if (assemblyModel != null) classBrowser.AssemblyList.Assemblies.Add(assemblyModel); }