File: ProjectSystemShim\CSharpProjectShim.ICSharpVenusProjectSite.cs
Web Access
Project: src\src\VisualStudio\CSharp\Impl\Microsoft.VisualStudio.LanguageServices.CSharp_klvi2agp_wpftmp.csproj (Microsoft.VisualStudio.LanguageServices.CSharp)
// 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.
 
#nullable disable
 
using System;
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.VisualStudio.LanguageServices.CSharp.ProjectSystemShim.Interop;
 
namespace Microsoft.VisualStudio.LanguageServices.CSharp.ProjectSystemShim;
 
internal partial class CSharpProjectShim : ICSharpVenusProjectSite
{
    public void AddReferenceToCodeDirectory(string assemblyFileName, ICSharpProjectRoot project)
        => AddReferenceToCodeDirectoryEx(assemblyFileName, project, CompilerOptions.OPTID_IMPORTS);
 
    public void RemoveReferenceToCodeDirectory(string assemblyFileName, ICSharpProjectRoot project)
    {
        var projectSite = GetProjectSite(project);
 
        var projectReferencesToRemove = ProjectSystemProject.GetProjectReferences().Where(p => p.ProjectId == projectSite.ProjectSystemProject.Id).ToList();
 
        if (projectReferencesToRemove.Count == 0)
        {
            throw new ArgumentException($"The project {nameof(project)} is not currently referenced by this project.");
        }
 
        foreach (var projectReferenceToRemove in projectReferencesToRemove)
        {
            ProjectSystemProject.RemoveProjectReference(new ProjectReference(projectSite.ProjectSystemProject.Id));
        }
    }
 
    public void OnDiskFileUpdated(string filename, ref System.Runtime.InteropServices.ComTypes.FILETIME pFT)
        => throw new NotImplementedException();
 
    public void OnCodeDirectoryAliasesChanged(ICSharpProjectRoot project, int previousAliasesCount, string[] previousAliases, int currentAliasesCount, string[] currentAliases)
    {
        var projectSite = GetProjectSite(project);
 
        using (ProjectSystemProject.CreateBatchScope())
        {
            var existingProjectReference = ProjectSystemProject.GetProjectReferences().Single(p => p.ProjectId == projectSite.ProjectSystemProject.Id);
 
            ProjectSystemProject.RemoveProjectReference(existingProjectReference);
            ProjectSystemProject.AddProjectReference(new ProjectReference(existingProjectReference.ProjectId, ImmutableArray.Create(currentAliases), existingProjectReference.EmbedInteropTypes));
        }
    }
 
    public void AddReferenceToCodeDirectoryEx(string assemblyFileName, ICSharpProjectRoot projectRoot, CompilerOptions optionID)
    {
        var projectSite = GetProjectSite(projectRoot);
 
        ProjectSystemProject.AddProjectReference(new ProjectReference(projectSite.ProjectSystemProject.Id, embedInteropTypes: optionID == CompilerOptions.OPTID_IMPORTSUSINGNOPIA));
    }
 
    /// <summary>
    /// Given a ICSharpProjectRoot instance, it returns the ProjectSite instance, throwing if it
    /// could not be obtained.
    /// </summary>
    private static CSharpProjectShim GetProjectSite(ICSharpProjectRoot project)
    {
        // Get the host back for the project
        var projectSiteGuid = typeof(ICSharpProjectSite).GUID;
 
        // We should have gotten a ProjectSite back. If we didn't, that means we're being given
        // a project site that we didn't get BindToProject called on first which is a no-no by
        // the project system.
        if (project.GetProjectSite(ref projectSiteGuid) is not CSharpProjectShim projectSite)
        {
            throw new ArgumentException($"{project} was not properly sited with the language service.", nameof(project));
        }
 
        return projectSite;
    }
}