Browse Source

ClassBrowser: Handling saved but inaccessible assemblies, showing warning icon at assembly item.

newNRILSpyDebugger
Andreas Weizel 12 years ago
parent
commit
a99aa0e468
  1. 6
      src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
  2. 13
      src/Main/Base/Project/Dom/IEntityModelContext.cs
  3. 83
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
  4. 4
      src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

6
src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs

@ -44,7 +44,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override object Icon { public override object Icon {
get { get {
return SD.ResourceService.GetImageSource("Icons.16x16.Assembly"); if (model.Context.IsValid) {
return SD.ResourceService.GetImageSource("Icons.16x16.Assembly");
} else {
return SD.ResourceService.GetImageSource("Icons.16x16.AssemblyError");
}
} }
} }

13
src/Main/Base/Project/Dom/IEntityModelContext.cs

@ -44,6 +44,11 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Full path and file name of the assembly. Output assembly for projects. /// Full path and file name of the assembly. Output assembly for projects.
/// </summary> /// </summary>
string Location { get; } string Location { get; }
/// <summary>
/// Returns whether this is a valid context (based on a existing and readable definition).
/// </summary>
bool IsValid { get; }
} }
public class ProjectEntityModelContext : IEntityModelContext public class ProjectEntityModelContext : IEntityModelContext
@ -80,6 +85,10 @@ namespace ICSharpCode.SharpDevelop.Dom
{ {
return EntityModelContextUtils.IsBetterPart(part1, part2, primaryCodeFileExtension); return EntityModelContextUtils.IsBetterPart(part1, part2, primaryCodeFileExtension);
} }
public bool IsValid {
get { return true; }
}
} }
public class AssemblyEntityModelContext : IEntityModelContext public class AssemblyEntityModelContext : IEntityModelContext
@ -119,6 +128,10 @@ namespace ICSharpCode.SharpDevelop.Dom
public IProject Project { public IProject Project {
get { return null; } get { return null; }
} }
public bool IsValid {
get { return true; }
}
} }
public static class EntityModelContextUtils public static class EntityModelContextUtils

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

@ -2,13 +2,16 @@
// 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.IO;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Windows.Controls; using System.Windows.Controls;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation; using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.TreeView; using ICSharpCode.TreeView;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Workbench; using ICSharpCode.SharpDevelop.Workbench;
@ -27,6 +30,50 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public bool IsActive { get; set; } public bool IsActive { get; set; }
} }
class UnresolvedAssemblyEntityModelContext : IEntityModelContext
{
string assemblyName;
string location;
public UnresolvedAssemblyEntityModelContext(string assemblyName, string location)
{
this.assemblyName = assemblyName;
this.location = location;
}
public ICompilation GetCompilation()
{
return null;
}
public bool IsBetterPart(IUnresolvedTypeDefinition part1, IUnresolvedTypeDefinition part2)
{
return false;
}
public IProject Project {
get {
return null;
}
}
public string AssemblyName {
get {
return assemblyName;
}
}
public string Location {
get {
return location;
}
}
public bool IsValid {
get { return false; }
}
}
class ClassBrowserPad : AbstractPadContent, IClassBrowser class ClassBrowserPad : AbstractPadContent, IClassBrowser
{ {
#region IClassBrowser implementation #region IClassBrowser implementation
@ -171,19 +218,33 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public static IAssemblyModel CreateAssemblyModelFromFile(string fileName) public static IAssemblyModel CreateAssemblyModelFromFile(string fileName)
{ {
var loader = new CecilLoader(); try {
loader.IncludeInternalMembers = true; var loader = new CecilLoader();
loader.LazyLoad = true; loader.IncludeInternalMembers = true;
var assembly = loader.LoadAssemblyFile(fileName); loader.LazyLoad = true;
var assembly = loader.LoadAssemblyFile(fileName);
IEntityModelContext context = new AssemblyEntityModelContext(assembly);
IAssemblyModel model = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(context); 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 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);
}
if (model is IUpdateableAssemblyModel) { // AssemblyModel for unresolved file references
((IUpdateableAssemblyModel)model).Update(EmptyList<IUnresolvedTypeDefinition>.Instance, assembly.TopLevelTypeDefinitions.ToList()); IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName);
((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName; IAssemblyModel unresolvedModel = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(unresolvedContext);
if (unresolvedModel is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName;
} }
return model;
return unresolvedModel;
} }
void AppendAssemblyFileToList(string assemblyFile) void AppendAssemblyFileToList(string assemblyFile)

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

@ -23,11 +23,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
openFileDialog.CheckPathExists = true; openFileDialog.CheckPathExists = true;
if (openFileDialog.ShowDialog() ?? false) if (openFileDialog.ShowDialog() ?? false)
{ {
try {
classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName)); classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName));
} catch (BadImageFormatException ex) {
SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(openFileDialog.FileName));
}
} }
} }
} }

Loading…
Cancel
Save