Exemplo n.º 1
0
        protected ResolveResult Resolve(string code)
        {
            CompilationUnit cu = new CSharpParser().Parse(new StringReader(code.Replace("$", "")));

            TextLocation[] dollars = FindDollarSigns(code).ToArray();
            Assert.AreEqual(2, dollars.Length, "Expected 2 dollar signs marking start+end of desired node");

            SetUp();

            CSharpParsedFile         parsedFile     = new CSharpParsedFile("test.cs", resolver.CurrentUsingScope);
            TypeSystemConvertVisitor convertVisitor = new TypeSystemConvertVisitor(parsedFile, resolver.CurrentUsingScope, null);

            cu.AcceptVisitor(convertVisitor, null);
            project.UpdateProjectContent(null, convertVisitor.ParsedFile);

            FindNodeVisitor fnv = new FindNodeVisitor(dollars[0], dollars[1]);

            cu.AcceptVisitor(fnv, null);
            Assert.IsNotNull(fnv.ResultNode, "Did not find DOM node at the specified location");

            Debug.WriteLine(new string('=', 70));
            Debug.WriteLine("Starting new resolver for " + fnv.ResultNode);

            var           navigator = new NodeListResolveVisitorNavigator(new[] { fnv.ResultNode });
            ResolveResult rr;

            using (var context = this.context.Synchronize()) {
                ResolveVisitor rv = new ResolveVisitor(new CSharpResolver(context), convertVisitor.ParsedFile, navigator);
                rv.Scan(cu);
                rr = rv.GetResolveResult(fnv.ResultNode);
            }
            Assert.IsNotNull(rr, "ResolveResult is null - did something go wrong while navigating to the target node?");
            Debug.WriteLine("ResolveResult is " + rr);
            return(rr);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Resolves the specified node.
 /// </summary>
 public ResolveResult Resolve(AstNode node, CancellationToken cancellationToken = default(CancellationToken))
 {
     if (node == null || node.IsNull)
     {
         return(ErrorResolveResult.UnknownError);
     }
     InitResolver(node);
     lock (resolveVisitor) {
         ResolveResult rr = resolveVisitor.GetResolveResult(node);
         Debug.Assert(rr != null);
         return(rr);
     }
 }
Exemplo n.º 3
0
 /// <summary>
 /// Resolves the specified node.
 /// </summary>
 public ResolveResult Resolve(AstNode node, CancellationToken cancellationToken = default(CancellationToken))
 {
     if (node == null || node.IsNull || IsUnresolvableNode(node))
     {
         return(ErrorResolveResult.UnknownError);
     }
     InitResolver();
     resolveVisitor.cancellationToken = cancellationToken;
     try {
         ResolveResult rr = resolveVisitor.GetResolveResult(node);
         Debug.Assert(rr != null);
         return(rr);
     } finally {
         resolveVisitor.cancellationToken = CancellationToken.None;
     }
 }
Exemplo n.º 4
0
 /// <summary>
 /// Resolves the specified node.
 /// </summary>
 public ResolveResult Resolve(AstNode node, CancellationToken cancellationToken = default(CancellationToken))
 {
     if (node == null || node.IsNull || IsUnresolvableNode(node))
     {
         return(ErrorResolveResult.UnknownError);
     }
     lock (resolveVisitor) {
         InitResolver();
         resolveVisitor.cancellationToken = cancellationToken;
         try {
             ResolveResult rr = resolveVisitor.GetResolveResult(node);
             if (rr == null)
             {
                 Debug.Fail(node.GetType() + " resolved to null.", node.StartLocation + ":'" + node.GetText() + "'");
             }
             return(rr);
         } finally {
             resolveVisitor.cancellationToken = CancellationToken.None;
         }
     }
 }
Exemplo n.º 5
0
        public static ResolveResult Resolve(ITypeResolveContext context, CSharpParsedFile parsedFile, CompilationUnit cu, TextLocation location,
                                            CancellationToken cancellationToken = default(CancellationToken))
        {
            AstNode node = cu.GetNodeAt(location);

            if (node == null)
            {
                return(null);
            }
            AstNode resolvableNode;

            if (node is AstType)
            {
                resolvableNode = node;
                if (resolvableNode.Parent is ComposedType)
                {
                    while (resolvableNode.Parent is ComposedType)
                    {
                        resolvableNode = resolvableNode.Parent;
                    }
                    //node is preffered over the resolvable node. Which shouldn't be done in the case of nullables, arrays etc.
                    node = resolvableNode;
                }
            }
            else if (node is Identifier)
            {
                resolvableNode = node.Parent;
            }
            else if (node.NodeType == NodeType.Token)
            {
                if (node.Parent is ConstructorInitializer)
                {
                    resolvableNode = node.Parent;
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                // don't resolve arbitrary nodes - we don't want to show tooltips for everything
                return(null);
            }

            InvocationExpression parentInvocation = null;

            if ((resolvableNode is IdentifierExpression || resolvableNode is MemberReferenceExpression || resolvableNode is PointerReferenceExpression))
            {
                // we also need to resolve the invocation
                parentInvocation = resolvableNode.Parent as InvocationExpression;
            }

            IResolveVisitorNavigator navigator;

            if (parentInvocation != null)
            {
                navigator = new NodeListResolveVisitorNavigator(new[] { resolvableNode, parentInvocation });
            }
            else
            {
                navigator = new NodeListResolveVisitorNavigator(new[] { resolvableNode });
            }

            using (var ctx = context.Synchronize()) {
                CSharpResolver resolver = new CSharpResolver(ctx, cancellationToken);
                ResolveVisitor v        = new ResolveVisitor(resolver, parsedFile, navigator);
                v.Scan(cu);

                // Prefer the RR from the token itself, if it was assigned a ResolveResult
                // (this can happen with the identifiers in various nodes such as catch clauses or foreach statements)
                ResolveResult rr = v.GetResolveResult(node) ?? v.GetResolveResult(resolvableNode);
                if (rr is MethodGroupResolveResult && parentInvocation != null)
                {
                    return(v.GetResolveResult(parentInvocation));
                }
                else
                {
                    return(rr);
                }
            }
        }