File: Completion\CompletionProviders\InternalsVisibleToCompletionProvider.cs
Web Access
Project: src\src\Features\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.Features.csproj (Microsoft.CodeAnalysis.CSharp.Features)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using System.Collections.Immutable;
using System.Composition;
using Microsoft.CodeAnalysis.Completion;
using Microsoft.CodeAnalysis.Completion.Providers;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers;
 
[ExportCompletionProvider(nameof(InternalsVisibleToCompletionProvider), LanguageNames.CSharp)]
[ExtensionOrder(After = nameof(DeclarationNameCompletionProvider))]
[Shared]
internal sealed class InternalsVisibleToCompletionProvider : AbstractInternalsVisibleToCompletionProvider
{
    [ImportingConstructor]
    [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
    public InternalsVisibleToCompletionProvider()
    {
    }
 
    internal override string Language => LanguageNames.CSharp;
 
    protected override IImmutableList<SyntaxNode> GetAssemblyScopedAttributeSyntaxNodesOfDocument(SyntaxNode documentRoot)
    {
        var builder = (ImmutableList<SyntaxNode>.Builder?)null;
        if (documentRoot is CompilationUnitSyntax compilationUnit)
        {
            foreach (var attributeList in compilationUnit.AttributeLists)
            {
                // For most documents the compilationUnit.AttributeLists should be empty.
                // Therefore we delay initialization of the builder
                builder ??= ImmutableList.CreateBuilder<SyntaxNode>();
                builder.AddRange(attributeList.Attributes);
            }
        }
 
        return builder == null
            ? []
            : builder.ToImmutable();
    }
 
    protected override SyntaxNode? GetConstructorArgumentOfInternalsVisibleToAttribute(SyntaxNode internalsVisibleToAttribute)
    {
        var arguments = ((AttributeSyntax)internalsVisibleToAttribute).ArgumentList!.Arguments;
        // InternalsVisibleTo has only one constructor argument. 
        // https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.internalsvisibletoattribute(v=vs.110).aspx
        // We can assume that this is the assemblyName argument.
        return arguments.Count > 0
            ? arguments[0].Expression
            : null;
    }
 
    protected override bool ShouldTriggerAfterQuotes(SourceText text, int insertedCharacterPosition)
        => CompletionUtilities.IsStartingNewWord(text, insertedCharacterPosition);
}