From 05e78b11528255488061296bdb7b4665e5e70997 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Tue, 30 Jul 2013 01:15:46 +0200 Subject: [PATCH 1/7] 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 2/7] 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 3/7] 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 4/7] 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 5/7] 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 @@ -