Browse Source

Fix ITypeDefinition.GetModel() for types defined in referenced assemblies; and use it in BaseTypesTreeNode.

pull/315/head
Daniel Grunwald 12 years ago
parent
commit
9796b702e6
  1. 63
      src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs
  2. 28
      src/Main/Base/Project/Util/SharpDevelopExtensions.cs

63
src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs

@ -59,8 +59,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -59,8 +59,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (currentTypeDef != null) {
foreach (var baseType in currentTypeDef.DirectBaseTypes) {
ITypeDefinition baseTypeDef = baseType.GetDefinition();
if ((baseTypeDef != null)) {
ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(currentTypeDef, baseTypeDef);
if (baseTypeDef != null) {
ITypeDefinitionModel baseTypeModel = baseTypeDef.GetModel();
if (baseTypeModel != null)
baseTypes.Add(baseTypeModel);
}
@ -68,65 +68,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -68,65 +68,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
}
}
ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition mainTypeDefinition, ITypeDefinition baseTypeDefinition)
{
ITypeDefinitionModel resolveTypeDefModel = null;
var assemblyFileName = mainTypeDefinition.ParentAssembly.GetRuntimeAssemblyLocation();
IAssemblyModel assemblyModel = null;
try {
// Try to get AssemblyModel from project list
IProjectService projectService = SD.GetRequiredService<IProjectService>();
if (projectService.CurrentSolution != null) {
var projectOfAssembly = projectService.CurrentSolution.Projects.FirstOrDefault(p => p.AssemblyModel.Location == assemblyFileName);
if (projectOfAssembly != null) {
// We automatically have an AssemblyModel from project
assemblyModel = projectOfAssembly.AssemblyModel;
}
}
var assemblyParserService = SD.GetService<IAssemblyParserService>();
if (assemblyModel == null) {
if (assemblyParserService != null) {
if (assemblyFileName != null) {
assemblyModel = assemblyParserService.GetAssemblyModel(assemblyFileName);
}
}
}
if (assemblyModel != null) {
// Nothing in projects, load from assembly file
resolveTypeDefModel = assemblyModel.TopLevelTypeDefinitions[baseTypeDefinition.FullTypeName];
if (resolveTypeDefModel != null) {
return resolveTypeDefModel;
}
// Look at referenced assemblies
if ((assemblyModel.References != null) && (assemblyParserService != null)) {
foreach (var referencedAssemblyName in assemblyModel.References.AssemblyNames) {
CombinedAssemblySearcher searcher = new CombinedAssemblySearcher();
if ((assemblyModel.Context != null) && (assemblyModel.Context.Project != null)) {
searcher.AddSearcher(new ProjectAssemblyReferenceSearcher(assemblyModel.Context.Project));
}
searcher.AddSearcher(new DefaultAssemblySearcher(assemblyModel.Location));
var resolvedFile = searcher.FindAssembly(referencedAssemblyName.AssemblyName);
if (resolvedFile != null) {
var referenceAssemblyModel = assemblyParserService.GetAssemblyModel(resolvedFile);
resolveTypeDefModel = referenceAssemblyModel.TopLevelTypeDefinitions[baseTypeDefinition.FullTypeName];
if (resolveTypeDefModel != null) {
return resolveTypeDefModel;
}
}
}
}
}
} catch (Exception) {
// TODO Can't load the type, what to do?
}
return resolveTypeDefModel;
}
protected override System.Collections.Generic.IComparer<ICSharpCode.TreeView.SharpTreeNode> NodeComparer {
get {
return NodeTextComparer;

28
src/Main/Base/Project/Util/SharpDevelopExtensions.cs

@ -497,6 +497,28 @@ namespace ICSharpCode.SharpDevelop @@ -497,6 +497,28 @@ namespace ICSharpCode.SharpDevelop
return null;
}
/// <summary>
/// Retrieves the model instance for the given assembly.
/// May return null if there is no model for the specified assembly.
/// </summary>
public static IAssemblyModel GetModel(this IAssembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly");
IProject project = assembly.GetProject();
if (project != null)
return project.AssemblyModel;
try {
return SD.AssemblyParserService.GetAssemblyModel(assembly.GetReferenceAssemblyLocation());
} catch (Exception ex) {
// TODO: use the exact exception types that GetAssemblyModel() throws (+document them)
// silently ignore errors when loading the assembly
return null;
}
}
/// <summary>
/// Retrieves the model instance for the given type definition.
/// May return null if there is no model for the specified type definition.
@ -506,9 +528,9 @@ namespace ICSharpCode.SharpDevelop @@ -506,9 +528,9 @@ namespace ICSharpCode.SharpDevelop
if (typeDefinition == null)
throw new ArgumentNullException("typeDefinition");
IProject project = typeDefinition.ParentAssembly.GetProject();
if (project != null)
return project.AssemblyModel.TopLevelTypeDefinitions[typeDefinition.FullTypeName];
IAssemblyModel assembly = typeDefinition.ParentAssembly.GetModel();
if (assembly != null)
return assembly.TopLevelTypeDefinitions[typeDefinition.FullTypeName];
else
return null;
}

Loading…
Cancel
Save