示例#1
0
 public Converter(UnconfiguredProject project, BaselineProject sdkBaselineProject, IProjectRootElement projectRootElement)
 {
     _project            = project ?? throw new ArgumentNullException(nameof(project));
     _sdkBaselineProject = sdkBaselineProject;
     _projectRootElement = projectRootElement ?? throw new ArgumentNullException(nameof(projectRootElement));
     _differs            = GetDiffers();
 }
示例#2
0
            static string GetBestTFM(BaselineProject baselineProject, bool keepCurrentTfm, string?specifiedTFM, bool usePreviewSDK)
            {
                if (string.IsNullOrWhiteSpace(specifiedTFM))
                {
                    // Let's figure this out, friends
                    var tfmForApps = TargetFrameworkHelper.FindHighestInstalledTargetFramework(usePreviewSDK);

                    if (keepCurrentTfm)
                    {
                        specifiedTFM = baselineProject.GetTfm();
                    }
                    else if (baselineProject.ProjectStyle == ProjectStyle.WindowsDesktop || baselineProject.ProjectStyle == ProjectStyle.MSTest)
                    {
                        specifiedTFM = tfmForApps;
                    }
                    else if (baselineProject.OutputType == ProjectOutputType.Library)
                    {
                        specifiedTFM = MSBuildFacts.Netstandard20;
                    }
                    else if (baselineProject.OutputType == ProjectOutputType.Exe)
                    {
                        specifiedTFM = tfmForApps;
                    }
                    else
                    {
                        // Default is to just use what exists in the project
                        specifiedTFM = baselineProject.GetTfm();
                    }
                }

                return(specifiedTFM);
            }
示例#3
0
 public Converter(UnconfiguredProject project, BaselineProject sdkBaselineProject,
                  IProjectRootElement projectRootElement, bool noBackup, bool forceRemoveCustomImports)
 {
     _project                  = project ?? throw new ArgumentNullException(nameof(project));
     _sdkBaselineProject       = sdkBaselineProject;
     _projectRootElement       = projectRootElement ?? throw new ArgumentNullException(nameof(projectRootElement));
     _noBackup                 = noBackup;
     _forceRemoveCustomImports = forceRemoveCustomImports;
     _differs                  = GetDiffers();
 }
示例#4
0
    public async Task <BaselineArtifacts> SetupBaseline(EnC.EditAndContinueCapabilities capabilities, CancellationToken ct = default)
    {
        InitMSBuild();
        BaselineProject baselineProject = await Microsoft.DotNet.HotReload.Utils.Generator.BaselineProject.Make(config, capabilities, ct);

        var baselineArtifacts = await baselineProject.PrepareBaseline(ct);

        Console.WriteLine("baseline ready");
        return(baselineArtifacts);
    }
示例#5
0
 public MSBuildConversionWorkspaceItem(IProjectRootElement root, UnconfiguredProject unconfiguredProject, BaselineProject baseline)
 {
     ProjectRootElement  = root;
     UnconfiguredProject = unconfiguredProject;
     SdkBaselineProject  = baseline;
 }
        public static IProjectRootElement RemoveDefaultedProperties(this IProjectRootElement projectRootElement, BaselineProject baselineProject, ImmutableDictionary <string, Differ> differs)
        {
            foreach (var propGroup in projectRootElement.PropertyGroups)
            {
                var configurationName = MSBuildHelpers.GetConfigurationName(propGroup.Condition);
                var propDiff          = differs[configurationName].GetPropertiesDiff();

                foreach (var prop in propGroup.Properties)
                {
                    // These properties were added to the baseline - so don't treat them as defaulted properties.
                    if (baselineProject.GlobalProperties.Contains(prop.Name, StringComparer.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    if (propDiff.DefaultedProperties.Select(p => p.Name).Contains(prop.Name, StringComparer.OrdinalIgnoreCase))
                    {
                        propGroup.RemoveChild(prop);
                    }
                }

                if (propGroup.Properties.Count == 0)
                {
                    projectRootElement.RemoveChild(propGroup);
                }
            }

            return(projectRootElement);
        }
        public static IProjectRootElement UpdateOutputTypeProperty(this IProjectRootElement projectRootElement, BaselineProject baselineProject)
        {
            var outputTypeNode = projectRootElement.GetOutputTypeNode();

            if (outputTypeNode != null)
            {
                outputTypeNode.Value = baselineProject.OutputType switch
                {
                    ProjectOutputType.Exe => MSBuildFacts.ExeOutputType,
                    ProjectOutputType.Library => MSBuildFacts.LibraryOutputType,
                    ProjectOutputType.WinExe => MSBuildFacts.WinExeOutputType,
                    _ => throw new InvalidOperationException("Unsupported output type: " + baselineProject.OutputType)
                };
            }
            return(projectRootElement);
        }
        public static IProjectRootElement ChangeImportsAndAddSdkAttribute(this IProjectRootElement projectRootElement, BaselineProject baselineProject)
        {
            foreach (var import in projectRootElement.Imports)
            {
                projectRootElement.RemoveChild(import);
            }

            if (baselineProject.ProjectStyle is ProjectStyle.WindowsDesktop && baselineProject.TargetTFM is MSBuildFacts.NetCoreApp31)
            {
                projectRootElement.Sdk = DesktopFacts.WinSDKAttribute;
            }
            else if (MSBuildHelpers.IsWeb(projectRootElement))
            {
                projectRootElement.Sdk = WebFacts.WebSDKAttribute;
            }
            else
            {
                projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute;
            }

            return(projectRootElement);
        }
        public static IProjectRootElement ChangeImports(this IProjectRootElement projectRootElement, BaselineProject baselineProject)
        {
            switch (baselineProject.ProjectStyle)
            {
            case ProjectStyle.Default:
            case ProjectStyle.DefaultSubset:
            case ProjectStyle.WindowsDesktop:
            case ProjectStyle.MSTest:
                foreach (var import in projectRootElement.Imports)
                {
                    projectRootElement.RemoveChild(import);
                }

                projectRootElement.Sdk = MSBuildHelpers.IsWinForms(projectRootElement) || MSBuildHelpers.IsWPF(projectRootElement) || MSBuildHelpers.IsDesktop(projectRootElement)
                        ? DesktopFacts.WinSDKAttribute
                        : MSBuildFacts.DefaultSDKAttribute;
                break;
            }

            return(projectRootElement);
        }
示例#10
0
        public static IProjectRootElement ChangeImportsAndAddSdkAttribute(this IProjectRootElement projectRootElement, BaselineProject baselineProject, bool forceRemoveCustomImports)
        {
            foreach (var import in projectRootElement.Imports)
            {
                if (!forceRemoveCustomImports)
                {
                    var fileName = Path.GetFileName(import.Project);
                    if (MSBuildFacts.PropsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase) ||
                        MSBuildFacts.TargetsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase))
                    {
                        projectRootElement.RemoveChild(import);
                    }
                    else if (!MSBuildFacts.ImportsToKeep.Contains(fileName, StringComparer.OrdinalIgnoreCase))
                    {
                        Console.WriteLine($"This project has an unrecognized custom import which may need reviewed after conversion: {fileName}");
                    }
                }
                else
                {
                    projectRootElement.RemoveChild(import);
                }
            }

            if (baselineProject.ProjectStyle is ProjectStyle.WindowsDesktop && baselineProject.TargetTFM is MSBuildFacts.NetCoreApp31)
            {
                projectRootElement.Sdk = DesktopFacts.WinSDKAttribute;
            }
            else if (MSBuildHelpers.IsAspNetCore(projectRootElement, baselineProject.TargetTFM))
            {
                // Libraries targeting .NET Framework can use the default SDK and still be used by NetFx callers.
                // However, web apps (as opposed to libraries) or libraries that are targeting .NET Core/.NET should use the web SDK.
                projectRootElement.Sdk = WebFacts.WebSDKAttribute;
            }
            else
            {
                projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute;
            }

            // Xamarin projects contain the Import line, not needed for .NET MAUI
            if ((baselineProject.ProjectStyle is ProjectStyle.XamarinDroid) || (baselineProject.ProjectStyle is ProjectStyle.XamariniOS))
            {
                foreach (var import in projectRootElement.Imports)
                {
                    if (XamarinFacts.UnnecessaryXamarinImports.Contains(import.Project, StringComparer.OrdinalIgnoreCase))
                    {
                        projectRootElement.RemoveChild(import);
                    }
                }
            }

            return(projectRootElement);
        }
        public static IProjectRootElement ChangeImports(this IProjectRootElement projectRootElement, BaselineProject baselineProject)
        {
            var projectStyle = baselineProject.ProjectStyle;

            if (projectStyle == ProjectStyle.Default || projectStyle == ProjectStyle.DefaultSubset || projectStyle == ProjectStyle.WindowsDesktop)
            {
                foreach (var import in projectRootElement.Imports)
                {
                    projectRootElement.RemoveChild(import);
                }

                if (MSBuildHelpers.IsWinForms(projectRootElement) || MSBuildHelpers.IsWPF(projectRootElement) || MSBuildHelpers.IsDesktop(projectRootElement))
                {
                    projectRootElement.Sdk = DesktopFacts.WinSDKAttribute;
                }
                else
                {
                    projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute;
                }
            }

            return(projectRootElement);
        }
        public static IProjectRootElement ChangeImportsAndAddSdkAttribute(this IProjectRootElement projectRootElement, BaselineProject baselineProject)
        {
            foreach (var import in projectRootElement.Imports)
            {
                var fileName = Path.GetFileName(import.Project);
                if (MSBuildFacts.PropsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase) ||
                    MSBuildFacts.TargetsToRemove.Contains(fileName, StringComparer.OrdinalIgnoreCase))
                {
                    projectRootElement.RemoveChild(import);
                }
                else if (!MSBuildFacts.ImportsToKeep.Contains(fileName, StringComparer.OrdinalIgnoreCase))
                {
                    Console.WriteLine($"This project has an unrecognized custom import which may need reviewed after conversion: {fileName}");
                }
            }

            if (baselineProject.ProjectStyle is ProjectStyle.WindowsDesktop && baselineProject.TargetTFM is MSBuildFacts.NetCoreApp31)
            {
                projectRootElement.Sdk = DesktopFacts.WinSDKAttribute;
            }
            else if (MSBuildHelpers.IsWeb(projectRootElement))
            {
                projectRootElement.Sdk = WebFacts.WebSDKAttribute;
            }
            else
            {
                projectRootElement.Sdk = MSBuildFacts.DefaultSDKAttribute;
            }

            return(projectRootElement);
        }
示例#13
0
        public static IProjectRootElement AddCsWinRTReferenceAndComponentProperty(this IProjectRootElement projectRootElement, BaselineProject baselineProject)
        {
            if (baselineProject.OutputType == ProjectOutputType.WinMdObj)
            {
                var topLevelPropGroup = MSBuildHelpers.GetOrCreateTopLevelPropertyGroup(baselineProject, projectRootElement);
                topLevelPropGroup.AddProperty(MSBuildFacts.CsWinRTComponentName, "true");

                var packageReferenceItemGroup = projectRootElement.ItemGroups.Where(ig => ig.Items.Any(i => i.ItemType == MSBuildFacts.MSBuildPackageReferenceName))
                                                .FirstOrDefault() ?? projectRootElement.AddItemGroup();
                AddPackageReferenceElement(packageReferenceItemGroup, MSBuildFacts.CsWinRTPackageReference.Name, MSBuildFacts.CsWinRTPackageReference.Version);
            }

            return(projectRootElement);
        }