From ce5ccd607d5a0490a7343ea0077fb9a02eddf90f Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 9 Feb 2021 14:40:40 -0800 Subject: [PATCH 01/12] Add component debugger --- Roslyn-SDK.sln | 7 ++ eng/Versions.props | 2 +- .../ComponentDebugger/CapabilityProvider.cs | 46 +++++++++ .../ComponentDebugger/Constants.cs | 17 ++++ .../ComponentDebugger/DebugProfileProvider.cs | 95 +++++++++++++++++++ .../ComponentDebugger/DebuggerOptions.xaml | 19 ++++ .../ComponentDebugger/DebuggerOptions.xaml.cs | 19 ++++ .../DebuggerOptionsViewModel.cs | 74 +++++++++++++++ .../LaunchSettingsProvider.cs | 93 ++++++++++++++++++ .../ComponentDebugger/ProjectUtilities.cs | 42 ++++++++ .../Roslyn.ComponentDebugger.csproj | 35 +++++++ .../Roslyn.SDK/Roslyn.SDK.csproj | 7 ++ .../Roslyn.SDK/source.extension.vsixmanifest | 1 + 13 files changed, 456 insertions(+), 1 deletion(-) create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml.cs create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptionsViewModel.cs create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/ProjectUtilities.cs create mode 100644 src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj diff --git a/Roslyn-SDK.sln b/Roslyn-SDK.sln index 2715ebfa9..e53c9247b 100644 --- a/Roslyn-SDK.sln +++ b/Roslyn-SDK.sln @@ -189,6 +189,8 @@ Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.Visu EndProject Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests.vbproj", "{92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Roslyn.ComponentDebugger", "src\VisualStudio.Roslyn.SDK\ComponentDebugger\Roslyn.ComponentDebugger.csproj", "{7E91C1C7-A836-4378-8ABC-9298C13228D1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -539,6 +541,10 @@ Global {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}.Debug|Any CPU.Build.0 = Debug|Any CPU {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}.Release|Any CPU.ActiveCfg = Release|Any CPU {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}.Release|Any CPU.Build.0 = Release|Any CPU + {7E91C1C7-A836-4378-8ABC-9298C13228D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E91C1C7-A836-4378-8ABC-9298C13228D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E91C1C7-A836-4378-8ABC-9298C13228D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E91C1C7-A836-4378-8ABC-9298C13228D1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -635,6 +641,7 @@ Global {7D9C0EF5-7383-4E35-811B-3288B3C806F3} = {9905147E-CC1F-42A0-BD27-05586C583DF7} {7C3FE60E-055B-4E0C-BB85-C7E94A640074} = {9905147E-CC1F-42A0-BD27-05586C583DF7} {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B} = {9905147E-CC1F-42A0-BD27-05586C583DF7} + {7E91C1C7-A836-4378-8ABC-9298C13228D1} = {F9B73995-76C6-4056-ADA9-18342F951361} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {56695AA9-EA80-47A7-8562-E51285906C54} diff --git a/eng/Versions.props b/eng/Versions.props index 2976df46c..e84c615fa 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -10,7 +10,7 @@ true true true - 3.8.0-4.20464.1 + 3.8.0-5.final 16.1.1 diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs new file mode 100644 index 000000000..0a5a5d745 --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs @@ -0,0 +1,46 @@ +// 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.Immutable; +using System.ComponentModel.Composition; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.VisualStudio.ProjectSystem; + +namespace Roslyn.ComponentDebugger +{ + [Export(ExportContractNames.Scopes.ConfiguredProject, typeof(IProjectCapabilitiesProvider))] + [AppliesTo(ProjectCapabilities.CSharp)] + public class CapabilityProvider : ConfiguredProjectCapabilitiesProviderBase + { + [ImportingConstructor] + [System.Obsolete("This exported object must be obtained through the MEF export provider.", error: true)] + public CapabilityProvider(ConfiguredProject configuredProject) + : base(nameof(CapabilityProvider), configuredProject) + { + } + + protected override async Task> GetCapabilitiesAsync(CancellationToken cancellationToken) + { + // PROTOTYPE: an alternative could be to have 'IsRoslynComponent' just define the IsRoslynComponentAsync(ConfiguredProject configuredProject, CancellationToken token = default) + => configuredProject.Services.ProjectLockService.ReadLockAsync( + async access => + { + var project = await access.GetProjectAsync(configuredProject).ConfigureAwait(false); + var isRoslynComponentProperty = project.GetProperty(Constants.RoslynComponentPropertyName); + var isComponent = string.Compare(isRoslynComponentProperty?.EvaluatedValue.Trim(), "true", System.StringComparison.OrdinalIgnoreCase) == 0; + return isComponent; + }, + token); + } +} diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs new file mode 100644 index 000000000..d2809a8bd --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs @@ -0,0 +1,17 @@ +// 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. + +namespace Roslyn.ComponentDebugger +{ + internal class Constants + { + public const string RoslynComponentPropertyName = "IsRoslynComponent"; + + public const string RoslynComponentCapability = "RoslynComponent"; + + public const string CommandName = "DebugRoslynComponent"; + + public const string TargetProjectPropertyName = "targetProject"; + } +} diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs new file mode 100644 index 000000000..822891d18 --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs @@ -0,0 +1,95 @@ +// 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; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.ComponentModel.Composition; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.ProjectSystem; +using Microsoft.VisualStudio.ProjectSystem.Debug; +using Microsoft.VisualStudio.ProjectSystem.VS.Debug; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Interop; +using Task = System.Threading.Tasks.Task; + +namespace Roslyn.ComponentDebugger +{ + [Export(typeof(IDebugProfileLaunchTargetsProvider))] + [AppliesTo(Constants.RoslynComponentCapability)] + public class DebugProfileProvider : IDebugProfileLaunchTargetsProvider + { + private readonly ConfiguredProject _configuredProject; + + private readonly string _compilerRoot; + + [ImportingConstructor] + [Obsolete("This exported object must be obtained through the MEF export provider.", error: true)] + public DebugProfileProvider(ConfiguredProject configuredProject, SVsServiceProvider? serviceProvider) + { + _configuredProject = configuredProject; + _compilerRoot = GetCompilerRoot(serviceProvider); + } + + public Task OnAfterLaunchAsync(DebugLaunchOptions launchOptions, ILaunchProfile profile) => Task.CompletedTask; + + public Task OnBeforeLaunchAsync(DebugLaunchOptions launchOptions, ILaunchProfile profile) => Task.CompletedTask; + + public bool SupportsProfile(ILaunchProfile? profile) => Constants.CommandName.Equals(profile?.CommandName, StringComparison.OrdinalIgnoreCase); + + public async Task> QueryDebugTargetsAsync(DebugLaunchOptions launchOptions, ILaunchProfile? profile) + { + // set up the managed (net fx) debugger to start a process + var settings = new DebugLaunchSettings(launchOptions) + { + LaunchDebugEngineGuid = Microsoft.VisualStudio.ProjectSystem.Debug.DebuggerEngines.ManagedOnlyEngine, + LaunchOperation = DebugLaunchOperation.CreateProcess + }; + + // try and get the target project + if (TryGetTargetProject(_configuredProject, profile, out var targetProjectUnconfigured)) + { + settings.CurrentDirectory = Path.GetDirectoryName(targetProjectUnconfigured!.FullPath); + var compiler = _configuredProject.Capabilities.Contains(ProjectCapabilities.VB) ? "vbc.exe" : "csc.exe"; + settings.Executable = Path.Combine(_compilerRoot, compiler); + + // try and get the configured version of the target project + var targetProject = await targetProjectUnconfigured.GetSuggestedConfiguredProjectAsync().ConfigureAwait(false); + if (targetProject is object) + { + // get its compilation args + var args = await targetProject.GetCompilationArgumentsAsync().ConfigureAwait(false); + + // append the command line args to the debugger launch + settings.Arguments = string.Join(" ", args); + } + } + + //PROTOTYPE: we probably shouldn't return anything when we couldn't figure it out + return new IDebugLaunchSettings[] { settings }; + } + + private static string GetCompilerRoot(SVsServiceProvider? serviceProvider) + { + // PROTOTYPE: we should try and work out the compiler location from the project itself + object rootDir = string.Empty; + var shell = (IVsShell?)serviceProvider?.GetService(typeof(SVsShell)); + shell?.GetProperty((int)__VSSPROPID2.VSSPROPID_InstallRootDir, out rootDir); + return Path.Combine((string)rootDir, "MSBuild", "Current", "Bin", "Roslyn"); + } + + private static bool TryGetTargetProject(ConfiguredProject project, ILaunchProfile? profile, out UnconfiguredProject? targetProject) + { + var targetProjectPath = profile?.OtherSettings?.ContainsKey(Constants.TargetProjectPropertyName) == true + ? profile.OtherSettings[Constants.TargetProjectPropertyName].ToString() + : string.Empty; + + // PROTOTYPE: we should eval / expand the path to work with env/msbuild variables etc. + targetProject = project.Services.ProjectService.LoadedUnconfiguredProjects.SingleOrDefault(p => p.FullPath == targetProjectPath); + return targetProject is object; + } + } +} diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml new file mode 100644 index 000000000..35ef1e49b --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml.cs new file mode 100644 index 000000000..0f8a6440e --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml.cs @@ -0,0 +1,19 @@ +// 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.Windows.Controls; + +namespace Roslyn.ComponentDebugger +{ + /// + /// Interaction logic for DebuggerOptions.xaml + /// + internal sealed partial class DebuggerOptions : UserControl + { + public DebuggerOptions() + { + InitializeComponent(); + } + } +} diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptionsViewModel.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptionsViewModel.cs new file mode 100644 index 000000000..00dae05fc --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptionsViewModel.cs @@ -0,0 +1,74 @@ +// 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; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.VisualStudio.ProjectSystem; +using Microsoft.VisualStudio.ProjectSystem.Debug; + +namespace Roslyn.ComponentDebugger +{ + internal class DebuggerOptionsViewModel : INotifyPropertyChanged + { + private IWritableLaunchProfile? _launchProfile; + + private readonly ImmutableArray _targetProjects; + + private readonly IEnumerable _targetProjectNames; + + public event PropertyChangedEventHandler? PropertyChanged; + + public DebuggerOptionsViewModel(ImmutableArray targetProjects) + { + _targetProjects = targetProjects; + _targetProjectNames = _targetProjects.Select(t => Path.GetFileNameWithoutExtension(t.UnconfiguredProject.FullPath)); + } + + public IEnumerable ProjectNames { get => _targetProjectNames; } + + public IWritableLaunchProfile? LaunchProfile + { + get => _launchProfile; + set + { + _launchProfile = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedProjectIndex))); + } + } + + public int SelectedProjectIndex + { + get + { + if (LaunchProfile?.OtherSettings.ContainsKey(Constants.TargetProjectPropertyName) == true) + { + var target = LaunchProfile.OtherSettings[Constants.TargetProjectPropertyName].ToString(); + for (var i = 0; i < _targetProjects.Length; i++) + { + if (_targetProjects[i].UnconfiguredProject.FullPath.Equals(target, StringComparison.OrdinalIgnoreCase)) + { + return i; + } + } + } + return -1; + } + set + { + if (LaunchProfile is object) + { + var newTargetProject = _targetProjects[value].UnconfiguredProject; + LaunchProfile.OtherSettings[Constants.TargetProjectPropertyName] = newTargetProject.FullPath; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedProjectIndex))); + } + } + } + } +} diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs new file mode 100644 index 000000000..ead2878ad --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs @@ -0,0 +1,93 @@ +// 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; +using System.ComponentModel.Composition; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Controls; +using Microsoft.VisualStudio.ProjectSystem; +using Microsoft.VisualStudio.ProjectSystem.Debug; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Threading; +using Microsoft.VisualStudio.Utilities; + +namespace Roslyn.ComponentDebugger +{ + [Export(typeof(ILaunchSettingsUIProvider))] + [AppliesTo(Constants.RoslynComponentCapability)] + public class LaunchSettingsProvider : ILaunchSettingsUIProvider + { + private readonly UnconfiguredProject _unconfiguredProject; + private readonly AsyncLazy _viewModel; + + [ImportingConstructor] + [Obsolete("This exported object must be obtained through the MEF export provider.", error: true)] + public LaunchSettingsProvider(UnconfiguredProject unconfiguredProject) + { + _unconfiguredProject = unconfiguredProject; + _viewModel = new AsyncLazy(GetViewModelAsync, ThreadHelper.JoinableTaskFactory); + } + + public string CommandName { get => Constants.CommandName; } + + //PROTOTYPE: Localization + public string FriendlyName { get => "Roslyn Component"; } + + public UserControl? CustomUI { get => new DebuggerOptions() { DataContext = _viewModel.GetValue() }; } + + public void ProfileSelected(IWritableLaunchSettings curSettings) + { + // Update the viewmodel's current profile. + this._viewModel.GetValue().LaunchProfile = curSettings?.ActiveProfile; + } + + public bool ShouldEnableProperty(string propertyName) + { + // PROTOTYPE: we disable all the default options for a debugger. + // we might want to enable env vars and (potentially) the exe to allow + // customization of the compiler used? + return false; + } + + private async Task GetViewModelAsync() + { + var targetProjects = ArrayBuilder.GetInstance(); + + // PROTOTYPE: we'll assume the target projects are in the same configuration as this one (can they be different?) + var configuredProject = await _unconfiguredProject.GetSuggestedConfiguredProjectAsync().ConfigureAwait(false); + if (configuredProject is object) + { + // PROTOTYPE: there is presumably a project system way of doing this? + var projectArgs = await configuredProject.GetCompilationArgumentsAsync().ConfigureAwait(false); + var targetArg = projectArgs.LastOrDefault(a => a.StartsWith("/out:", StringComparison.OrdinalIgnoreCase)); + var target = Path.GetFileName(targetArg); + + var projectService = configuredProject.Services.ProjectService; + foreach (var targetProjectUnconfigured in projectService.LoadedUnconfiguredProjects) + { + var targetProject = await targetProjectUnconfigured.LoadConfiguredProjectAsync(configuredProject.ProjectConfiguration).ConfigureAwait(false); + if (targetProject is object) + { + //PROTOTYPE: the below is deadlocking on certain projects. for now just list them all + targetProjects.Add(targetProject); + + // check if the args contain the project as an analyzer ref + //foreach (var arg in await targetProject.GetCompilationArgumentsAsync().ConfigureAwait(false)) + //{ + // if (arg.StartsWith("/analyzer", StringComparison.OrdinalIgnoreCase) + // && arg.EndsWith(target, StringComparison.OrdinalIgnoreCase)) + // { + // targetProjects.Add(targetProject); + // } + //} + } + } + } + + return new DebuggerOptionsViewModel(targetProjects.ToImmutableAndFree()); + } + } +} diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/ProjectUtilities.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/ProjectUtilities.cs new file mode 100644 index 000000000..ad40f94e4 --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/ProjectUtilities.cs @@ -0,0 +1,42 @@ +// 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; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.ProjectSystem; + +namespace Roslyn.ComponentDebugger +{ + public static class ProjectUtilities + { + // PROTOTYPE: is there a way to get this other than hardcoding it? + static readonly string[] CommandLineSchemaRuleNames = new[] { "CompilerCommandLineArgs" }; + + public static async Task> GetCompilationArgumentsAsync(this ConfiguredProject project) + { + if (project is null) + { + throw new ArgumentNullException(nameof(project)); + } + + var args = ImmutableArray.Empty; + + var subscriptionService = project.Services.ProjectSubscription; + if (subscriptionService is object) + { + // get the latest snapshot of the command line args rules + var snapshots = await subscriptionService.JointRuleSource.GetLatestVersionAsync(project, CommandLineSchemaRuleNames).ConfigureAwait(false); + var latest = snapshots.Values.FirstOrDefault(); + + // extract the actual command line arguments + args = latest?.Items.Keys.ToImmutableArray() ?? args; + } + + return args; + } + } +} diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj new file mode 100644 index 000000000..b2c4bf05f --- /dev/null +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj @@ -0,0 +1,35 @@ + + + + + Library + Roslyn.ComponentDebugger + net472 + enable + + + + + + + + + + + + + + + + + + + + + + + + MSBuild:Compile + + + \ No newline at end of file diff --git a/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj b/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj index b04a9074b..6500c01a6 100644 --- a/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj +++ b/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj @@ -120,5 +120,12 @@ true false + + Roslyn.ComponentDebugger + BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b + DebugSymbolsProjectOutputGroup%3b + true + false + diff --git a/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/source.extension.vsixmanifest b/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/source.extension.vsixmanifest index 8d8661a4e..a091d5313 100644 --- a/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/source.extension.vsixmanifest +++ b/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/source.extension.vsixmanifest @@ -30,6 +30,7 @@ + From b079869ec8551d14b3f0791545fc66927d55026e Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Fri, 12 Feb 2021 12:43:43 -0800 Subject: [PATCH 02/12] PR Feedback --- .../ComponentDebugger/Constants.cs | 2 +- .../ComponentDebugger/DebugProfileProvider.cs | 21 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs index d2809a8bd..c4654f185 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Constants.cs @@ -4,7 +4,7 @@ namespace Roslyn.ComponentDebugger { - internal class Constants + internal static class Constants { public const string RoslynComponentPropertyName = "IsRoslynComponent"; diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs index 822891d18..d2ec67f6a 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs @@ -83,13 +83,24 @@ private static string GetCompilerRoot(SVsServiceProvider? serviceProvider) private static bool TryGetTargetProject(ConfiguredProject project, ILaunchProfile? profile, out UnconfiguredProject? targetProject) { - var targetProjectPath = profile?.OtherSettings?.ContainsKey(Constants.TargetProjectPropertyName) == true - ? profile.OtherSettings[Constants.TargetProjectPropertyName].ToString() - : string.Empty; + targetProject = null; + if (TryGetOtherSettingAsString(profile, Constants.TargetProjectPropertyName, out var targetProjectPath)) + { + // PROTOTYPE: we should eval / expand the path to work with env/msbuild variables etc. + targetProject = project.Services.ProjectService.LoadedUnconfiguredProjects.SingleOrDefault(p => p.FullPath == targetProjectPath); + } - // PROTOTYPE: we should eval / expand the path to work with env/msbuild variables etc. - targetProject = project.Services.ProjectService.LoadedUnconfiguredProjects.SingleOrDefault(p => p.FullPath == targetProjectPath); return targetProject is object; } + + private static bool TryGetOtherSettingAsString(ILaunchProfile? profile, string key, out string? value) + { + value = null; + if (profile?.OtherSettings?.ContainsKey(key) == true) + { + value = profile.OtherSettings[key] as string; + } + return value is string; + } } } From 5ef7fee9ebcd916fa3f7c4042ba29ecf99ef3ede Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 16 Feb 2021 11:52:43 -0800 Subject: [PATCH 03/12] Address PROTOTYPE: comments: - Implement token replacment for the launch settings file - Add issues for other prototypes --- .../ComponentDebugger/CapabilityProvider.cs | 3 +- .../ComponentDebugger/DebugProfileProvider.cs | 43 +++++++++---------- .../ComponentDebugger/DebuggerOptions.xaml | 2 +- .../LaunchSettingsProvider.cs | 12 +++--- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs index 0a5a5d745..9dc4d70f5 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs @@ -23,7 +23,8 @@ public CapabilityProvider(ConfiguredProject configuredProject) protected override async Task> GetCapabilitiesAsync(CancellationToken cancellationToken) { - // PROTOTYPE: an alternative could be to have 'IsRoslynComponent' just define the > QueryDebugTargetsAsync(DebugLaunchOptions launchOptions, ILaunchProfile? profile) { // set up the managed (net fx) debugger to start a process + // https://github.com/dotnet/roslyn-sdk/issues/729 var settings = new DebugLaunchSettings(launchOptions) { LaunchDebugEngineGuid = Microsoft.VisualStudio.ProjectSystem.Debug.DebuggerEngines.ManagedOnlyEngine, @@ -50,9 +52,10 @@ public async Task> QueryDebugTargetsAsync(De }; // try and get the target project - if (TryGetTargetProject(_configuredProject, profile, out var targetProjectUnconfigured)) + var targetProjectUnconfigured = await TryGetTargetProjectAsync(profile).ConfigureAwait(false); + if (targetProjectUnconfigured is object) { - settings.CurrentDirectory = Path.GetDirectoryName(targetProjectUnconfigured!.FullPath); + settings.CurrentDirectory = Path.GetDirectoryName(targetProjectUnconfigured.FullPath); var compiler = _configuredProject.Capabilities.Contains(ProjectCapabilities.VB) ? "vbc.exe" : "csc.exe"; settings.Executable = Path.Combine(_compilerRoot, compiler); @@ -68,39 +71,35 @@ public async Task> QueryDebugTargetsAsync(De } } - //PROTOTYPE: we probably shouldn't return anything when we couldn't figure it out + // https://github.com/dotnet/roslyn-sdk/issues/728 : better error handling return new IDebugLaunchSettings[] { settings }; } private static string GetCompilerRoot(SVsServiceProvider? serviceProvider) { - // PROTOTYPE: we should try and work out the compiler location from the project itself + // https://github.com/dotnet/roslyn-sdk/issues/729 object rootDir = string.Empty; var shell = (IVsShell?)serviceProvider?.GetService(typeof(SVsShell)); shell?.GetProperty((int)__VSSPROPID2.VSSPROPID_InstallRootDir, out rootDir); return Path.Combine((string)rootDir, "MSBuild", "Current", "Bin", "Roslyn"); } - private static bool TryGetTargetProject(ConfiguredProject project, ILaunchProfile? profile, out UnconfiguredProject? targetProject) + private async Task TryGetTargetProjectAsync(ILaunchProfile? profile) { - targetProject = null; - if (TryGetOtherSettingAsString(profile, Constants.TargetProjectPropertyName, out var targetProjectPath)) - { - // PROTOTYPE: we should eval / expand the path to work with env/msbuild variables etc. - targetProject = project.Services.ProjectService.LoadedUnconfiguredProjects.SingleOrDefault(p => p.FullPath == targetProjectPath); - } - - return targetProject is object; - } + UnconfiguredProject? targetProject = null; + object? value = null; + profile?.OtherSettings?.TryGetValue(Constants.TargetProjectPropertyName, out value); - private static bool TryGetOtherSettingAsString(ILaunchProfile? profile, string key, out string? value) - { - value = null; - if (profile?.OtherSettings?.ContainsKey(key) == true) + if (value is string targetProjectPath) { - value = profile.OtherSettings[key] as string; + // expand any variables in the path, and root it based on this project + var replacedProjectPath = await _tokenReplacer.ReplaceTokensInStringAsync(targetProjectPath, true).ConfigureAwait(false); + replacedProjectPath = _configuredProject.UnconfiguredProject.MakeRooted(replacedProjectPath); + + targetProject = _configuredProject.Services.ProjectService.LoadedUnconfiguredProjects.SingleOrDefault(p => p.FullPath == replacedProjectPath); } - return value is string; + + return targetProject; } } } diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml index 35ef1e49b..b0b54746a 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebuggerOptions.xaml @@ -12,7 +12,7 @@ - + diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs index ead2878ad..c9d9b8dd1 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs @@ -33,7 +33,7 @@ public LaunchSettingsProvider(UnconfiguredProject unconfiguredProject) public string CommandName { get => Constants.CommandName; } - //PROTOTYPE: Localization + // https://github.com/dotnet/roslyn-sdk/issues/730 : localization public string FriendlyName { get => "Roslyn Component"; } public UserControl? CustomUI { get => new DebuggerOptions() { DataContext = _viewModel.GetValue() }; } @@ -46,8 +46,8 @@ public void ProfileSelected(IWritableLaunchSettings curSettings) public bool ShouldEnableProperty(string propertyName) { - // PROTOTYPE: we disable all the default options for a debugger. - // we might want to enable env vars and (potentially) the exe to allow + // we disable all the default options for a debugger. + // in the future we might want to enable env vars and (potentially) the exe to allow // customization of the compiler used? return false; } @@ -56,11 +56,11 @@ private async Task GetViewModelAsync() { var targetProjects = ArrayBuilder.GetInstance(); - // PROTOTYPE: we'll assume the target projects are in the same configuration as this one (can they be different?) + // NOTE: we assume the target projects are in the same configuration as this one (can they be different?) var configuredProject = await _unconfiguredProject.GetSuggestedConfiguredProjectAsync().ConfigureAwait(false); if (configuredProject is object) { - // PROTOTYPE: there is presumably a project system way of doing this? + // get the output assembly for this project var projectArgs = await configuredProject.GetCompilationArgumentsAsync().ConfigureAwait(false); var targetArg = projectArgs.LastOrDefault(a => a.StartsWith("/out:", StringComparison.OrdinalIgnoreCase)); var target = Path.GetFileName(targetArg); @@ -71,7 +71,7 @@ private async Task GetViewModelAsync() var targetProject = await targetProjectUnconfigured.LoadConfiguredProjectAsync(configuredProject.ProjectConfiguration).ConfigureAwait(false); if (targetProject is object) { - //PROTOTYPE: the below is deadlocking on certain projects. for now just list them all + // https://github.com/dotnet/roslyn-sdk/issues/731: the below is deadlocking on certain projects. for now just list them all targetProjects.Add(targetProject); // check if the args contain the project as an analyzer ref From f2ddb61d400a23ba055d440de5c8f1a1be4e3c10 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 16 Feb 2021 14:17:53 -0800 Subject: [PATCH 04/12] Add package source --- NuGet.config | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGet.config b/NuGet.config index e0e61bbbf..687b1bf8e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,6 +6,7 @@ + From c86f8bd92efddc14b73685d63376e178c1c74626 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 16 Feb 2021 15:08:23 -0800 Subject: [PATCH 05/12] Use async lazy to get compiler root from the UI thread --- .../ComponentDebugger/DebugProfileProvider.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs index 07aa14669..62ff510fa 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs @@ -14,6 +14,7 @@ using Microsoft.VisualStudio.ProjectSystem.VS.Debug; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; +using Microsoft.VisualStudio.Threading; using Task = System.Threading.Tasks.Task; namespace Roslyn.ComponentDebugger @@ -24,7 +25,7 @@ public class DebugProfileProvider : IDebugProfileLaunchTargetsProvider { private readonly ConfiguredProject _configuredProject; private readonly IDebugTokenReplacer _tokenReplacer; - private readonly string _compilerRoot; + private readonly AsyncLazy _compilerRoot; [ImportingConstructor] [Obsolete("This exported object must be obtained through the MEF export provider.", error: true)] @@ -32,7 +33,7 @@ public DebugProfileProvider(ConfiguredProject configuredProject, IDebugTokenRepl { _configuredProject = configuredProject; _tokenReplacer = tokenReplacer; - _compilerRoot = GetCompilerRoot(serviceProvider); + _compilerRoot = new AsyncLazy(() => GetCompilerRootAsync(serviceProvider), ThreadHelper.JoinableTaskFactory); } public Task OnAfterLaunchAsync(DebugLaunchOptions launchOptions, ILaunchProfile profile) => Task.CompletedTask; @@ -57,7 +58,8 @@ public async Task> QueryDebugTargetsAsync(De { settings.CurrentDirectory = Path.GetDirectoryName(targetProjectUnconfigured.FullPath); var compiler = _configuredProject.Capabilities.Contains(ProjectCapabilities.VB) ? "vbc.exe" : "csc.exe"; - settings.Executable = Path.Combine(_compilerRoot, compiler); + var compilerRoot = await _compilerRoot.GetValueAsync().ConfigureAwait(false); + settings.Executable = Path.Combine(compilerRoot, compiler); // try and get the configured version of the target project var targetProject = await targetProjectUnconfigured.GetSuggestedConfiguredProjectAsync().ConfigureAwait(false); @@ -75,8 +77,10 @@ public async Task> QueryDebugTargetsAsync(De return new IDebugLaunchSettings[] { settings }; } - private static string GetCompilerRoot(SVsServiceProvider? serviceProvider) + private static async Task GetCompilerRootAsync(SVsServiceProvider? serviceProvider) { + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + // https://github.com/dotnet/roslyn-sdk/issues/729 object rootDir = string.Empty; var shell = (IVsShell?)serviceProvider?.GetService(typeof(SVsShell)); From 92e3b89e61fe356cc00c963b2dd2c30f7031a0a1 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 16 Feb 2021 15:09:07 -0800 Subject: [PATCH 06/12] NuGoop --- .../ComponentDebugger/Roslyn.ComponentDebugger.csproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj index b2c4bf05f..cfc85df24 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj @@ -21,11 +21,15 @@ + + + + + - From ffd65a0be0bb06187471e8f01861419d67e44f5b Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 16 Feb 2021 15:51:01 -0800 Subject: [PATCH 07/12] Add cap provider for VB Ordinal comparison for debug command more nuget --- .../ComponentDebugger/CapabilityProvider.cs | 2 +- .../ComponentDebugger/DebugProfileProvider.cs | 2 +- .../Roslyn.ComponentDebugger.csproj | 12 +++--------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs index 9dc4d70f5..2474b5198 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs @@ -11,7 +11,7 @@ namespace Roslyn.ComponentDebugger { [Export(ExportContractNames.Scopes.ConfiguredProject, typeof(IProjectCapabilitiesProvider))] - [AppliesTo(ProjectCapabilities.CSharp)] + [AppliesTo(ProjectCapabilities.CSharp + " | " + ProjectCapabilities.VB)] public class CapabilityProvider : ConfiguredProjectCapabilitiesProviderBase { [ImportingConstructor] diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs index 62ff510fa..69d720d2b 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/DebugProfileProvider.cs @@ -40,7 +40,7 @@ public DebugProfileProvider(ConfiguredProject configuredProject, IDebugTokenRepl public Task OnBeforeLaunchAsync(DebugLaunchOptions launchOptions, ILaunchProfile profile) => Task.CompletedTask; - public bool SupportsProfile(ILaunchProfile? profile) => Constants.CommandName.Equals(profile?.CommandName, StringComparison.OrdinalIgnoreCase); + public bool SupportsProfile(ILaunchProfile? profile) => Constants.CommandName.Equals(profile?.CommandName, StringComparison.Ordinal); public async Task> QueryDebugTargetsAsync(DebugLaunchOptions launchOptions, ILaunchProfile? profile) { diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj index cfc85df24..1763a9788 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj @@ -6,6 +6,7 @@ Roslyn.ComponentDebugger net472 enable + NU1603 @@ -21,15 +22,8 @@ - - - - - - - - - + + From f78a1b779e5569e87a831bd9dfcac52511ce9df9 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 16 Feb 2021 16:47:27 -0800 Subject: [PATCH 08/12] Make capability provider dataflow based --- .../ComponentDebugger/CapabilityProvider.cs | 22 ++++++++----------- .../LaunchSettingsProvider.cs | 19 +++++++--------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs index 2474b5198..b24b37ca4 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/CapabilityProvider.cs @@ -14,11 +14,14 @@ namespace Roslyn.ComponentDebugger [AppliesTo(ProjectCapabilities.CSharp + " | " + ProjectCapabilities.VB)] public class CapabilityProvider : ConfiguredProjectCapabilitiesProviderBase { + private readonly IProjectSnapshotService snapshotService; + [ImportingConstructor] [System.Obsolete("This exported object must be obtained through the MEF export provider.", error: true)] - public CapabilityProvider(ConfiguredProject configuredProject) + public CapabilityProvider(ConfiguredProject configuredProject, IProjectSnapshotService snapshotService) : base(nameof(CapabilityProvider), configuredProject) { + this.snapshotService = snapshotService; } protected override async Task> GetCapabilitiesAsync(CancellationToken cancellationToken) @@ -26,22 +29,15 @@ protected override async Task> GetCapabilitiesAsync(Can // an alternative design could be to have 'IsRoslynComponent' just define the IsRoslynComponentAsync(ConfiguredProject configuredProject, CancellationToken token = default) - => configuredProject.Services.ProjectLockService.ReadLockAsync( - async access => - { - var project = await access.GetProjectAsync(configuredProject).ConfigureAwait(false); - var isRoslynComponentProperty = project.GetProperty(Constants.RoslynComponentPropertyName); - var isComponent = string.Compare(isRoslynComponentProperty?.EvaluatedValue.Trim(), "true", System.StringComparison.OrdinalIgnoreCase) == 0; - return isComponent; - }, - token); } } diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs index c9d9b8dd1..7e10b807a 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/LaunchSettingsProvider.cs @@ -71,18 +71,15 @@ private async Task GetViewModelAsync() var targetProject = await targetProjectUnconfigured.LoadConfiguredProjectAsync(configuredProject.ProjectConfiguration).ConfigureAwait(false); if (targetProject is object) { - // https://github.com/dotnet/roslyn-sdk/issues/731: the below is deadlocking on certain projects. for now just list them all - targetProjects.Add(targetProject); - // check if the args contain the project as an analyzer ref - //foreach (var arg in await targetProject.GetCompilationArgumentsAsync().ConfigureAwait(false)) - //{ - // if (arg.StartsWith("/analyzer", StringComparison.OrdinalIgnoreCase) - // && arg.EndsWith(target, StringComparison.OrdinalIgnoreCase)) - // { - // targetProjects.Add(targetProject); - // } - //} + foreach (var arg in await targetProject.GetCompilationArgumentsAsync().ConfigureAwait(false)) + { + if (arg.StartsWith("/analyzer", StringComparison.OrdinalIgnoreCase) + && arg.EndsWith(target, StringComparison.OrdinalIgnoreCase)) + { + targetProjects.Add(targetProject); + } + } } } } From 492c07c75d801ae7e652ebddc30c674fa531bdab Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Tue, 16 Feb 2021 18:19:40 -0800 Subject: [PATCH 09/12] Don't warn on downgrade --- .../ComponentDebugger/Roslyn.ComponentDebugger.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj index 1763a9788..2df128458 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj @@ -6,7 +6,7 @@ Roslyn.ComponentDebugger net472 enable - NU1603 + NU1603;NU1605 @@ -30,4 +30,4 @@ MSBuild:Compile - \ No newline at end of file + From 65f8b41faa20ebc558f3feb72fa9e84eb9f78d79 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Wed, 17 Feb 2021 12:41:50 -0800 Subject: [PATCH 10/12] cries in nuget --- .../ComponentDebugger/Roslyn.ComponentDebugger.csproj | 6 ++++++ src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj index 2df128458..0b41b3a7c 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj @@ -24,6 +24,12 @@ + + + + + + diff --git a/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj b/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj index 6500c01a6..370c4ea74 100644 --- a/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj +++ b/src/VisualStudio.Roslyn.SDK/Roslyn.SDK/Roslyn.SDK.csproj @@ -128,4 +128,7 @@ false + + + From 2af0f116edc7fe593154e672784521ea8d8bad8d Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Wed, 17 Feb 2021 13:00:25 -0800 Subject: [PATCH 11/12] nuget harder --- .../ComponentDebugger/Roslyn.ComponentDebugger.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj index 0b41b3a7c..9bac44c37 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj @@ -29,7 +29,7 @@ - + From 4dcffa0b3d3a2a909bf03f6b268903a8fc9a7659 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Wed, 17 Feb 2021 13:38:06 -0800 Subject: [PATCH 12/12] Nuget 4.0 --- .../ComponentDebugger/Roslyn.ComponentDebugger.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj index 9bac44c37..5a5f34193 100644 --- a/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj +++ b/src/VisualStudio.Roslyn.SDK/ComponentDebugger/Roslyn.ComponentDebugger.csproj @@ -28,6 +28,7 @@ +