From 74af3970e7728b8fe79f572af9a82e752f05ae58 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Wed, 24 Jul 2013 00:59:25 +0200 Subject: [PATCH 01/20] Don't show context menu of usual AssemblyTreeNodes for DebuggerModuleTreeNodes. OpenFromGacDialog now using SD's default dialog style. --- .../Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs | 5 +++++ .../SharpDevelop/Dom/ClassBrowser/OpenFromGacDialog.xaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs index 8bfd17cf10..c64f58d09a 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs @@ -135,6 +135,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } } + public override void ShowContextMenu() + { + // Don't show context menu as for usual AssemblyTreeNodes. + } + static IAssemblyModel CreateAssemblyModel(Module module) { // references?? diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/OpenFromGacDialog.xaml b/src/Main/SharpDevelop/Dom/ClassBrowser/OpenFromGacDialog.xaml index ae78f0982f..44117a28f2 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/OpenFromGacDialog.xaml +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/OpenFromGacDialog.xaml @@ -4,7 +4,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:core="http://icsharpcode.net/sharpdevelop/core" Title="Open From GAC" - Style="{DynamicResource DialogWindow}" + Style = "{x:Static core:GlobalStyles.DialogWindowStyle}" WindowStartupLocation="CenterOwner" ResizeMode="CanResizeWithGrip" MinWidth="200" From 50a5cb4274856fa9d4d54d99eac858c6ed5c03c7 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Wed, 24 Jul 2013 01:35:01 +0200 Subject: [PATCH 02/20] Added sub-node with error text for unresolved assemblies in ClassBrowser. Such assemblies also don't produce an error message anymore when opening ClassBrowserPad. --- .../ClassBrowser/AssemblyLoadErrorTreeNode.cs | 27 ++++++++++ .../Dom/ClassBrowser/AssemblyTreeNode.cs | 11 ++++ .../Project/ICSharpCode.SharpDevelop.csproj | 1 + .../Dom/ClassBrowser/ClassBrowserPad.cs | 54 +++++++++---------- .../SharpDevelop/Dom/ClassBrowser/Commands.cs | 36 ++++++------- 5 files changed, 82 insertions(+), 47 deletions(-) create mode 100644 src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs diff --git a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs new file mode 100644 index 0000000000..97ce410a1f --- /dev/null +++ b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs @@ -0,0 +1,27 @@ +// 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.Collections.Generic; +using ICSharpCode.Core.Presentation; +using ICSharpCode.TreeView; + +namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser +{ + public class AssemblyLoadErrorTreeNode : SharpTreeNode + { + public override object Text { + get { + return "(Assembly not loadable)"; + } + } + + public override object Icon { + get { + return null; + } + } + } +} + + diff --git a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs index ff499c969f..3f91079d7a 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs @@ -36,6 +36,17 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser } } + protected override void LoadChildren() + { + Children.Clear(); + if (model.Context.IsValid) { + base.LoadChildren(); + } else { + // This assembly could not be loaded correctly, add sub-node with error text + Children.Add(new AssemblyLoadErrorTreeNode()); + } + } + public override object Text { get { return model.AssemblyName; diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index c787f8550f..91a1577bd1 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -84,6 +84,7 @@ + diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs index 891508f62b..0148056215 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs @@ -217,44 +217,42 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser } public static IAssemblyModel CreateAssemblyModelFromFile(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) { 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 CreateAssemblyModelFromFile(fileName); + } catch (Exception) { + // Special AssemblyModel for unresolved file references + IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName); + IAssemblyModel unresolvedModel = SD.GetRequiredService().CreateAssemblyModel(unresolvedContext); + if (unresolvedModel is IUpdateableAssemblyModel) { + ((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName; } - return model; - } catch (BadImageFormatException ex) { - SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(fileName)); - } catch (FileNotFoundException ex) { - SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", fileName); - } - - // AssemblyModel for unresolved file references - IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName); - IAssemblyModel unresolvedModel = SD.GetRequiredService().CreateAssemblyModel(unresolvedContext); - if (unresolvedModel is IUpdateableAssemblyModel) { - ((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName; + + return unresolvedModel; } - - return unresolvedModel; } void AppendAssemblyFileToList(string assemblyFile) { - IAssemblyModel assemblyModel = CreateAssemblyModelFromFile(assemblyFile); + IAssemblyModel assemblyModel = SafelyCreateAssemblyModelFromFile(assemblyFile); if (assemblyModel != null) { AssemblyList.Assemblies.Add(assemblyModel); - } else { - // TODO Throw exception? - } } diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs index 7496f03f0b..3e549efa4d 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs @@ -9,7 +9,7 @@ using Microsoft.Win32; namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser { /// - /// Description of OpenAssemblyFromFileCommand. + /// OpenAssemblyFromFileCommand. /// class OpenAssemblyFromFileCommand : SimpleCommand { @@ -23,14 +23,20 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser openFileDialog.CheckPathExists = true; if (openFileDialog.ShowDialog() ?? false) { - classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName)); + try { + classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName)); + } catch (BadImageFormatException) { + SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(openFileDialog.FileName)); + } catch (FileNotFoundException) { + SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", openFileDialog.FileName); + } } } } } /// - /// Description of OpenAssemblyFromGACCommand. + /// OpenAssemblyFromGACCommand. /// class OpenAssemblyFromGACCommand : SimpleCommand { @@ -42,7 +48,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser if (gacDialog.ShowDialog() ?? false) { foreach (string assemblyFile in gacDialog.SelectedFileNames) { - classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile)); + try { + classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile)); + } catch (BadImageFormatException) { + SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(assemblyFile)); + } catch (FileNotFoundException) { + SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", assemblyFile); + } } } } @@ -50,7 +62,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser } /// - /// Description of RemoveAssemblyCommand. + /// RemoveAssemblyCommand. /// class RemoveAssemblyCommand : SimpleCommand { @@ -68,18 +80,4 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser } } } - - /// - /// Description of RemoveAssemblyCommand. - /// - class ClassBrowserCollapseAllCommand : SimpleCommand - { - public override void Execute(object parameter) - { -// var classBrowser = SD.GetService() as ClassBrowserPad; -// if (classBrowser != null) { -// classBrowser.TreeView -// } - } - } } From 3c4c5a34226cabe8dfd91039a8febe6ec44b2d94 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Thu, 25 Jul 2013 21:47:18 +0200 Subject: [PATCH 03/20] Some refactoring in ClassBrowser. --- .../Dom/ClassBrowser/ClassBrowserPad.cs | 26 ++++++++++++++++++- .../SharpDevelop/Dom/ClassBrowser/Commands.cs | 20 +++++--------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs index 0148056215..1c536d2306 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs @@ -217,6 +217,30 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser } 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; @@ -235,7 +259,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser static IAssemblyModel SafelyCreateAssemblyModelFromFile(string fileName) { try { - return CreateAssemblyModelFromFile(fileName); + return CreateAssemblyModelOrThrowException(fileName); } catch (Exception) { // Special AssemblyModel for unresolved file references IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName); diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs index 3e549efa4d..000d46a701 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs @@ -23,13 +23,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser openFileDialog.CheckPathExists = true; if (openFileDialog.ShowDialog() ?? false) { - try { - classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName)); - } catch (BadImageFormatException) { - SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(openFileDialog.FileName)); - } catch (FileNotFoundException) { - SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", openFileDialog.FileName); - } + IAssemblyModel assemblyModel = ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName); + if (assemblyModel != null) + classBrowser.AssemblyList.Assemblies.Add(assemblyModel); } } } @@ -48,13 +44,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser if (gacDialog.ShowDialog() ?? false) { foreach (string assemblyFile in gacDialog.SelectedFileNames) { - try { - classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile)); - } catch (BadImageFormatException) { - SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(assemblyFile)); - } catch (FileNotFoundException) { - SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", assemblyFile); - } + IAssemblyModel assemblyModel = ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile); + if (assemblyModel != null) + classBrowser.AssemblyList.Assemblies.Add(assemblyModel); } } } From b60f7f66fe7f37518dd164ef39d94f24b18b2693 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Thu, 25 Jul 2013 22:13:26 +0200 Subject: [PATCH 04/20] Nested types in ClassBrowser. --- .../Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs index 7141734783..aaab2f62ac 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs @@ -3,10 +3,12 @@ using System; using System.Collections.Generic; +using System.Security.Policy; using ICSharpCode.Core.Presentation; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.Utils; using ICSharpCode.TreeView; +using ICSharpCode.SharpDevelop.Dom; namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser { @@ -48,7 +50,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser protected override IModelCollection ModelChildren { get { - return definition.Members; + return definition.NestedTypes.Concat(definition.Members); } } From 05e78b11528255488061296bdb7b4665e5e70997 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Tue, 30 Jul 2013 01:15:46 +0200 Subject: [PATCH 05/20] 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); } From 8a9e28ac6773f95120763cbe4bd5f45d21497930 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Wed, 31 Jul 2013 00:30:04 +0200 Subject: [PATCH 06/20] Better synchronization of checkboxes in "Insert Ctor" snippet dialog. --- .../Src/Refactoring/PropertyOrFieldWrapper.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/PropertyOrFieldWrapper.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/PropertyOrFieldWrapper.cs index 011896a1f1..d19a36417e 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/PropertyOrFieldWrapper.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/PropertyOrFieldWrapper.cs @@ -45,6 +45,11 @@ namespace CSharpBinding.Refactoring } set { isIncluded = value; + if (!value) { + // Remove other flags, too + AddCheckForNull = false; + AddRangeCheck = false; + } OnPropertyChanged("IsIncluded"); } } @@ -90,6 +95,11 @@ namespace CSharpBinding.Refactoring get { return addCheckForNull; } set { addCheckForNull = value; + if (value) { + // Assure that IsIncluded is set to true as well + IsIncluded = true; + } + OnPropertyChanged("AddCheckForNull"); } } @@ -98,6 +108,11 @@ namespace CSharpBinding.Refactoring get { return addRangeCheck; } set { addRangeCheck = value; + if (value) { + // Assure that IsIncluded is set to true as well + IsIncluded = true; + } + OnPropertyChanged("AddRangeCheck"); } } From 5dd62946cccfe4b1450a258d616a16c77e25cc8c Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 3 Aug 2013 01:18:39 +0200 Subject: [PATCH 07/20] Introduced "Convert interface to abstract class" context action. --- .../CSharpBinding/Project/CSharpBinding.addin | 1 + .../Project/CSharpBinding.csproj | 1 + ...rtInterfaceToAbstractClassContextAction.cs | 62 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/ConvertInterfaceToAbstractClassContextAction.cs diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin index e36e7e3fc1..5bedde41cd 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin @@ -317,6 +317,7 @@ + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj index 472481f796..0cfab3c3ae 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj @@ -88,6 +88,7 @@ + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/ConvertInterfaceToAbstractClassContextAction.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/ConvertInterfaceToAbstractClassContextAction.cs new file mode 100644 index 0000000000..1e630de303 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/ConvertInterfaceToAbstractClassContextAction.cs @@ -0,0 +1,62 @@ +// 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.Threading; +using System.Threading.Tasks; +using ICSharpCode.NRefactory.CSharp; +using ICSharpCode.NRefactory.CSharp.Refactoring; +using ICSharpCode.SharpDevelop.Refactoring; +using CSharpBinding.Parser; + +namespace CSharpBinding.Refactoring +{ + [ContextAction("Convert interface to abstract class", Description = "Converts an interface to a class with abstract members.")] + public class ConvertInterfaceToAbstractClassContextAction : ContextAction + { + public override async Task IsAvailableAsync(EditorRefactoringContext context, CancellationToken cancellationToken) + { + SyntaxTree st = await context.GetSyntaxTreeAsync().ConfigureAwait(false); + Identifier identifier = (Identifier) st.GetNodeAt(context.CaretLocation, node => node.Role == Roles.Identifier); + if (identifier == null) + return false; + TypeDeclaration typeDeclaration = identifier.Parent as TypeDeclaration; + return (typeDeclaration != null) && (typeDeclaration.ClassType == ClassType.Interface); + } + + public override void Execute(EditorRefactoringContext context) + { + CSharpFullParseInformation parseInformation = context.GetParseInformation() as CSharpFullParseInformation; + if (parseInformation != null) { + SyntaxTree st = parseInformation.SyntaxTree; + Identifier identifier = (Identifier) st.GetNodeAt(context.CaretLocation, node => node.Role == Roles.Identifier); + if (identifier == null) + return; + TypeDeclaration interfaceTypeDeclaration = identifier.Parent as TypeDeclaration; + if (interfaceTypeDeclaration != null) { + // Generate abstract class from interface and abstract members from interface members + TypeDeclaration abstractClassTypeNode = (TypeDeclaration) interfaceTypeDeclaration.Clone(); + abstractClassTypeNode.ClassType = ClassType.Class; + abstractClassTypeNode.Modifiers |= Modifiers.Abstract; + foreach (var entity in abstractClassTypeNode.Children.OfType()) { + entity.Modifiers |= Modifiers.Abstract | Modifiers.Public; + } + + var refactoringContext = SDRefactoringContext.Create(context.Editor, CancellationToken.None); + using (Script script = refactoringContext.StartScript()) { + // Replace interface node with node of abstract class + script.Replace(interfaceTypeDeclaration, abstractClassTypeNode); + } + } + } + } + + public override string DisplayName + { + get { + return "Convert interface to abstract class"; + } + } + } +} From cc99d468054fff89d641a3585cf1da28ab5c2abf Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 3 Aug 2013 01:49:13 +0200 Subject: [PATCH 08/20] Added text of error messages shown by ModelFactoryExtensions to resources, updated resource files. --- data/resources/StringResources.it.resx | 66 +++++++++++++++++++ data/resources/StringResources.nl.resx | 6 ++ data/resources/StringResources.resx | 6 ++ .../Project/Dom/ModelFactoryExtensions.cs | 4 +- 4 files changed, 80 insertions(+), 2 deletions(-) diff --git a/data/resources/StringResources.it.resx b/data/resources/StringResources.it.resx index 40dd09b7fb..f15ed87494 100644 --- a/data/resources/StringResources.it.resx +++ b/data/resources/StringResources.it.resx @@ -229,6 +229,69 @@ Scaricare un componente da internet, poi cliccare 'Install AddIn' e selezionare Formato file sconosciuto: + + Installa da archivio... + + + Repository: + + + Cerca: + + + Creato da: + + + Dipendenze: + + + Nome file: + + + Versione installata: + + + Più informazioni + + + Nuova versione: + + + Versione: + + + Mostra i Termini di Licenza + + + &Accetto + + + &Rifiuto + + + Aggiungi + + + Nome: + + + Elimina + + + Sorgente: + + + Repositories + + + Disponibile + + + Installato + + + Aggiornamenti + Questo file contiene dei ritorni a capo inconsistenti. @@ -5760,6 +5823,9 @@ Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension< Copia nome risorsa + + Modifica descrizione + &Rinomina diff --git a/data/resources/StringResources.nl.resx b/data/resources/StringResources.nl.resx index 04ca250840..24dd8cdf57 100644 --- a/data/resources/StringResources.nl.resx +++ b/data/resources/StringResources.nl.resx @@ -358,6 +358,12 @@ Deze stoppen met werken na verwijderen van deze AddIn. SharpDevelop AddIns|*.sdaddin;*.addin|Alle bestanden|*.* + + Hier klikken om de updates te zien. + + + Er zijn updates voor SharpDevelop beschikbaar. + Beschikbaar diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index 29396b9650..b2468ce9ed 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -3910,6 +3910,12 @@ has been changed externally. Do you want to reload it? Reverse Incremental Search: + + {0} is not a valid .NET assembly. + + + {0} is not accessible or doesn't exist anymore. + Error loading code-completion information for ${Assembly} from ${Filename}: diff --git a/src/Main/Base/Project/Dom/ModelFactoryExtensions.cs b/src/Main/Base/Project/Dom/ModelFactoryExtensions.cs index b62942cadb..c96ea218dc 100644 --- a/src/Main/Base/Project/Dom/ModelFactoryExtensions.cs +++ b/src/Main/Base/Project/Dom/ModelFactoryExtensions.cs @@ -48,9 +48,9 @@ namespace ICSharpCode.SharpDevelop.Dom try { return modelFactory.CreateAssemblyModelFromFile(fileName); } catch (BadImageFormatException) { - SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(fileName)); + SD.MessageService.ShowWarningFormatted("${res:ICSharpCode.SharpDevelop.Dom.AssemblyInvalid}", Path.GetFileName(fileName)); } catch (FileNotFoundException) { - SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", fileName); + SD.MessageService.ShowWarningFormatted("${res:ICSharpCode.SharpDevelop.Dom.AssemblyNotAccessible}", fileName); } return null; From db1ecf4a516ac0b539efcf2ecf71159a895876e0 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Wed, 7 Aug 2013 00:49:28 +0200 Subject: [PATCH 09/20] When list of AddIns (installed or in repository) gets updated, view is trying to restore the previous item selection. --- .../Project/Src/View/AddInsView.xaml | 8 +++++++- .../ViewModel/AddInPackageViewModelBase.cs | 6 ++++++ .../Src/ViewModel/AddInsViewModelBase.cs | 20 +++++++++++++++++++ .../Src/ViewModel/NuGetAddInsViewModelBase.cs | 2 +- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml b/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml index 9acd6404d9..5ba8aafd61 100644 --- a/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml +++ b/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml @@ -119,6 +119,10 @@ --> + + @@ -491,7 +495,7 @@ -