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;
		}
Пример #2
0
        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);
        }