Browse Source

add "debug executable" command to class browser toolbar; clean up the model factory methods

newNRILSpyDebugger
Siegfried Pammer 12 years ago
parent
commit
5db0f9a816
  1. 9
      src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin
  2. 5
      src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs
  3. 2
      src/AddIns/Debugger/Debugger.AddIn/Service/DebuggerCommands.cs
  4. 40
      src/Main/Base/Project/Dom/ModelFactoryExtensions.cs
  5. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  6. 12
      src/Main/Base/Project/Parser/IAssemblyParserService.cs
  7. 2
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
  8. 7
      src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
  9. 13
      src/Main/SharpDevelop/Parser/AssemblyParserService.cs

9
src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.addin

@ -77,6 +77,15 @@
</Condition> </Condition>
</Path> </Path>
<Path name="/SharpDevelop/Pads/ClassBrowser/Toolbar">
<Condition name = "IsProcessRunning" isdebugging="False" action="Disable">
<ToolbarItem id = "DebugExecutable"
icon = "Icons.16x16.Debug.Assembly"
tooltip = "${res:MainWindow.Windows.Debug.DebugExecutable}"
class = "Debugger.AddIn.DebugExecutableMenuCommand"/>
</Condition>
</Path>
<Path name = "/SharpDevelop/Workbench/Pads"> <Path name = "/SharpDevelop/Workbench/Pads">
<Pad id = "BreakPointsPad" <Pad id = "BreakPointsPad"
category = "Debugger" category = "Debugger"

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

@ -252,12 +252,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
var classBrowser = SD.GetService<IClassBrowser>(); var classBrowser = SD.GetService<IClassBrowser>();
var modelFactory = SD.GetService<IModelFactory>(); if (classBrowser != null) {
if ((classBrowser != null) && (modelFactory != null)) {
IAssemblyModel assemblyModel = (IAssemblyModel) parameter; IAssemblyModel assemblyModel = (IAssemblyModel) parameter;
// Create a new copy of this assembly model // Create a new copy of this assembly model
IAssemblyModel newAssemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(assemblyModel.Context.Location); IAssemblyModel newAssemblyModel = SD.AssemblyParserService.GetAssemblyModelSafe(new ICSharpCode.Core.FileName(assemblyModel.Context.Location), true);
if (newAssemblyModel != null) if (newAssemblyModel != null)
classBrowser.MainAssemblyList.Assemblies.Add(newAssemblyModel); classBrowser.MainAssemblyList.Assemblies.Add(newAssemblyModel);
} }

2
src/AddIns/Debugger/Debugger.AddIn/Service/DebuggerCommands.cs

@ -115,7 +115,7 @@ namespace Debugger.AddIn
} }
} else { } else {
OpenFileDialog dialog = new OpenFileDialog() { OpenFileDialog dialog = new OpenFileDialog() {
Filter = ".NET Executable (*.exe) | *.exe", Filter = ".NET executable|*.exe",
RestoreDirectory = true, RestoreDirectory = true,
DefaultExt = "exe" DefaultExt = "exe"
}; };

40
src/Main/Base/Project/Dom/ModelFactoryExtensions.cs

@ -1,40 +0,0 @@
// 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.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem;
using Mono.Cecil;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom
{
public static class ModelFactoryExtensions
{
/// <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 SD.AssemblyParserService.GetAssemblyModel(new FileName(fileName), true, modelFactory);
} 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;
}
}
}

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

@ -118,7 +118,6 @@
<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" />

12
src/Main/Base/Project/Parser/IAssemblyParserService.cs

@ -57,6 +57,18 @@ namespace ICSharpCode.SharpDevelop.Parser
/// Creates an IAssemblyModel for the given assembly file. /// Creates an IAssemblyModel for the given assembly file.
/// </summary> /// </summary>
IAssemblyModel GetAssemblyModel(FileName fileName, bool includeInternalMembers = false); IAssemblyModel GetAssemblyModel(FileName fileName, bool includeInternalMembers = false);
/// <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>
IAssemblyModel GetAssemblyModelSafe(FileName fileName, bool includeInternalMembers = false);
} }
public interface IAssemblySearcher public interface IAssemblySearcher

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

@ -230,7 +230,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
var modelFactory = SD.GetRequiredService<IModelFactory>(); var modelFactory = SD.GetRequiredService<IModelFactory>();
try { try {
return SD.AssemblyParserService.GetAssemblyModel(new FileName(fileName), false, modelFactory); return SD.AssemblyParserService.GetAssemblyModel(new FileName(fileName), true);
} 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);

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

@ -24,9 +24,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
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 = SD.AssemblyParserService.GetAssemblyModelSafe(new ICSharpCode.Core.FileName(openFileDialog.FileName), true);
IAssemblyModel assemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(openFileDialog.FileName);
if (assemblyModel != null) if (assemblyModel != null)
classBrowser.MainAssemblyList.Assemblies.Add(assemblyModel); classBrowser.MainAssemblyList.Assemblies.Add(assemblyModel);
} }
@ -48,7 +47,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (gacDialog.ShowDialog() ?? false) if (gacDialog.ShowDialog() ?? false)
{ {
foreach (string assemblyFile in gacDialog.SelectedFileNames) { foreach (string assemblyFile in gacDialog.SelectedFileNames) {
IAssemblyModel assemblyModel = modelFactory.SafelyCreateAssemblyModelFromFile(assemblyFile); IAssemblyModel assemblyModel = SD.AssemblyParserService.GetAssemblyModelSafe(new ICSharpCode.Core.FileName(assemblyFile), true);
if (assemblyModel != null) if (assemblyModel != null)
classBrowser.MainAssemblyList.Assemblies.Add(assemblyModel); classBrowser.MainAssemblyList.Assemblies.Add(assemblyModel);
} }

13
src/Main/SharpDevelop/Parser/AssemblyParserService.cs

@ -330,5 +330,18 @@ namespace ICSharpCode.SharpDevelop.Parser
return model; return model;
} }
public IAssemblyModel GetAssemblyModelSafe(FileName fileName, bool includeInternalMembers = false)
{
try {
return GetAssemblyModel(fileName, includeInternalMembers);
} 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;
}
} }
} }

Loading…
Cancel
Save