MemberReference GetReference (Project project, ResolveResult result, AstNode node, SyntaxTree syntaxTree, string fileName, Mono.TextEditor.TextEditorData editor) { AstNode originalNode = node; if (result == null) return null; object valid = null; if (result is MethodGroupResolveResult) { valid = ((MethodGroupResolveResult)result).Methods.FirstOrDefault ( m => searchedMembers.Any (member => member is IMethod && ((IMethod)member).Region == m.Region)); } else if (result is MemberResolveResult) { var foundMember = ((MemberResolveResult)result).Member; valid = searchedMembers.FirstOrDefault ( member => member is IMember && ((IMember)member).Region == foundMember.Region); } else if (result is NamespaceResolveResult) { var ns = ((NamespaceResolveResult)result).Namespace; valid = searchedMembers.FirstOrDefault (n => n is INamespace && ns.FullName.StartsWith (((INamespace)n).FullName, StringComparison.Ordinal)); if (!(node is NamespaceDeclaration)) goto skip; } else if (result is LocalResolveResult) { var ns = ((LocalResolveResult)result).Variable; valid = searchedMembers.FirstOrDefault (n => n is IVariable && ((IVariable)n).Region == ns.Region); } else if (result is TypeResolveResult) { valid = searchedMembers.FirstOrDefault (n => n is IType); } if (node is ConstructorInitializer) return null; if (node is ObjectCreateExpression) node = ((ObjectCreateExpression)node).Type; if (node is IndexerDeclaration) node = ((IndexerDeclaration)node).ThisToken; if (node is InvocationExpression) node = ((InvocationExpression)node).Target; if (node is MemberReferenceExpression) node = ((MemberReferenceExpression)node).MemberNameToken; if (node is SimpleType) node = ((SimpleType)node).IdentifierToken; if (node is MemberType) node = ((MemberType)node).MemberNameToken; if (node is NamespaceDeclaration) { var nsd = ((NamespaceDeclaration)node); node = nsd.NamespaceName; if (node == null) return null; } if (node is TypeDeclaration && (searchedMembers.First () is IType)) node = ((TypeDeclaration)node).NameToken; if (node is DelegateDeclaration) node = ((DelegateDeclaration)node).NameToken; if (node is EntityDeclaration && (searchedMembers.First () is IMember)) node = ((EntityDeclaration)node).NameToken; if (node is ParameterDeclaration && (searchedMembers.First () is IParameter)) node = ((ParameterDeclaration)node).NameToken; if (node is ConstructorDeclaration) node = ((ConstructorDeclaration)node).NameToken; if (node is DestructorDeclaration) node = ((DestructorDeclaration)node).NameToken; if (node is NamedArgumentExpression) node = ((NamedArgumentExpression)node).NameToken; if (node is NamedExpression) node = ((NamedExpression)node).NameToken; if (node is VariableInitializer) node = ((VariableInitializer)node).NameToken; if (node is IdentifierExpression) { node = ((IdentifierExpression)node).IdentifierToken; } skip: var region = new DomRegion (fileName, node.StartLocation, node.EndLocation); var length = node is PrimitiveType ? keywordName.Length : node.EndLocation.Column - node.StartLocation.Column; if (valid == null) valid = searchedMembers.FirstOrDefault (); var reference = new CSharpMemberReference (project, originalNode, syntaxTree, valid, region, editor.LocationToOffset (region.Begin), length); reference.ReferenceUsageType = GetUsage (originalNode); return reference; }
MemberReference GetReference(Project project, ResolveResult result, AstNode node, SyntaxTree syntaxTree, string fileName, Mono.TextEditor.TextEditorData editor) { AstNode originalNode = node; if (result == null) { return(null); } object valid = null; if (result is MethodGroupResolveResult) { valid = ((MethodGroupResolveResult)result).Methods.FirstOrDefault( m => searchedMembers.Any(member => member is IMethod && ((IMethod)member).Region == m.Region)); } else if (result is MemberResolveResult) { var foundMember = ((MemberResolveResult)result).Member; valid = searchedMembers.FirstOrDefault( member => member is IMember && ((IMember)member).Region == foundMember.Region); } else if (result is NamespaceResolveResult) { var ns = ((NamespaceResolveResult)result).Namespace; valid = searchedMembers.FirstOrDefault(n => n is INamespace && ns.FullName.StartsWith(((INamespace)n).FullName, StringComparison.Ordinal)); if (!(node is NamespaceDeclaration)) { goto skip; } } else if (result is LocalResolveResult) { var ns = ((LocalResolveResult)result).Variable; valid = searchedMembers.FirstOrDefault(n => n is IVariable && ((IVariable)n).Region == ns.Region); } else if (result is TypeResolveResult) { valid = searchedMembers.FirstOrDefault(n => n is IType); } if (node is ConstructorInitializer) { return(null); } if (node is ObjectCreateExpression) { node = ((ObjectCreateExpression)node).Type; } if (node is IndexerDeclaration) { node = ((IndexerDeclaration)node).ThisToken; } if (node is InvocationExpression) { node = ((InvocationExpression)node).Target; } if (node is MemberReferenceExpression) { node = ((MemberReferenceExpression)node).MemberNameToken; } if (node is SimpleType) { node = ((SimpleType)node).IdentifierToken; } if (node is MemberType) { node = ((MemberType)node).MemberNameToken; } if (node is NamespaceDeclaration) { var nsd = ((NamespaceDeclaration)node); node = nsd.NamespaceName; if (node == null) { return(null); } } if (node is TypeDeclaration && (searchedMembers.First() is IType)) { node = ((TypeDeclaration)node).NameToken; } if (node is DelegateDeclaration) { node = ((DelegateDeclaration)node).NameToken; } if (node is EntityDeclaration && (searchedMembers.First() is IMember)) { node = ((EntityDeclaration)node).NameToken; } if (node is ParameterDeclaration && (searchedMembers.First() is IParameter)) { node = ((ParameterDeclaration)node).NameToken; } if (node is ConstructorDeclaration) { node = ((ConstructorDeclaration)node).NameToken; } if (node is DestructorDeclaration) { node = ((DestructorDeclaration)node).NameToken; } if (node is NamedArgumentExpression) { node = ((NamedArgumentExpression)node).NameToken; } if (node is NamedExpression) { node = ((NamedExpression)node).NameToken; } if (node is VariableInitializer) { node = ((VariableInitializer)node).NameToken; } if (node is IdentifierExpression) { node = ((IdentifierExpression)node).IdentifierToken; } skip: var region = new DomRegion(fileName, node.StartLocation, node.EndLocation); var length = node is PrimitiveType ? keywordName.Length : node.EndLocation.Column - node.StartLocation.Column; if (valid == null) { valid = searchedMembers.FirstOrDefault(); } var reference = new CSharpMemberReference(project, originalNode, syntaxTree, valid, region, editor.LocationToOffset(region.Begin), length); reference.ReferenceUsageType = GetUsage(originalNode); return(reference); }