Browse Source

Base types in ClassBrowser now shown, but only if defined in same project or in one of added custom assemblies.

pull/59/merge
Andreas Weizel 12 years ago
parent
commit
133358a9f8
  1. 47
      src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs
  2. 3
      src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs
  3. 3
      src/Main/Base/Project/Dom/ITypeDefinitionModel.cs
  4. 44
      src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs

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

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.NRefactory.TypeSystem;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
@ -12,20 +13,64 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -12,20 +13,64 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
ITypeDefinitionModel definition;
string text;
SimpleModelCollection<ITypeDefinitionModel> baseTypes;
public BaseTypesTreeNode(ITypeDefinitionModel definition)
{
if (definition == null)
throw new ArgumentNullException("definition");
this.definition = definition;
this.definition.Updated += (sender, e) => UpdateBaseTypes();
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.BaseTypes");
baseTypes = new SimpleModelCollection<ITypeDefinitionModel>();
}
protected override IModelCollection<object> ModelChildren {
get {
return definition.BaseTypes;
return baseTypes;
}
}
protected override void LoadChildren()
{
UpdateBaseTypes();
base.LoadChildren();
}
void UpdateBaseTypes()
{
baseTypes.Clear();
ITypeDefinition currentTypeDef = definition.Resolve();
if (currentTypeDef != null) {
foreach (var baseType in currentTypeDef.DirectBaseTypes) {
ITypeDefinition baseTypeDef = baseType.GetDefinition();
if (baseTypeDef != null) {
ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(baseTypeDef);
if (baseTypeModel != null)
baseTypes.Add(baseTypeModel);
}
}
}
}
ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition definition)
{
ITypeDefinitionModel model = definition.GetModel();
if (model == null) {
// Try to get model from ClassBrowser's assembly list
var classBrowser = SD.GetService<IClassBrowser>();
if (classBrowser != null) {
foreach (var assemblyModel in classBrowser.AssemblyList.Assemblies) {
model = assemblyModel.TopLevelTypeDefinitions[definition.FullTypeName];
if (model != null) {
return model;
}
}
}
}
return model;
}
protected override System.Collections.Generic.IComparer<ICSharpCode.TreeView.SharpTreeNode> NodeComparer {
get {

3
src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs

@ -57,7 +57,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -57,7 +57,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
protected override void LoadChildren()
{
base.LoadChildren();
Children.Insert(0, new BaseTypesTreeNode(definition));
var baseTypesTreeNode = new BaseTypesTreeNode(definition);
Children.Insert(0, baseTypesTreeNode);
}
public override void ActivateItem(System.Windows.RoutedEventArgs e)

3
src/Main/Base/Project/Dom/ITypeDefinitionModel.cs

@ -13,11 +13,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -13,11 +13,12 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </summary>
public interface ITypeDefinitionModel : IEntityModel
{
event EventHandler Updated;
FullTypeName FullTypeName { get; }
string Namespace { get; }
TypeKind TypeKind { get; }
IModelCollection<ITypeDefinitionModel> NestedTypes { get; }
IModelCollection<ITypeDefinitionModel> BaseTypes { get; }
IModelCollection<IMemberModel> Members { get; }
IEnumerable<DomRegion> GetPartRegions();

44
src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs

@ -19,6 +19,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -19,6 +19,8 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </summary>
sealed class TypeDefinitionModel : ITypeDefinitionModel
{
public event EventHandler Updated;
readonly IEntityModelContext context;
readonly FullTypeName fullTypeName;
List<IUnresolvedTypeDefinition> parts = new List<IUnresolvedTypeDefinition>();
@ -270,44 +272,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -270,44 +272,6 @@ namespace ICSharpCode.SharpDevelop.Dom
}
#endregion
#region Base Types collection
NestedTypeDefinitionModelCollection baseTypes;
IList<IUnresolvedTypeDefinition> GetBaseTypes(IUnresolvedTypeDefinition definition)
{
var compilation = context.GetCompilation();
if (compilation != null) {
var typeResolveContext = new SimpleTypeResolveContext(compilation.MainAssembly).WithCurrentTypeDefinition(Resolve());
var baseTypeList = new List<IUnresolvedTypeDefinition>();
foreach (var baseTypeRef in definition.BaseTypes) {
var resolvedTypeDefinition = baseTypeRef.Resolve(typeResolveContext).GetDefinition();
if (resolvedTypeDefinition != null) {
baseTypeList.Add(resolvedTypeDefinition.Parts[0]);
}
}
return baseTypeList;
}
return null;
}
public IModelCollection<ITypeDefinitionModel> BaseTypes {
get {
if (baseTypes == null) {
baseTypes = new NestedTypeDefinitionModelCollection(context);
foreach (var part in parts) {
var baseTypeList = GetBaseTypes(part);
if (baseTypeList != null) {
baseTypes.Update(null, baseTypeList);
}
}
}
return baseTypes;
}
}
#endregion
#region Update
/// <summary>
/// Updates this type definition model by replacing oldPart with newPart.
@ -349,8 +313,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -349,8 +313,8 @@ namespace ICSharpCode.SharpDevelop.Dom
if (nestedTypes != null) {
nestedTypes.Update(oldPart != null ? oldPart.NestedTypes : null, newPart != null ? newPart.NestedTypes : null);
}
if (baseTypes != null) {
baseTypes.Update(oldPart != null ? GetBaseTypes(oldPart) : null, newPart != null ? GetBaseTypes(newPart) : null);
if (Updated != null) {
Updated(this, new EventArgs());
}
}
#endregion

Loading…
Cancel
Save