TargetFrameworkUtil.cs 5.9 KB
Newer Older
J
Jared Parsons 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Text;
using Microsoft.CodeAnalysis;
using static TestReferences;

namespace Roslyn.Test.Utilities
{
    public enum TargetFramework
    {
        /// <summary>
        /// Explicit pick a target framework that has no references
        /// </summary>
J
Jared Parsons 已提交
17
        Empty,
J
Jared Parsons 已提交
18 19

        NetStandard20,
J
Jared Parsons 已提交
20
        WinRT,
J
Jared Parsons 已提交
21 22 23 24 25

        /// <summary>
        /// Eventually this will be deleted and replaced with NetStandard20. Short term this creates the "standard"
        /// API set across destkop and coreclr 
        /// </summary>
J
Jared Parsons 已提交
26
        Standard,
J
Jared Parsons 已提交
27
        StandardAndCSharp,
J
Jared Parsons 已提交
28

J
Jared Parsons 已提交
29 30 31 32 33 34 35 36
        /// <summary>
        /// This is represents the set of tests which must be mscorlib40 on desktop but full net standard on coreclr.
        /// </summary>
        StandardCompat,

        // The flavors of mscorlib we support + extending them with LINQ and dynamic.
        Mscorlib40,
        Mscorlib40Extended, 
J
Jared Parsons 已提交
37
        Mscorlib40AndSystemCore,
J
Jared Parsons 已提交
38 39
        Mscorlib45,
        Mscorlib45Extended,
J
Jared Parsons 已提交
40
        Mscorlib45AndCSharp,
J
Jared Parsons 已提交
41 42
        Mscorlib46,
        Mscorlib46Extended,
J
Jared Parsons 已提交
43 44 45 46
    }

    public static class TargetFrameworkUtil
    {
J
Jared Parsons 已提交
47 48
        public static MetadataReference StandardCSharpReference => CoreClrShim.IsRunningOnCoreClr ? TestBase.CSharpNetStandard10Ref : TestBase.CSharpDesktopRef;

J
Jared Parsons 已提交
49 50
        public static readonly ImmutableArray<MetadataReference> Mscorlib40References = ImmutableArray.Create(TestBase.MscorlibRef);
        public static readonly ImmutableArray<MetadataReference> Mscorlib40ExtendedReferences = ImmutableArray.Create(TestBase.MscorlibRef, TestBase.SystemRef, TestBase.SystemCoreRef, TestBase.ValueTupleRef, TestBase.SystemRuntimeFacadeRef);
J
Jared Parsons 已提交
51
        public static readonly ImmutableArray<MetadataReference> Mscorlib40andSystemCoreReferences = ImmutableArray.Create(TestBase.MscorlibRef, TestBase.SystemCoreRef);
J
Jared Parsons 已提交
52 53
        public static readonly ImmutableArray<MetadataReference> Mscorlib45References = ImmutableArray.Create(TestBase.MscorlibRef_v4_0_30316_17626);
        public static readonly ImmutableArray<MetadataReference> Mscorlib45ExtendedReferences = ImmutableArray.Create(TestBase.MscorlibRef_v4_0_30316_17626, TestBase.SystemRef, TestBase.SystemCoreRef, TestBase.ValueTupleRef, TestBase.SystemRuntimeFacadeRef);
J
Jared Parsons 已提交
54
        public static readonly ImmutableArray<MetadataReference> Mscorlib45AndCSharpReferences = ImmutableArray.Create(TestBase.MscorlibRef_v4_0_30316_17626, TestBase.SystemCoreRef, TestBase.CSharpRef);
J
Jared Parsons 已提交
55 56
        public static readonly ImmutableArray<MetadataReference> Mscorlib46References = ImmutableArray.Create(TestBase.MscorlibRef_v46);
        public static readonly ImmutableArray<MetadataReference> Mscorlib46ExtendedReferences = ImmutableArray.Create(TestBase.MscorlibRef_v46, TestBase.SystemRef_v46, TestBase.SystemCoreRef_v46, TestBase.ValueTupleRef, TestBase.SystemRuntimeFacadeRef);
J
Jared Parsons 已提交
57
        public static readonly ImmutableArray<MetadataReference> NetStandard20References = ImmutableArray.Create<MetadataReference>(NetStandard20.NetStandard, NetStandard20.MscorlibRef, NetStandard20.SystemRuntimeRef, NetStandard20.SystemDynamicRuntimeRef);
J
Jared Parsons 已提交
58
        public static readonly ImmutableArray<MetadataReference> WinRTReferences = ImmutableArray.Create(TestBase.WinRtRefs);
J
Jared Parsons 已提交
59
        public static readonly ImmutableArray<MetadataReference> StandardReferences = CoreClrShim.IsRunningOnCoreClr ? NetStandard20References : Mscorlib46ExtendedReferences;
J
Jared Parsons 已提交
60
        public static readonly ImmutableArray<MetadataReference> StandardAndCSharpReferences = StandardReferences.Add(StandardCSharpReference);
J
Jared Parsons 已提交
61
        public static readonly ImmutableArray<MetadataReference> StandardCompatReferences = CoreClrShim.IsRunningOnCoreClr ? NetStandard20References : Mscorlib40References;
J
Jared Parsons 已提交
62 63 64 65 66

        public static ImmutableArray<MetadataReference> GetReferences(TargetFramework tf)
        {
            switch (tf)
            {
J
Jared Parsons 已提交
67
                case TargetFramework.Empty: return ImmutableArray<MetadataReference>.Empty;
J
Jared Parsons 已提交
68 69
                case TargetFramework.Mscorlib40: return Mscorlib40References;
                case TargetFramework.Mscorlib40Extended: return Mscorlib40ExtendedReferences;
J
Jared Parsons 已提交
70
                case TargetFramework.Mscorlib40AndSystemCore: return Mscorlib40andSystemCoreReferences;
J
Jared Parsons 已提交
71 72
                case TargetFramework.Mscorlib45: return Mscorlib45References;
                case TargetFramework.Mscorlib45Extended: return Mscorlib45ExtendedReferences;
J
Jared Parsons 已提交
73
                case TargetFramework.Mscorlib45AndCSharp: return Mscorlib45AndCSharpReferences;
J
Jared Parsons 已提交
74 75
                case TargetFramework.Mscorlib46: return Mscorlib46References;
                case TargetFramework.Mscorlib46Extended: return Mscorlib46ExtendedReferences;
J
Jared Parsons 已提交
76
                case TargetFramework.NetStandard20: return NetStandard20References;
J
Jared Parsons 已提交
77
                case TargetFramework.WinRT: return WinRTReferences;
J
Jared Parsons 已提交
78
                case TargetFramework.Standard: return StandardReferences;
J
Jared Parsons 已提交
79
                case TargetFramework.StandardAndCSharp: return StandardAndCSharpReferences;
J
Jared Parsons 已提交
80
                case TargetFramework.StandardCompat: return StandardCompatReferences;
J
Jared Parsons 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
                default: throw new InvalidOperationException($"Unexpected target framework {tf}");
            }
        }

        public static ImmutableArray<MetadataReference> GetReferences(TargetFramework tf, IEnumerable<MetadataReference> additionalReferences)
        {
            var references = GetReferences(tf);
            if (additionalReferences == null)
            {
                return references;
            }

            foreach (var r in additionalReferences)
            {
                if (references.Contains(r))
                {
                    throw new Exception($"Duplicate reference detected {r.Display}");
                }
            }

            return references.AddRange(additionalReferences);
        }
    }
}