Browse Source

Merge branch 'newNR' of github.com:icsharpcode/SharpDevelop into newNRILSpyDebugger

newNRILSpyDebugger
Siegfried Pammer 12 years ago
parent
commit
9ce217dc55
  1. 66
      data/resources/StringResources.it.resx
  2. 6
      data/resources/StringResources.nl.resx
  3. 6
      data/resources/StringResources.resx
  4. 1
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
  5. 1
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
  6. 62
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/ConvertInterfaceToAbstractClassContextAction.cs
  7. 15
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/PropertyOrFieldWrapper.cs
  8. 11
      src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin
  9. 32
      src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs
  10. 8
      src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml
  11. 6
      src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInPackageViewModelBase.cs
  12. 20
      src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInsViewModelBase.cs
  13. 2
      src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/NuGetAddInsViewModelBase.cs
  14. 59
      src/Main/Base/Project/Dom/ModelFactoryExtensions.cs
  15. 9
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  16. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  17. 45
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
  18. 35
      src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

66
data/resources/StringResources.it.resx

@ -229,6 +229,69 @@ Scaricare un componente da internet, poi cliccare 'Install AddIn' e selezionare
<data name="AddInManager.UnknownFileFormat" xml:space="preserve"> <data name="AddInManager.UnknownFileFormat" xml:space="preserve">
<value>Formato file sconosciuto:</value> <value>Formato file sconosciuto:</value>
</data> </data>
<data name="AddInManager2.AddInsView.InstallFromArchive" xml:space="preserve">
<value>Installa da archivio...</value>
</data>
<data name="AddInManager2.AddInsView.Repository" xml:space="preserve">
<value>Repository:</value>
</data>
<data name="AddInManager2.AddInsView.Search" xml:space="preserve">
<value>Cerca:</value>
</data>
<data name="AddInManager2.Details.CreatedBy" xml:space="preserve">
<value>Creato da:</value>
</data>
<data name="AddInManager2.Details.Dependencies" xml:space="preserve">
<value>Dipendenze:</value>
</data>
<data name="AddInManager2.Details.FileName" xml:space="preserve">
<value>Nome file:</value>
</data>
<data name="AddInManager2.Details.InstalledVersion" xml:space="preserve">
<value>Versione installata:</value>
</data>
<data name="AddInManager2.Details.MoreInformation" xml:space="preserve">
<value>Più informazioni</value>
</data>
<data name="AddInManager2.Details.NewVersion" xml:space="preserve">
<value>Nuova versione:</value>
</data>
<data name="AddInManager2.Details.Version" xml:space="preserve">
<value>Versione:</value>
</data>
<data name="AddInManager2.Details.ViewLicenseTerms" xml:space="preserve">
<value>Mostra i Termini di Licenza</value>
</data>
<data name="AddInManager2.LicenseAcceptance.AcceptButton" xml:space="preserve">
<value>&amp;Accetto</value>
</data>
<data name="AddInManager2.LicenseAcceptance.DeclineButton" xml:space="preserve">
<value>&amp;Rifiuto</value>
</data>
<data name="AddInManager2.OptionPanel.Add" xml:space="preserve">
<value>Aggiungi</value>
</data>
<data name="AddInManager2.OptionPanel.Name" xml:space="preserve">
<value>Nome:</value>
</data>
<data name="AddInManager2.OptionPanel.Remove" xml:space="preserve">
<value>Elimina</value>
</data>
<data name="AddInManager2.OptionPanel.Source" xml:space="preserve">
<value>Sorgente:</value>
</data>
<data name="AddInManager2.OptionPanel.Tree.Repositories" xml:space="preserve">
<value>Repositories</value>
</data>
<data name="AddInManager2.Views.Available" xml:space="preserve">
<value>Disponibile</value>
</data>
<data name="AddInManager2.Views.Installed" xml:space="preserve">
<value>Installato</value>
</data>
<data name="AddInManager2.Views.Updates" xml:space="preserve">
<value>Aggiornamenti</value>
</data>
<data name="AddIns.AvalonEdit.InconsistentNewlines.Description" xml:space="preserve"> <data name="AddIns.AvalonEdit.InconsistentNewlines.Description" xml:space="preserve">
<value>Questo file contiene dei ritorni a capo inconsistenti.</value> <value>Questo file contiene dei ritorni a capo inconsistenti.</value>
</data> </data>
@ -5760,6 +5823,9 @@ Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension<
<data name="ResourceEditor.ResourceEdit.ContextMenu.CopyResourceName" xml:space="preserve"> <data name="ResourceEditor.ResourceEdit.ContextMenu.CopyResourceName" xml:space="preserve">
<value>Copia nome risorsa</value> <value>Copia nome risorsa</value>
</data> </data>
<data name="ResourceEditor.ResourceEdit.ContextMenu.EditComment" xml:space="preserve">
<value>Modifica descrizione</value>
</data>
<data name="ResourceEditor.ResourceEdit.ContextMenu.Rename" xml:space="preserve"> <data name="ResourceEditor.ResourceEdit.ContextMenu.Rename" xml:space="preserve">
<value>&amp;Rinomina</value> <value>&amp;Rinomina</value>
</data> </data>

6
data/resources/StringResources.nl.resx

@ -358,6 +358,12 @@ Deze stoppen met werken na verwijderen van deze AddIn.</value>
<data name="AddInManager2.SDAddInFileFilter" xml:space="preserve"> <data name="AddInManager2.SDAddInFileFilter" xml:space="preserve">
<value>SharpDevelop AddIns|*.sdaddin;*.addin|Alle bestanden|*.*</value> <value>SharpDevelop AddIns|*.sdaddin;*.addin|Alle bestanden|*.*</value>
</data> </data>
<data name="AddInManager2.UpdateNotifier.BubbleText" xml:space="preserve">
<value>Hier klikken om de updates te zien.</value>
</data>
<data name="AddInManager2.UpdateNotifier.BubbleTitle" xml:space="preserve">
<value>Er zijn updates voor SharpDevelop beschikbaar.</value>
</data>
<data name="AddInManager2.Views.Available" xml:space="preserve"> <data name="AddInManager2.Views.Available" xml:space="preserve">
<value>Beschikbaar</value> <value>Beschikbaar</value>
</data> </data>

6
data/resources/StringResources.resx

@ -3910,6 +3910,12 @@ has been changed externally. Do you want to reload it?</value>
<data name="ICSharpCode.SharpDevelop.DefaultEditor.IncrementalSearch.ReverseSearchStatusBarMessage" xml:space="preserve"> <data name="ICSharpCode.SharpDevelop.DefaultEditor.IncrementalSearch.ReverseSearchStatusBarMessage" xml:space="preserve">
<value>Reverse Incremental Search:</value> <value>Reverse Incremental Search:</value>
</data> </data>
<data name="ICSharpCode.SharpDevelop.Dom.AssemblyInvalid" xml:space="preserve">
<value>{0} is not a valid .NET assembly.</value>
</data>
<data name="ICSharpCode.SharpDevelop.Dom.AssemblyNotAccessible" xml:space="preserve">
<value>{0} is not accessible or doesn't exist anymore.</value>
</data>
<data name="ICSharpCode.SharpDevelop.ErrorLoadingCodeCompletionInformation" xml:space="preserve"> <data name="ICSharpCode.SharpDevelop.ErrorLoadingCodeCompletionInformation" xml:space="preserve">
<value>Error loading code-completion information for ${Assembly} from ${Filename}:</value> <value>Error loading code-completion information for ${Assembly} from ${Filename}:</value>
</data> </data>

1
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin

@ -317,6 +317,7 @@
<Class class="CSharpBinding.Refactoring.MoveTypeToFileContextAction" /> <Class class="CSharpBinding.Refactoring.MoveTypeToFileContextAction" />
<Class class="CSharpBinding.Refactoring.RenameFileToMatchTypeNameContextAction" /> <Class class="CSharpBinding.Refactoring.RenameFileToMatchTypeNameContextAction" />
<Class class="CSharpBinding.Refactoring.ParamRangeCheckContextAction" /> <Class class="CSharpBinding.Refactoring.ParamRangeCheckContextAction" />
<Class class="CSharpBinding.Refactoring.ConvertInterfaceToAbstractClassContextAction" />
</Path> </Path>
<Path name = "/SharpDevelop/Workbench/DisplayBindings"> <Path name = "/SharpDevelop/Workbench/DisplayBindings">

1
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj

@ -88,6 +88,7 @@
<Compile Include="Src\FormsDesigner\SecondaryDisplayBinding.cs" /> <Compile Include="Src\FormsDesigner\SecondaryDisplayBinding.cs" />
<Compile Include="Src\Parser\FoldingVisitor.cs" /> <Compile Include="Src\Parser\FoldingVisitor.cs" />
<Compile Include="Src\Refactoring\AbstractInlineRefactorDialog.cs" /> <Compile Include="Src\Refactoring\AbstractInlineRefactorDialog.cs" />
<Compile Include="Src\Refactoring\ConvertInterfaceToAbstractClassContextAction.cs" />
<Compile Include="Src\Refactoring\CreateProperties.cs" /> <Compile Include="Src\Refactoring\CreateProperties.cs" />
<Compile Include="Src\Refactoring\CreatePropertiesCommand.cs" /> <Compile Include="Src\Refactoring\CreatePropertiesCommand.cs" />
<Compile Include="Src\Refactoring\CreatePropertiesDialog.xaml.cs"> <Compile Include="Src\Refactoring\CreatePropertiesDialog.xaml.cs">

62
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<bool> 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<EntityDeclaration>()) {
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";
}
}
}
}

15
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/PropertyOrFieldWrapper.cs

@ -45,6 +45,11 @@ namespace CSharpBinding.Refactoring
} }
set { set {
isIncluded = value; isIncluded = value;
if (!value) {
// Remove other flags, too
AddCheckForNull = false;
AddRangeCheck = false;
}
OnPropertyChanged("IsIncluded"); OnPropertyChanged("IsIncluded");
} }
} }
@ -90,6 +95,11 @@ namespace CSharpBinding.Refactoring
get { return addCheckForNull; } get { return addCheckForNull; }
set { set {
addCheckForNull = value; 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; } get { return addRangeCheck; }
set { set {
addRangeCheck = value; addRangeCheck = value;
if (value) {
// Assure that IsIncluded is set to true as well
IsIncluded = true;
}
OnPropertyChanged("AddRangeCheck");
} }
} }

11
src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin

@ -14,7 +14,7 @@
<ConditionEvaluator name = "IsBreakpointActive" class="Debugger.AddIn.IsActiveBreakpointCondition" /> <ConditionEvaluator name = "IsBreakpointActive" class="Debugger.AddIn.IsActiveBreakpointCondition" />
</Import> </Import>
<Import assembly="Debugger.Core.dll"/> <Import assembly="Debugger.Core.dll"/>
</Runtime> </Runtime>
<Path name="/SharpDevelop/Services/DebuggerService/Debugger"> <Path name="/SharpDevelop/Services/DebuggerService/Debugger">
<Debugger id="DefaultDebugger" <Debugger id="DefaultDebugger"
@ -158,8 +158,15 @@
<Class class="Debugger.AddIn.Visualizers.ObjectGraphVisualizerDescriptor" /> <Class class="Debugger.AddIn.Visualizers.ObjectGraphVisualizerDescriptor" />
<Class class="Debugger.AddIn.Visualizers.GridVisualizerDescriptor" /> <Class class="Debugger.AddIn.Visualizers.GridVisualizerDescriptor" />
</Path> </Path>
<Path name="/SharpDevelop/TreeNodeFactories"> <Path name="/SharpDevelop/TreeNodeFactories">
<Class id="DebuggerTreeNodesFactory" class="ICSharpCode.SharpDevelop.Gui.Pads.DebuggerTreeNodesFactory" /> <Class id="DebuggerTreeNodesFactory" class="ICSharpCode.SharpDevelop.Gui.Pads.DebuggerTreeNodesFactory" />
</Path> </Path>
<Path name = "/SharpDevelop/Services/DebuggerService/ModuleContextMenu">
<MenuItem id = "AddModuleToWorkspace"
label = "Add to workspace"
icon = "Icons.16x16.AssemblyFromFile"
class = "ICSharpCode.SharpDevelop.Gui.Pads.AddModuleToWorkspaceCommand"/>
</Path>
</AddIn> </AddIn>

32
src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs

@ -4,6 +4,7 @@
using System; using System;
using System.IO; using System.IO;
using Debugger; using Debugger;
using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
@ -137,7 +138,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
public override void ShowContextMenu() public override void ShowContextMenu()
{ {
// Don't show context menu as for usual AssemblyTreeNodes. var assemblyModel = this.Model as IAssemblyModel;
if (assemblyModel != null) {
var ctx = MenuService.ShowContextMenu(null, assemblyModel, "/SharpDevelop/Services/DebuggerService/ModuleContextMenu");
}
} }
static IAssemblyModel CreateAssemblyModel(Module module) static IAssemblyModel CreateAssemblyModel(Module module)
@ -151,4 +155,30 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
return model; return model;
} }
} }
/// <summary>
/// RunAssemblyWithDebuggerCommand.
/// </summary>
class AddModuleToWorkspaceCommand : SimpleCommand
{
public override bool CanExecute(object parameter)
{
IAssemblyModel assemblyModel = parameter as IAssemblyModel;
return (assemblyModel != null) && assemblyModel.Context.IsValid;
}
public override void Execute(object parameter)
{
var classBrowser = SD.GetService<IClassBrowser>();
var modelFactory = SD.GetService<IModelFactory>();
if ((classBrowser != null) && (modelFactory != null)) {
IAssemblyModel assemblyModel = (IAssemblyModel) parameter;
// Create a new copy of this assembly model
IAssemblyModel newAssemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(assemblyModel.Context.Location);
if (newAssemblyModel != null)
classBrowser.AssemblyList.Assemblies.Add(newAssemblyModel);
}
}
}
} }

8
src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml

@ -119,6 +119,10 @@
</Style.Triggers>--> </Style.Triggers>-->
</Style> </Style>
<Style x:Key="packageListBoxItemContainerStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
<DataTemplate x:Key="PackageListBoxItemTemplate"> <DataTemplate x:Key="PackageListBoxItemTemplate">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@ -491,7 +495,7 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- <TextBlock <!-- <TextBlock
Grid.Row="0" Grid.Row="0"
Grid.Column="0" Grid.Column="0"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -550,8 +554,10 @@
x:Name="allPackagesListBox" x:Name="allPackagesListBox"
Grid.Row="0" Grid.Row="0"
SelectedIndex="0" SelectedIndex="0"
IsSynchronizedWithCurrentItem="true"
ItemTemplate="{StaticResource PackageListBoxItemTemplate}" ItemTemplate="{StaticResource PackageListBoxItemTemplate}"
ItemsSource="{Binding Path=AddInPackages}" ItemsSource="{Binding Path=AddInPackages}"
ItemContainerStyle="{StaticResource packageListBoxItemContainerStyle}"
HorizontalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"/> ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
<ProgressBar <ProgressBar

6
src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInPackageViewModelBase.cs

@ -252,6 +252,12 @@ namespace ICSharpCode.AddInManager2.ViewModel
return false; return false;
} }
} }
public bool IsSelected
{
get;
set;
}
public virtual void AddPackage() public virtual void AddPackage()
{ {

20
src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInsViewModelBase.cs

@ -23,6 +23,7 @@ namespace ICSharpCode.AddInManager2.ViewModel
private bool _isReadingPackages; private bool _isReadingPackages;
private bool _isExpandedinView; private bool _isExpandedinView;
private bool _showPackageSources; private bool _showPackageSources;
private string _lastSelectedId;
private ObservableCollection<PackageRepository> _packageRepositories; private ObservableCollection<PackageRepository> _packageRepositories;
@ -289,9 +290,11 @@ namespace ICSharpCode.AddInManager2.ViewModel
protected void UpdatePackageViewModels(IEnumerable<AddInPackageViewModelBase> newPackageViewModels) protected void UpdatePackageViewModels(IEnumerable<AddInPackageViewModelBase> newPackageViewModels)
{ {
StoreSelection();
ClearPackages(); ClearPackages();
NuGet.CollectionExtensions.AddRange(AddInPackages, newPackageViewModels); NuGet.CollectionExtensions.AddRange(AddInPackages, newPackageViewModels);
UpdateInstallationState(); UpdateInstallationState();
RestoreSelection();
} }
protected void ClearPackages() protected void ClearPackages()
@ -545,5 +548,22 @@ namespace ICSharpCode.AddInManager2.ViewModel
// Update the list of package sources // Update the list of package sources
UpdatePackageSources(); UpdatePackageSources();
} }
private void StoreSelection()
{
AddInPackageViewModelBase selectedModel = AddInPackages.FirstOrDefault(m => m.IsSelected);
if (selectedModel != null) {
_lastSelectedId = selectedModel.Id;
}
}
private void RestoreSelection()
{
AddInPackageViewModelBase modelToSelect = AddInPackages.FirstOrDefault(m => m.Id == _lastSelectedId);
if (modelToSelect != null) {
modelToSelect.IsSelected = true;
}
_lastSelectedId = null;
}
} }
} }

2
src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/NuGetAddInsViewModelBase.cs

@ -49,7 +49,7 @@ namespace ICSharpCode.AddInManager2.ViewModel
{ {
IsReadingPackages = true; IsReadingPackages = true;
HasError = false; HasError = false;
ClearPackages(); // ClearPackages();
CancelReadPackagesTask(); CancelReadPackagesTask();
CreateReadPackagesTask(); CreateReadPackagesTask();
_task.Start(); _task.Start();

59
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
{
/// <summary>
/// Creates an <see cref="ICSharpCode.SharpDevelop.Dom.IAssemblyModel"/> from a file name.
/// </summary>
/// <param name="modelFactory">Model factory.</param>
/// <param name="fileName">Assembly file name.</param>
/// <returns>Created <see cref="ICSharpCode.SharpDevelop.Dom.IAssemblyModel"/>.</returns>
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<IUnresolvedTypeDefinition>.Instance, assembly.TopLevelTypeDefinitions.ToList());
((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
}
return model;
}
/// <summary>
/// Creates an <see cref="ICSharpCode.SharpDevelop.Dom.IAssemblyModel"/> from a file name and catches
/// errors by showing messages to user.
/// </summary>
/// <param name="modelFactory">Model factory.</param>
/// <param name="fileName">Assembly file name.</param>
/// <returns>
/// Created <see cref="ICSharpCode.SharpDevelop.Dom.IAssemblyModel"/> or <b>null</b>,
/// if model couldn't be created.
/// </returns>
public static IAssemblyModel SafelyCreateAssemblyModelFromFile(this IModelFactory modelFactory, string fileName)
{
try {
return modelFactory.CreateAssemblyModelFromFile(fileName);
} catch (BadImageFormatException) {
SD.MessageService.ShowWarningFormatted("${res:ICSharpCode.SharpDevelop.Dom.AssemblyInvalid}", Path.GetFileName(fileName));
} catch (FileNotFoundException) {
SD.MessageService.ShowWarningFormatted("${res:ICSharpCode.SharpDevelop.Dom.AssemblyNotAccessible}", fileName);
}
return null;
}
}
}

9
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -989,6 +989,15 @@
</Path> </Path>
<Path name = "/SharpDevelop/Pads/ClassBrowser/AssemblyContextMenu"> <Path name = "/SharpDevelop/Pads/ClassBrowser/AssemblyContextMenu">
<Condition name="IsProcessRunning" isdebugging = "False" action = "Exclude">
<Condition name="DebuggerSupports" debuggersupports = "Start">
<MenuItem id = "RunAssemblyWithDebugger"
label = "${res:XML.MainMenu.RunMenu.Run}"
icon = "Icons.16x16.RunProgramIcon"
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RunAssemblyWithDebuggerCommand"/>
<MenuItem id = "AssemblyContextMenuSeparator" type = "Separator"/>
</Condition>
</Condition>
<MenuItem id = "RemoveAssembly" <MenuItem id = "RemoveAssembly"
label = "Remove" label = "Remove"
icon = "Icons.16x16.DeleteIcon" icon = "Icons.16x16.DeleteIcon"

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -114,6 +114,7 @@
<Compile Include="Dom\ModelCollectionLinq.cs" /> <Compile Include="Dom\ModelCollectionLinq.cs" />
<Compile Include="Dom\ImmutableModelCollection.cs" /> <Compile Include="Dom\ImmutableModelCollection.cs" />
<Compile Include="Dom\ModelCollectionTreeNode.cs" /> <Compile Include="Dom\ModelCollectionTreeNode.cs" />
<Compile Include="Dom\ModelFactoryExtensions.cs" />
<Compile Include="Dom\SimpleModelCollection.cs" /> <Compile Include="Dom\SimpleModelCollection.cs" />
<Compile Include="Dom\SynchronizedModelCollection.cs" /> <Compile Include="Dom\SynchronizedModelCollection.cs" />
<Compile Include="Editor\AvalonEditTextEditorAdapter.cs" /> <Compile Include="Editor\AvalonEditTextEditorAdapter.cs" />

45
src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs

@ -216,54 +216,15 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
SD.PropertyService.SetList<PersistedWorkspace>(PersistedWorkspaceSetting, persistedWorkspaces); SD.PropertyService.SetList<PersistedWorkspace>(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<IModelFactory>().CreateAssemblyModel(context);
if (model is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel)model).Update(EmptyList<IUnresolvedTypeDefinition>.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<IModelFactory>().CreateAssemblyModel(context);
if (model is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel)model).Update(EmptyList<IUnresolvedTypeDefinition>.Instance, assembly.TopLevelTypeDefinitions.ToList());
((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
}
return model;
}
static IAssemblyModel SafelyCreateAssemblyModelFromFile(string fileName) static IAssemblyModel SafelyCreateAssemblyModelFromFile(string fileName)
{ {
var modelFactory = SD.GetRequiredService<IModelFactory>();
try { try {
return CreateAssemblyModelOrThrowException(fileName); return modelFactory.CreateAssemblyModelFromFile(fileName);
} catch (Exception) { } catch (Exception) {
// Special AssemblyModel for unresolved file references // Special AssemblyModel for unresolved file references
IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName); IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName);
IAssemblyModel unresolvedModel = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(unresolvedContext); IAssemblyModel unresolvedModel = modelFactory.CreateAssemblyModel(unresolvedContext);
if (unresolvedModel is IUpdateableAssemblyModel) { if (unresolvedModel is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName; ((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName;
} }

35
src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

@ -2,8 +2,10 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using ICSharpCode.SharpDevelop.Debugging;
using Microsoft.Win32; using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
@ -16,14 +18,15 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
var classBrowser = SD.GetService<IClassBrowser>(); var classBrowser = SD.GetService<IClassBrowser>();
if (classBrowser != null) { var modelFactory = SD.GetService<IModelFactory>();
if ((classBrowser != null) && (modelFactory != null)) {
OpenFileDialog openFileDialog = new OpenFileDialog(); OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Assembly files (*.exe, *.dll)|*.exe;*.dll"; openFileDialog.Filter = "Assembly files (*.exe, *.dll)|*.exe;*.dll";
openFileDialog.CheckFileExists = true; openFileDialog.CheckFileExists = true;
openFileDialog.CheckPathExists = true; openFileDialog.CheckPathExists = true;
if (openFileDialog.ShowDialog() ?? false) if (openFileDialog.ShowDialog() ?? false)
{ {
IAssemblyModel assemblyModel = ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName); IAssemblyModel assemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(openFileDialog.FileName);
if (assemblyModel != null) if (assemblyModel != null)
classBrowser.AssemblyList.Assemblies.Add(assemblyModel); classBrowser.AssemblyList.Assemblies.Add(assemblyModel);
} }
@ -39,12 +42,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
var classBrowser = SD.GetService<IClassBrowser>(); var classBrowser = SD.GetService<IClassBrowser>();
if (classBrowser != null) { var modelFactory = SD.GetService<IModelFactory>();
if ((classBrowser != null) && (modelFactory != null)) {
OpenFromGacDialog gacDialog = new OpenFromGacDialog(); OpenFromGacDialog gacDialog = new OpenFromGacDialog();
if (gacDialog.ShowDialog() ?? false) if (gacDialog.ShowDialog() ?? false)
{ {
foreach (string assemblyFile in gacDialog.SelectedFileNames) { foreach (string assemblyFile in gacDialog.SelectedFileNames) {
IAssemblyModel assemblyModel = ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile); IAssemblyModel assemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(assemblyFile);
if (assemblyModel != null) if (assemblyModel != null)
classBrowser.AssemblyList.Assemblies.Add(assemblyModel); classBrowser.AssemblyList.Assemblies.Add(assemblyModel);
} }
@ -72,4 +76,27 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
} }
} }
/// <summary>
/// RunAssemblyWithDebuggerCommand.
/// </summary>
class RunAssemblyWithDebuggerCommand : SimpleCommand
{
public override bool CanExecute(object parameter)
{
IAssemblyModel assemblyModel = parameter as IAssemblyModel;
return (assemblyModel != null) && assemblyModel.Context.IsValid;
}
public override void Execute(object parameter)
{
IAssemblyModel assemblyModel = (IAssemblyModel) parameter;
// Start debugger with given assembly
DebuggerService.CurrentDebugger.Start(new ProcessStartInfo {
FileName = assemblyModel.Context.Location,
WorkingDirectory = Path.GetDirectoryName(assemblyModel.Context.Location)
});
}
}
} }

Loading…
Cancel
Save