From 3669e6621d262cb944f2c61c104f73f548d62b2d Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Thu, 22 Aug 2013 01:35:58 +0200 Subject: [PATCH] First part of type resolving of base types in ClassBrowser. --- .../Dom/ClassBrowser/BaseTypesTreeNode.cs | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs index 16f060cba2..0cf9bd0876 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs @@ -3,7 +3,10 @@ using System; using System.Linq; +using ICSharpCode.Core; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.TypeSystem.Implementation; +using ICSharpCode.SharpDevelop.Parser; namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser { @@ -45,7 +48,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser if (currentTypeDef != null) { foreach (var baseType in currentTypeDef.DirectBaseTypes) { ITypeDefinition baseTypeDef = baseType.GetDefinition(); - if (baseTypeDef != null) { + if ((baseTypeDef != null) && (baseTypeDef.FullName != "System.Object")) { ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(baseTypeDef); if (baseTypeModel != null) baseTypes.Add(baseTypeModel); @@ -56,21 +59,39 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition definition) { - ITypeDefinitionModel model = definition.GetModel(); - if (model == null) { - // Try to get model from ClassBrowser's assembly list - var classBrowser = SD.GetService(); - if (classBrowser != null) { - foreach (var assemblyModel in classBrowser.MainAssemblyList.Assemblies) { - model = assemblyModel.TopLevelTypeDefinitions[definition.FullTypeName]; - if (model != null) { - return model; + ITypeDefinitionModel resolveTypeDefModel = definition.GetModel(); + if (resolveTypeDefModel == null) { + var assemblyParserService = SD.GetService(); + if (assemblyParserService != null) { + var assemblyFileName = this.definition.Resolve().ParentAssembly.GetRuntimeAssemblyLocation(); + if (assemblyFileName != null) { + try { + // Look in the type's AssemblyModel + var assemblyModel = assemblyParserService.GetAssemblyModel(assemblyFileName); + resolveTypeDefModel = assemblyModel.TopLevelTypeDefinitions[definition.FullTypeName]; + if (resolveTypeDefModel != null) { + return resolveTypeDefModel; + } + + if (assemblyModel.References != null) { + foreach (var referencedAssemblyName in assemblyModel.References) { + DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyModel.Location); + var resolvedFile = searcher.FindAssembly(referencedAssemblyName); + var referenceAssemblyModel = assemblyParserService.GetAssemblyModel(resolvedFile); + resolveTypeDefModel = referenceAssemblyModel.TopLevelTypeDefinitions[definition.FullTypeName]; + if (resolveTypeDefModel != null) { + return resolveTypeDefModel; + } + } + } + } catch (Exception) { + } } } } - return model; + return resolveTypeDefModel; } protected override System.Collections.Generic.IComparer NodeComparer {