internal async Task<IEnumerable<ISymbol>> GetMatchingNamespacesAsync(
			Microsoft.CodeAnalysis.Project project,
			SemanticModel semanticModel,
			SyntaxNode simpleName,
			CancellationToken cancellationToken)
		{
			if (simpleName.IsAttributeName())
			{
				return null;
			}

			string name;
			int arity;
			simpleName.GetNameAndArityOfSimpleName(out name, out arity);
			if (cancellationToken.IsCancellationRequested)
			{
				return null;
			}

			var symbols = await SymbolFinder.FindDeclarationsAsync(project, name, this.IgnoreCase, SymbolFilter.Namespace, cancellationToken).ConfigureAwait(false);

			var namespaces = symbols
				.OfType<INamespaceSymbol>()
				.Where(n => !n.IsGlobalNamespace &&
					HasAccessibleTypes(n, semanticModel, cancellationToken));

			return namespaces;
		}
		internal async Task<IEnumerable<ISymbol>> GetMatchingTypesAsync(
			Microsoft.CodeAnalysis.Project project, SemanticModel semanticModel, SyntaxNode node, CancellationToken cancellationToken)
		{
			// Can't be on the right hand side of binary expression (like 'dot').
			cancellationToken.ThrowIfCancellationRequested();
			string name;
			int arity;
			node.GetNameAndArityOfSimpleName(out name, out arity);

			var symbols = await SymbolFinder.FindDeclarationsAsync(project, name, this.IgnoreCase, SymbolFilter.Type, cancellationToken).ConfigureAwait(false);

			// also lookup type symbols with the "Attribute" suffix.
			var inAttributeContext = node.IsAttributeName();
			if (inAttributeContext)
			{
				symbols = symbols.Concat(
					await SymbolFinder.FindDeclarationsAsync(project, name + "Attribute", this.IgnoreCase, SymbolFilter.Type, cancellationToken).ConfigureAwait(false));
			}

			var accessibleTypeSymbols = symbols
				.OfType<INamedTypeSymbol>()
				.Where(s => (arity == 0 || s.GetArity() == arity)
					&& s.IsAccessibleWithin(semanticModel.Compilation.Assembly)
					&& (!inAttributeContext || s.IsAttribute())
					&& HasValidContainer(s))
				.ToList();

			return accessibleTypeSymbols;
		}
		private static void CalculateContext(SyntaxNode node, out string name, out int arity, out bool inAttributeContext, out bool hasIncompleteParentMember)
		{
			// Has to be a simple identifier or generic name.
			node.GetNameAndArityOfSimpleName(out name, out arity);

			inAttributeContext = node.IsAttributeName();
			hasIncompleteParentMember = node.HasIncompleteParentMember();
		}
		private async Task<IEnumerable<IMethodSymbol>> GetAddMethodsAsync(
			Microsoft.CodeAnalysis.Project project,
			Diagnostic diagnostic,
			SyntaxNode node,
			SemanticModel semanticModel,
			ISet<INamespaceSymbol> namespacesInScope,
			SyntaxNode expression,
			CancellationToken cancellationToken)
		{
			string name;
			int arity;
			node.GetNameAndArityOfSimpleName(out name, out arity);
			if (name != null)
			{
				return SpecializedCollections.EmptyEnumerable<IMethodSymbol>();
			}

			if (IsAddMethodContext(node, semanticModel))
			{
				var symbols = await SymbolFinder.FindDeclarationsAsync(project, "Add", this.IgnoreCase, SymbolFilter.Member, cancellationToken).ConfigureAwait(false);
				return symbols
					.OfType<IMethodSymbol>()
					.Where(method => method.IsExtensionMethod &&
						method.ContainingType?.IsAccessibleWithin(semanticModel.Compilation.Assembly) == true &&
						IsViableExtensionMethod(method, expression, semanticModel,  cancellationToken));
			}

			return SpecializedCollections.EmptyEnumerable<IMethodSymbol>();
		}
		private Task<IEnumerable<ISymbol>> GetSymbolsAsync(
			Microsoft.CodeAnalysis.Project project,
			SyntaxNode node,
			SemanticModel semanticModel,
			CancellationToken cancellationToken)
		{
			cancellationToken.ThrowIfCancellationRequested();

			// See if the name binds.  If it does, there's nothing further we need to do.
			if (ExpressionBinds(node, semanticModel, cancellationToken, checkForExtensionMethods: true))
			{
				return Task.FromResult (Enumerable.Empty<ISymbol>());
			}

			string name;
			int arity;
			node.GetNameAndArityOfSimpleName(out name, out arity);
			if (name == null)
			{
				return Task.FromResult (Enumerable.Empty<ISymbol>());
			}

			return SymbolFinder.FindDeclarationsAsync(project, name, this.IgnoreCase, SymbolFilter.Member, cancellationToken);
		}
		private async Task<IEnumerable<INamespaceSymbol>> GetNamespacesForMatchingNamespacesAsync(
			Microsoft.CodeAnalysis.Project project,
			Diagnostic diagnostic,
			SyntaxNode node,
			SemanticModel semanticModel,
			ISet<INamespaceSymbol> namespacesInScope,
			CancellationToken cancellationToken)
		{
			if (!this.CanAddImportForNamespace(diagnostic, ref node))
			{
				return null;
			}

			string name;
			int arity;
			node.GetNameAndArityOfSimpleName(out name, out arity);

			if (ExpressionBinds(node, semanticModel, cancellationToken))
			{
				return null;
			}

			var symbols = await SymbolFinder.FindDeclarationsAsync(
				project, name, this.IgnoreCase, SymbolFilter.Namespace, cancellationToken).ConfigureAwait(false);

			return GetProposedNamespaces(
				symbols.OfType<INamespaceSymbol>().Select(n => n.ContainingNamespace),
				semanticModel,
				namespacesInScope);
		}