Browse Source

Added sub-node with error text for unresolved assemblies in ClassBrowser. Such assemblies also don't produce an error message anymore when opening ClassBrowserPad.

newNRILSpyDebugger
Andreas Weizel 12 years ago
parent
commit
50a5cb4274
  1. 27
      src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs
  2. 11
      src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
  3. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  4. 54
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
  5. 36
      src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

27
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;
}
}
}
}

11
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 { public override object Text {
get { get {
return model.AssemblyName; return model.AssemblyName;

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

@ -84,6 +84,7 @@
</Compile> </Compile>
<Compile Include="Designer\IDesignerTypeResolutionService.cs" /> <Compile Include="Designer\IDesignerTypeResolutionService.cs" />
<Compile Include="Designer\TypeResolutionService.cs" /> <Compile Include="Designer\TypeResolutionService.cs" />
<Compile Include="Dom\ClassBrowser\AssemblyLoadErrorTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\AssemblyTreeNode.cs" /> <Compile Include="Dom\ClassBrowser\AssemblyTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserTreeView.cs" /> <Compile Include="Dom\ClassBrowser\ClassBrowserTreeView.cs" />
<Compile Include="Dom\ClassBrowser\IClassBrowser.cs" /> <Compile Include="Dom\ClassBrowser\IClassBrowser.cs" />

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

@ -217,44 +217,42 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
public static IAssemblyModel CreateAssemblyModelFromFile(string fileName) 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<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)
{ {
try { try {
var loader = new CecilLoader(); return CreateAssemblyModelFromFile(fileName);
loader.IncludeInternalMembers = true; } catch (Exception) {
loader.LazyLoad = true; // Special AssemblyModel for unresolved file references
var assembly = loader.LoadAssemblyFile(fileName); IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName);
IAssemblyModel unresolvedModel = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(unresolvedContext);
IEntityModelContext context = new AssemblyEntityModelContext(assembly); if (unresolvedModel is IUpdateableAssemblyModel) {
IAssemblyModel model = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(context); ((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName;
if (model is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel)model).Update(EmptyList<IUnresolvedTypeDefinition>.Instance, assembly.TopLevelTypeDefinitions.ToList());
((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
} }
return model;
} catch (BadImageFormatException ex) { return unresolvedModel;
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<IModelFactory>().CreateAssemblyModel(unresolvedContext);
if (unresolvedModel is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName;
} }
return unresolvedModel;
} }
void AppendAssemblyFileToList(string assemblyFile) void AppendAssemblyFileToList(string assemblyFile)
{ {
IAssemblyModel assemblyModel = CreateAssemblyModelFromFile(assemblyFile); IAssemblyModel assemblyModel = SafelyCreateAssemblyModelFromFile(assemblyFile);
if (assemblyModel != null) { if (assemblyModel != null) {
AssemblyList.Assemblies.Add(assemblyModel); AssemblyList.Assemblies.Add(assemblyModel);
} else {
// TODO Throw exception?
} }
} }

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

@ -9,7 +9,7 @@ using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
/// <summary> /// <summary>
/// Description of OpenAssemblyFromFileCommand. /// OpenAssemblyFromFileCommand.
/// </summary> /// </summary>
class OpenAssemblyFromFileCommand : SimpleCommand class OpenAssemblyFromFileCommand : SimpleCommand
{ {
@ -23,14 +23,20 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
openFileDialog.CheckPathExists = true; openFileDialog.CheckPathExists = true;
if (openFileDialog.ShowDialog() ?? false) 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);
}
} }
} }
} }
} }
/// <summary> /// <summary>
/// Description of OpenAssemblyFromGACCommand. /// OpenAssemblyFromGACCommand.
/// </summary> /// </summary>
class OpenAssemblyFromGACCommand : SimpleCommand class OpenAssemblyFromGACCommand : SimpleCommand
{ {
@ -42,7 +48,13 @@ 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) {
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
} }
/// <summary> /// <summary>
/// Description of RemoveAssemblyCommand. /// RemoveAssemblyCommand.
/// </summary> /// </summary>
class RemoveAssemblyCommand : SimpleCommand class RemoveAssemblyCommand : SimpleCommand
{ {
@ -68,18 +80,4 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
} }
} }
/// <summary>
/// Description of RemoveAssemblyCommand.
/// </summary>
class ClassBrowserCollapseAllCommand : SimpleCommand
{
public override void Execute(object parameter)
{
// var classBrowser = SD.GetService<IClassBrowser>() as ClassBrowserPad;
// if (classBrowser != null) {
// classBrowser.TreeView
// }
}
}
} }

Loading…
Cancel
Save