/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/EditorFeatures/Test/UnusedReferences/ProjectAssets/TestProjectAssetsFile.cs
101 строка
4 KB
Cyrus Najmabadi
Move to file scoped namespace in tests
22 май 2024, 08:24
22 май 2024, 08:24
8ab847c
Код
Авторство
О чём код?
// 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.Collections.Generic; using System.Collections.Immutable; using System.IO; using System.Linq; using Microsoft.CodeAnalysis.UnusedReferences; using Microsoft.CodeAnalysis.UnusedReferences.ProjectAssets; namespace Microsoft.CodeAnalysis.Editor.UnitTests.UnusedReferences.ProjectAssets; internal static partial class TestProjectAssetsFile { public static ProjectAssetsFile Create(int version, string targetFramework, ImmutableArray<ReferenceInfo> references) { var allReferences = new List<ReferenceInfo>(); FlattenReferences(references, allReferences); var libraries = BuildLibraries(allReferences); var targets = BuildTargets(targetFramework, allReferences); var project = BuildProject(targetFramework); var projectAssets = new ProjectAssetsFile() { Version = version, Targets = targets, Libraries = libraries, Project = project }; return projectAssets; } private static void FlattenReferences(ImmutableArray<ReferenceInfo> references, List<ReferenceInfo> allReferences) { foreach (var reference in references) FlattenReference(reference, allReferences); } private static void FlattenReference(ReferenceInfo reference, List<ReferenceInfo> allReferences) { allReferences.Add(reference); FlattenReferences(reference.Dependencies, allReferences); } private static Dictionary<string, ProjectAssetsLibrary> BuildLibraries(List<ReferenceInfo> references) { var libraries = new Dictionary<string, ProjectAssetsLibrary>(); foreach (var reference in references) { var library = new ProjectAssetsLibrary() { Path = reference.ItemSpecification }; libraries.Add(Path.GetFileNameWithoutExtension(library.Path), library); } return libraries; } private static Dictionary<string, Dictionary<string, ProjectAssetsTargetLibrary>> BuildTargets(string targetFramework, List<ReferenceInfo> references) { var libraries = new Dictionary<string, ProjectAssetsTargetLibrary>(); foreach (var reference in references) { var dependencies = BuildDependencies(reference.Dependencies); var library = new ProjectAssetsTargetLibrary() { Type = GetLibraryType(reference.ReferenceType), Compile = new Dictionary<string, ProjectAssetsTargetLibraryCompile>() { { Path.ChangeExtension(reference.ItemSpecification, "dll"), new ProjectAssetsTargetLibraryCompile() } }, Dependencies = dependencies }; libraries[Path.GetFileNameWithoutExtension(reference.ItemSpecification)] = library; } return new Dictionary<string, Dictionary<string, ProjectAssetsTargetLibrary>>() { { targetFramework, libraries } }; } private static string GetLibraryType(ReferenceType referenceType) { return referenceType switch { ReferenceType.Package => "package", ReferenceType.Project => "project", _ => "assembly" }; } private static Dictionary<string, string> BuildDependencies(ImmutableArray<ReferenceInfo> references) { return references.ToDictionary(reference => Path.GetFileNameWithoutExtension(reference.ItemSpecification), reference => string.Empty); } private static ProjectAssetsProject BuildProject(string targetFramework) { // Frameworks won't always specify a set of dependencies. // This ensures the project asset reader does not error in these cases. return new ProjectAssetsProject() { Frameworks = new Dictionary<string, ProjectAssetsProjectFramework>() { { targetFramework, new ProjectAssetsProjectFramework() } } }; } }