public void ResolveDeclarationTest(
            string nameSpace, string name, string ctxNameSpace, string usingNameSpace, string nameToResolve, bool expectedMatch)
        {
            var declaration = DeclarationHelper.SetupDeclaration <IDeclaration <SyntaxNode> >(nameSpace, name);

            var contextDeclaration = DeclarationHelper.SetupDeclaration <IDeclaration <SyntaxNode> >(ctxNameSpace, "ctxName", m =>
            {
                var usingDirectives = string.IsNullOrEmpty(usingNameSpace) ? Array.Empty <string>() : new[] { usingNameSpace };
                m.SetupGet(d => d.UsingDirectives).Returns(usingDirectives);
            });

            var declResolver = new DeclarationResolver(new[] { declaration }, (r, d) => { });

            var resolvedDecl = declResolver.Resolve(nameToResolve, contextDeclaration);

            if (expectedMatch)
            {
                Assert.NotNull(resolvedDecl);
                Assert.Same(declaration, resolvedDecl);
            }
            else
            {
                Assert.Null(resolvedDecl);
            }
        }
        /// <inheritdoc/>
        public IDeclarationResolver DeepLoad()
        {
            var declarations = this.Assemblies.SelectMany(a => a.Declarations)
                               .Concat(this.Files.SelectMany(f => f.Declarations));
            var resolver = new DeclarationResolver(declarations, this.loader.Load);

            resolver.Load();

            return(resolver);
        }
        public void FindDeclarationTest()
        {
            var declaration = DeclarationHelper.SetupDeclaration <IDeclaration <SyntaxNode> >("ns", "name");

            var declResolver = new DeclarationResolver(new[] { declaration }, null);

            var fundDecl = Assert.Single(declResolver.Find(declaration.FullName));

            Assert.Same(declaration, fundDecl);

            Assert.Null(declResolver.Find("unknown"));
        }
        public void ResolveGenericDeclarationTest(
            string nameSpace, string name, string nameParam, string ctxNameSpace, string usingNameSpace, string nameToResolve, bool expectedMatch)
        {
            var genericParameter   = Mock.Of <IGenericParameterDeclaration>();
            var genericDeclaration = DeclarationHelper.SetupDeclaration <IGenericDeclaration <SyntaxNode> >(nameSpace, name, mock =>
            {
                mock.SetupGet(x => x.GenericParameters).Returns(new[] { genericParameter });
            });

            var contextDeclaration = DeclarationHelper.SetupDeclaration <IDeclaration <SyntaxNode> >(ctxNameSpace, "ctxName", m =>
            {
                var usingDirectives = string.IsNullOrEmpty(usingNameSpace) ? Array.Empty <string>() : new[] { usingNameSpace };
                m.SetupGet(d => d.UsingDirectives).Returns(usingDirectives);
            });

            var declarationParam     = DeclarationHelper.SetupDeclaration <IDeclaration <SyntaxNode> >(nameSpace, nameParam);
            var declarationParamUse1 = DeclarationHelper.SetupDeclarationUse <IDeclarationUse <SyntaxNode> >(declarationParam);
            var declarationParamUse2 = DeclarationHelper.SetupDeclarationUse <IDeclarationUse <SyntaxNode> >(declarationParam);

            var declResolver = new DeclarationResolver(new[] { genericDeclaration }, (r, d) => { });

            var resolvedGenericDecl1 = declResolver.Resolve(
                nameToResolve,
                new[] { declarationParamUse1 },
                contextDeclaration);
            var resolvedGenericDecl2 = declResolver.Resolve(
                nameToResolve,
                new[] { declarationParamUse1, declarationParamUse2 },
                contextDeclaration);

            var resolvedDecl = declResolver.Resolve(nameToResolve, contextDeclaration);

            Assert.Null(resolvedDecl);
            Assert.Null(resolvedGenericDecl2);

            if (expectedMatch)
            {
                Assert.NotNull(resolvedGenericDecl1);
                Assert.Same(genericDeclaration, resolvedGenericDecl1);
            }
            else
            {
                Assert.Null(resolvedGenericDecl1);
            }
        }