Browse Source

Fix: "Open in Class Browser" didn't navigate correctly to constructors and overloaded methods.

pull/315/head
Andreas Weizel 12 years ago
parent
commit
001f548f85
  1. 48
      src/Main/Base/Project/Dom/ClassBrowser/ClassBrowserTreeView.cs

48
src/Main/Base/Project/Dom/ClassBrowser/ClassBrowserTreeView.cs

@ -170,29 +170,67 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -170,29 +170,67 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
// Ensure that we have children
nsTreeNode.EnsureLazyChildren();
ModelCollectionTreeNode entityTypeNode = null;
// Search in namespace node recursively
var foundEntityNode = nsTreeNode.FindChildNodeRecursively(
node => {
var treeNode = node as ModelCollectionTreeNode;
if (treeNode != null) {
if ((entity is ITypeDefinition) && (treeNode.Model is ITypeDefinitionModel)) {
// Compare directly with type
var modelFullTypeName = ((ITypeDefinitionModel) treeNode.Model).FullTypeName;
return modelFullTypeName == entityType.FullTypeName;
var treeNodeTypeModel = treeNode.Model as ITypeDefinitionModel;
if (treeNodeTypeModel != null) {
var modelFullTypeName = treeNodeTypeModel.FullTypeName;
if (modelFullTypeName == entityType.FullTypeName) {
// This is the TypeDefinitionModel of searched entity (the type itself or its member)
entityTypeNode = treeNode;
if (entity is ITypeDefinition) {
// We are looking for the type itself
return true;
}
}
}
if ((entity is IMember) && (treeNode.Model is IMemberModel)) {
// Compare parent types and member names
IMemberModel memberModel = (IMemberModel) treeNode.Model;
IMember member = (IMember) entity;
return (member.DeclaringType.FullName == entityType.FullName)
bool isSymbolOfTypeAndName =
(member.DeclaringType.FullName == memberModel.UnresolvedMember.DeclaringTypeDefinition.FullName)
&& (member.Name == memberModel.Name)
&& (member.SymbolKind == memberModel.SymbolKind);
if (isSymbolOfTypeAndName) {
var parametrizedEntityMember = member as IParameterizedMember;
var parametrizedTreeNodeMember = memberModel.UnresolvedMember as IUnresolvedParameterizedMember;
if ((parametrizedEntityMember != null) && (parametrizedTreeNodeMember != null)) {
// For methods and constructors additionally check the parameters and their types to handle overloading properly
int treeNodeParamsCount = parametrizedTreeNodeMember.Parameters != null ? parametrizedTreeNodeMember.Parameters.Count : 0;
int entityParamsCount = parametrizedEntityMember.Parameters != null ? parametrizedEntityMember.Parameters.Count : 0;
if (treeNodeParamsCount == entityParamsCount) {
for (int i = 0; i < entityParamsCount; i++) {
if (parametrizedEntityMember.Parameters[i].Type.FullName != parametrizedTreeNodeMember.Parameters[i].Type.Resolve(entityAssembly.Compilation).FullName) {
return false;
}
}
// All parameters were equal
return true;
}
} else {
return true;
}
}
}
}
return false;
});
// Special handling for default constructors: If not found, jump to type declaration instead
if ((foundEntityNode == null) && (entity.SymbolKind == SymbolKind.Constructor)) {
foundEntityNode = entityTypeNode;
}
if (foundEntityNode != null) {
this.FocusNode(foundEntityNode);
this.SelectedItem = foundEntityNode;

Loading…
Cancel
Save