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 @@ -44,7 +44,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override object Icon {
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 @@ -44,6 +44,11 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Full path and file name of the assembly. Output assembly for projects.
/// </summary>
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
@ -80,6 +85,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -80,6 +85,10 @@ namespace ICSharpCode.SharpDevelop.Dom
{
return EntityModelContextUtils.IsBetterPart(part1, part2, primaryCodeFileExtension);
}
public bool IsValid {
get { return true; }
}
}
public class AssemblyEntityModelContext : IEntityModelContext
@ -119,6 +128,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -119,6 +128,10 @@ namespace ICSharpCode.SharpDevelop.Dom
public IProject Project {
get { return null; }
}
public bool IsValid {
get { return true; }
}
}
public static class EntityModelContextUtils

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

@ -2,13 +2,16 @@ @@ -2,13 +2,16 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Controls;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.TreeView;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Workbench;
@ -27,6 +30,50 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -27,6 +30,50 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
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
{
#region IClassBrowser implementation
@ -171,19 +218,33 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -171,19 +218,33 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
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);
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 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) {
((IUpdateableAssemblyModel)model).Update(EmptyList<IUnresolvedTypeDefinition>.Instance, assembly.TopLevelTypeDefinitions.ToList());
((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
// 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 model;
return unresolvedModel;
}
void AppendAssemblyFileToList(string assemblyFile)

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

@ -23,11 +23,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -23,11 +23,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
openFileDialog.CheckPathExists = true;
if (openFileDialog.ShowDialog() ?? false)
{
try {
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