/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/VisualStudio/CSharp/Impl/ProjectSystemShim/CSharpProjectShim.ICSharpVenusProjectSite.cs
79 строк
4 KB
Cyrus Najmabadi
Use file scoped namespaces. (#77854)
27 мар 2025, 09:55
Не верифицирован
27 мар 2025, 09:55
98d41b8
Код
Авторство
О чём код?
// 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; } }