Browse Source

Improved performance of BaseTypesTreeNode, which was massively slowing down the ClassBrowser.

pull/80/head
Andreas Weizel 12 years ago
parent
commit
bca158814d
  1. 12
      src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs
  2. 20
      src/Main/Base/Project/Dom/ClassBrowser/DerivedTypesTreeNode.cs

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

@ -18,6 +18,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
ITypeDefinitionModel definition; ITypeDefinitionModel definition;
string text; string text;
bool childrenLoaded;
SimpleModelCollection<ITypeDefinitionModel> baseTypes; SimpleModelCollection<ITypeDefinitionModel> baseTypes;
public BaseTypesTreeNode(ITypeDefinitionModel definition) public BaseTypesTreeNode(ITypeDefinitionModel definition)
@ -28,11 +29,15 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
this.definition.Updated += (sender, e) => UpdateBaseTypes(); this.definition.Updated += (sender, e) => UpdateBaseTypes();
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.BaseTypes"); this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.BaseTypes");
baseTypes = new SimpleModelCollection<ITypeDefinitionModel>(); baseTypes = new SimpleModelCollection<ITypeDefinitionModel>();
UpdateBaseTypes(); childrenLoaded = false;
} }
protected override IModelCollection<object> ModelChildren { protected override IModelCollection<object> ModelChildren {
get { get {
if (!childrenLoaded) {
UpdateBaseTypes();
childrenLoaded = true;
}
return baseTypes; return baseTypes;
} }
} }
@ -45,7 +50,8 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public bool HasBaseTypes() public bool HasBaseTypes()
{ {
return baseTypes.Count > 0; ITypeDefinition currentTypeDef = definition.Resolve();
return (currentTypeDef != null) && currentTypeDef.DirectBaseTypes.Any();
} }
void UpdateBaseTypes() void UpdateBaseTypes()
@ -55,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (currentTypeDef != null) { if (currentTypeDef != null) {
foreach (var baseType in currentTypeDef.DirectBaseTypes) { foreach (var baseType in currentTypeDef.DirectBaseTypes) {
ITypeDefinition baseTypeDef = baseType.GetDefinition(); ITypeDefinition baseTypeDef = baseType.GetDefinition();
if ((baseTypeDef != null) && (baseTypeDef.FullName != "System.Object")) { if ((baseTypeDef != null)) {
ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(currentTypeDef, baseTypeDef); ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(currentTypeDef, baseTypeDef);
if (baseTypeModel != null) if (baseTypeModel != null)
baseTypes.Add(baseTypeModel); baseTypes.Add(baseTypeModel);

20
src/Main/Base/Project/Dom/ClassBrowser/DerivedTypesTreeNode.cs

@ -20,6 +20,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
ITypeDefinitionModel definition; ITypeDefinitionModel definition;
string text; string text;
bool childrenLoaded;
SimpleModelCollection<ITypeDefinitionModel> derivedTypes; SimpleModelCollection<ITypeDefinitionModel> derivedTypes;
public DerivedTypesTreeNode(ITypeDefinitionModel definition) public DerivedTypesTreeNode(ITypeDefinitionModel definition)
@ -30,11 +31,15 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
this.definition.Updated += (sender, e) => UpdateDerivedTypes(); this.definition.Updated += (sender, e) => UpdateDerivedTypes();
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.DerivedTypes"); this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.DerivedTypes");
derivedTypes = new SimpleModelCollection<ITypeDefinitionModel>(); derivedTypes = new SimpleModelCollection<ITypeDefinitionModel>();
UpdateDerivedTypes(); childrenLoaded = false;
} }
protected override IModelCollection<object> ModelChildren { protected override IModelCollection<object> ModelChildren {
get { get {
if (!childrenLoaded) {
UpdateDerivedTypes();
childrenLoaded = true;
}
return derivedTypes; return derivedTypes;
} }
} }
@ -47,7 +52,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public bool HasDerivedTypes() public bool HasDerivedTypes()
{ {
return derivedTypes.Count > 0; ITypeDefinition currentTypeDef = definition.Resolve();
// TODO Searching for derived types every time just to get children count might be too expensive
return (currentTypeDef != null) && (FindReferenceService.FindDerivedTypes(currentTypeDef, true).Count > 0);
} }
void UpdateDerivedTypes() void UpdateDerivedTypes()
@ -60,15 +67,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (derivedTypeModel != null) if (derivedTypeModel != null)
derivedTypes.Add(derivedTypeModel); derivedTypes.Add(derivedTypeModel);
} }
// foreach (var baseType in currentTypeDef.DirectBaseTypes) {
// ITypeDefinition baseTypeDef = baseType.GetDefinition();
// if ((baseTypeDef != null) && (baseTypeDef.FullName != "System.Object")) {
// ITypeDefinitionModel baseTypeModel = GetTypeDefinitionModel(currentTypeDef, baseTypeDef);
// if (baseTypeModel != null)
// derivedTypes.Add(baseTypeModel);
// }
// }
} }
} }

Loading…
Cancel
Save