diff --git a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs index b6f382bba4..ff499c969f 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs @@ -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"); + } } } diff --git a/src/Main/Base/Project/Dom/IEntityModelContext.cs b/src/Main/Base/Project/Dom/IEntityModelContext.cs index 69295ef7b3..542c87d107 100644 --- a/src/Main/Base/Project/Dom/IEntityModelContext.cs +++ b/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. /// string Location { get; } + + /// + /// Returns whether this is a valid context (based on a existing and readable definition). + /// + bool IsValid { get; } } public class ProjectEntityModelContext : IEntityModelContext @@ -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 public IProject Project { get { return null; } } + + public bool IsValid { + get { return true; } + } } public static class EntityModelContextUtils diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs index da5865ec00..891508f62b 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs +++ b/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) 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 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 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().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().CreateAssemblyModel(context); + if (model is IUpdateableAssemblyModel) { + ((IUpdateableAssemblyModel)model).Update(EmptyList.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.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().CreateAssemblyModel(unresolvedContext); + if (unresolvedModel is IUpdateableAssemblyModel) { + ((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName; } - return model; + + return unresolvedModel; } void AppendAssemblyFileToList(string assemblyFile) diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs index 17ce0e73f1..3287d4e4f9 100644 --- a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs +++ b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs @@ -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)); - } } } }