Merge remote-tracking branch 'origin/dotnet/main' into dev/tomescht/230117-MergeDotnetMain

This commit is contained in:
Tom Meschter 2023-01-17 12:52:04 -08:00
Родитель 130a0f2c2c 6e1dc8b2c0
Коммит 7583b48ba7
81 изменённых файлов: 330 добавлений и 313 удалений

Просмотреть файл

@ -8,6 +8,9 @@ root = true
indent_style = space
# (Please don't specify an indent_size here; that has too many unintended consequences.)
# Spell checker configuration
spelling_exclusion_path = spelling.dic
# Code files
[*.{cs,csx,vb,vbx}]
indent_size = 4
@ -409,6 +412,21 @@ dotnet_diagnostic.VSSDK006.severity = warning # Check whether the result of Ge
dotnet_diagnostic.IDE0073.severity = warning # Enforce file header
file_header_template = 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.md file in the project root for more information.
# White space rules (experimental)
dotnet_style_allow_multiple_blank_lines_experimental = false
csharp_style_allow_embedded_statements_on_same_line_experimental = false
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = false
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = false
dotnet_diagnostic.IDE2000.severity = warning # Allow multiple blank lines
dotnet_diagnostic.IDE2001.severity = warning # Allow embedded statements on same line
dotnet_diagnostic.IDE2002.severity = warning # Allow blank lines between consecutive braces
dotnet_diagnostic.IDE2003.severity = warning # Allow blank line after colon in constructor initializer
dotnet_diagnostic.IDE2004.severity = warning # Allow blank line after token in conditional expression
dotnet_diagnostic.IDE2005.severity = warning # Allow blank line after token in arrow expression clause
dotnet_diagnostic.IDE2006.severity = warning # Allow blank line after token in object initializer
# Reduce severity for some VB rules where the risks of changes outweight the benefit
[*.{vb}]

2
.github/fabricbot.json поставляемый
Просмотреть файл

@ -107,7 +107,7 @@
{
"name": "addMilestone",
"parameters": {
"milestoneName": "17.5"
"milestoneName": "17.6"
}
}
],

Просмотреть файл

@ -130,6 +130,8 @@
<Using Include="System.Collections.Immutable" />
<!-- There are two namespaces via which MEF attributes are defined. This is the correct one. -->
<Using Include="System.ComponentModel.Composition" />
<!-- Prevent accidental use of Microsoft.VisualStudio.Threading.IAsyncDisposable -->
<Using Include="System.IAsyncDisposable" Alias="IAsyncDisposable" />
</ItemGroup>
<Import Project="eng\imports\LanguageSettings.props" />

Просмотреть файл

@ -65,6 +65,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "items", "items", "{5204CAC5
nuget.config = nuget.config
README.md = README.md
SECURITY.md = SECURITY.md
spelling.dic = spelling.dic
version.json = version.json
EndProjectSection
EndProject

Просмотреть файл

@ -57,7 +57,11 @@ The `AddAdditionalReferences` target will run in both normal builds _and_ design
### Determining whether a target is running in a design-time build
Use both the `DesignTimeBuild` (CPS-based projects) and `BuildingProject` (legacy project system) properties to determine whether a target is running in a design-time build or a normal build. This can be used to avoid expensive calculations or work that is only needed for a normal build, helping to keep the IDE responsive.
Checking if a target is running in a design-time build can be used to avoid expensive calculations or work that is only needed for a normal build, helping to keep the IDE responsive.
Different project systems use different properties to distinguish between design-time builds and normal builds. For example, the .NET Project System in this repo builds on top of the Common Project System (CPS) components, and CPS-based project systems set the `DesignTimeBuild` property. However, non-SDK-style C# and VB projects generally use what we call the "legacy" project system, and it uses the `BuildingProject` property.
As such, you should make use of both the `DesignTimeBuild` and `BuildingProject` properties to determine whether a target is running in a design-time build or a normal build:
```xml
<Target Name="AddAdditionalReferences" BeforeTargets="ResolveAssemblyReferences">

Просмотреть файл

@ -82,6 +82,9 @@ $commitsString = "[ $($commits | Out-String) ]"
# Replace the non-commit entry newline with a space.
# This situation occurs when the commit body contains newlines in it (multiple paragraphs).
$commitsClean = $commitsString -replace '(?<!\})\r\n',' '
# Any remaining backslashes need to be escaped as they are part of the commit body/subject.
# This ignores the natural newlines for the commit entries.
$commitsClean = $commitsClean -replace '(?!\r\n)\\','\\'
# Replace any double quotes with a backslash double quote.
# This situation occurs when commit bodies or commit subjects contain double quotes in them.
$commitsClean = $commitsClean -replace '"','\"'

Двоичные данные
spelling.dic Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -15,7 +15,7 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Acquisition;
/// need to improve the development experience.
/// </summary>
[Export(typeof(IMissingSetupComponentRegistrationService))]
internal class MissingSetupComponentRegistrationService : IMissingSetupComponentRegistrationService, IVsSolutionEvents, IDisposable
internal class MissingSetupComponentRegistrationService : OnceInitializedOnceDisposedAsync, IMissingSetupComponentRegistrationService, IVsSolutionEvents
{
private const string WasmToolsWorkloadName = "wasm-tools";
@ -38,16 +38,14 @@ internal class MissingSetupComponentRegistrationService : IMissingSetupComponent
private readonly ConcurrentDictionary<Guid, string> _projectGuidToRuntimeDescriptorMap;
private readonly ConcurrentDictionary<Guid, IConcurrentHashSet<ProjectConfiguration>> _projectGuidToProjectConfigurationsMap;
private readonly IVsService<SVsBrokeredServiceContainer, IBrokeredServiceContainer> _serviceBrokerContainer;
private readonly IVsService<IVsSolution> _vsSolutionService;
private readonly ISolutionService _solutionService;
private readonly IVsService<SVsSetupCompositionService, IVsSetupCompositionService> _vsSetupCompositionService;
private readonly Lazy<IVsShellUtilitiesHelper> _shellUtilitiesHelper;
private readonly Lazy<IProjectThreadingService> _threadHandling;
private readonly IProjectFaultHandlerService _projectFaultHandlerService;
private readonly object _displayPromptLock = new();
private ConcurrentDictionary<string, IConcurrentHashSet<ProjectConfiguration>>? _projectPathToProjectConfigurationsMap;
private uint _solutionCookie = VSConstants.VSCOOKIE_NIL;
private IVsSolution? _vsSolution;
private IAsyncDisposable? _solutionEventsSubscription;
private bool? _isVSFromPreviewChannel;
private readonly object _lock = new();
@ -56,11 +54,12 @@ internal class MissingSetupComponentRegistrationService : IMissingSetupComponent
[ImportingConstructor]
public MissingSetupComponentRegistrationService(
IVsService<SVsBrokeredServiceContainer, IBrokeredServiceContainer> serviceBrokerContainer,
IVsService<SVsSolution, IVsSolution> vsSolutionService,
ISolutionService solutionService,
IVsService<SVsSetupCompositionService, IVsSetupCompositionService> vsSetupCompositionService,
Lazy<IVsShellUtilitiesHelper> vsShellUtilitiesHelper,
Lazy<IProjectThreadingService> threadHandling,
IProjectFaultHandlerService projectFaultHandlerService)
IProjectFaultHandlerService projectFaultHandlerService,
JoinableTaskContext joinableTaskContext)
: base(new(joinableTaskContext))
{
_webComponentIdsDetected = new();
_projectGuidToWorkloadDescriptorsMap = new();
@ -68,9 +67,8 @@ internal class MissingSetupComponentRegistrationService : IMissingSetupComponent
_projectGuidToRuntimeDescriptorMap = new();
_serviceBrokerContainer = serviceBrokerContainer;
_vsSolutionService = vsSolutionService;
_solutionService = solutionService;
_vsSetupCompositionService = vsSetupCompositionService;
_threadHandling = threadHandling;
_projectFaultHandlerService = projectFaultHandlerService;
_shellUtilitiesHelper = vsShellUtilitiesHelper;
}
@ -422,29 +420,23 @@ internal class MissingSetupComponentRegistrationService : IMissingSetupComponent
#endregion
public async Task InitializeAsync(CancellationToken cancellationToken = default)
Task IMissingSetupComponentRegistrationService.InitializeAsync(CancellationToken cancellationToken)
{
await _threadHandling.Value.SwitchToUIThread();
_vsSolution = await _vsSolutionService.GetValueAsync();
Verify.HResult(_vsSolution.AdviseSolutionEvents(this, out _solutionCookie));
return InitializeAsync(cancellationToken);
}
public void Dispose()
protected override async Task InitializeCoreAsync(CancellationToken cancellationToken)
{
_threadHandling.Value.VerifyOnUIThread();
_solutionEventsSubscription = await _solutionService.SubscribeAsync(this, cancellationToken);
}
protected override async Task DisposeCoreAsync(bool initialized)
{
ClearMissingWorkloadMetadata();
if (_solutionCookie != VSConstants.VSCOOKIE_NIL)
if (_solutionEventsSubscription is not null)
{
if (_vsSolution is not null)
{
Verify.HResult(_vsSolution.UnadviseSolutionEvents(_solutionCookie));
_solutionCookie = VSConstants.VSCOOKIE_NIL;
_vsSolution = null;
}
await _solutionEventsSubscription.DisposeAsync();
}
}
}

Просмотреть файл

@ -6,7 +6,6 @@ using Microsoft.VisualStudio.ProjectSystem.VS.Editor;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Threading;
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem.VS.Build.Diagnostics
{

Просмотреть файл

@ -1,7 +1,6 @@
// 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.md file in the project root for more information.
using Microsoft.VisualStudio.Shell.Interop;
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem.VS.Build
{

Просмотреть файл

@ -4,7 +4,6 @@ using Microsoft.VisualStudio.Composition;
using Microsoft.VisualStudio.ProjectSystem.Build;
using Microsoft.VisualStudio.ProjectSystem.Debug;
using Microsoft.VisualStudio.Shell.Interop;
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem.VS.Build
{

Просмотреть файл

@ -3,7 +3,6 @@
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Threading;
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem.VS.Build
{

Просмотреть файл

@ -115,6 +115,5 @@ namespace Microsoft.VisualStudio.ProjectSystem.Debug
return value;
}
}
}
}

Просмотреть файл

@ -1,7 +1,6 @@
// 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.md file in the project root for more information.
using Microsoft.VisualStudio.Shell.Interop;
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem.VS.Editor
{

Просмотреть файл

@ -3,7 +3,6 @@
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Threading;
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem.VS.Editor
{

Просмотреть файл

@ -15,8 +15,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Input.Commands.Ordering
[ImportingConstructor]
public AddExistingItemAboveCommand(
IAddItemDialogService addItemDialogService,
OrderAddItemHintReceiver orderAddItemHintReceiver) :
base(addItemDialogService, orderAddItemHintReceiver)
OrderAddItemHintReceiver orderAddItemHintReceiver)
: base(addItemDialogService, orderAddItemHintReceiver)
{
_addItemDialogService = addItemDialogService;
}

Просмотреть файл

@ -15,8 +15,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Input.Commands.Ordering
[ImportingConstructor]
public AddExistingItemBelowCommand(
IAddItemDialogService addItemDialogService,
OrderAddItemHintReceiver orderAddItemHintReceiver) :
base(addItemDialogService, orderAddItemHintReceiver)
OrderAddItemHintReceiver orderAddItemHintReceiver)
: base(addItemDialogService, orderAddItemHintReceiver)
{
_addItemDialogService = addItemDialogService;
}

Просмотреть файл

@ -16,8 +16,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Input.Commands.Ordering
[ImportingConstructor]
public AddExistingItemCommand(
IAddItemDialogService addItemDialogService,
OrderAddItemHintReceiver orderAddItemHintReceiver) :
base(addItemDialogService, orderAddItemHintReceiver)
OrderAddItemHintReceiver orderAddItemHintReceiver)
: base(addItemDialogService, orderAddItemHintReceiver)
{
_addItemDialogService = addItemDialogService;
}

Просмотреть файл

@ -15,8 +15,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Input.Commands.Ordering
[ImportingConstructor]
public AddNewItemAboveCommand(
IAddItemDialogService addItemDialogService,
OrderAddItemHintReceiver orderAddItemHintReceiver) :
base(addItemDialogService, orderAddItemHintReceiver)
OrderAddItemHintReceiver orderAddItemHintReceiver)
: base(addItemDialogService, orderAddItemHintReceiver)
{
_addItemDialogService = addItemDialogService;
}

Просмотреть файл

@ -15,8 +15,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Input.Commands.Ordering
[ImportingConstructor]
public AddNewItemBelowCommand(
IAddItemDialogService addItemDialogService,
OrderAddItemHintReceiver orderAddItemHintReceiver) :
base(addItemDialogService, orderAddItemHintReceiver)
OrderAddItemHintReceiver orderAddItemHintReceiver)
: base(addItemDialogService, orderAddItemHintReceiver)
{
_addItemDialogService = addItemDialogService;
}

Просмотреть файл

@ -16,8 +16,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Input.Commands.Ordering
[ImportingConstructor]
public AddNewItemCommand(
IAddItemDialogService addItemDialogService,
OrderAddItemHintReceiver orderAddItemHintReceiver) :
base(addItemDialogService, orderAddItemHintReceiver)
OrderAddItemHintReceiver orderAddItemHintReceiver)
: base(addItemDialogService, orderAddItemHintReceiver)
{
_addItemDialogService = addItemDialogService;
}

Просмотреть файл

@ -7,8 +7,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.References
{
internal class AssemblyReferenceHandler : AbstractReferenceHandler
{
internal AssemblyReferenceHandler() :
base(ProjectSystemReferenceType.Assembly)
internal AssemblyReferenceHandler()
: base(ProjectSystemReferenceType.Assembly)
{ }
protected override Task RemoveReferenceAsync(ConfiguredProjectServices services,

Просмотреть файл

@ -6,8 +6,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.References
{
internal class PackageReferenceHandler : AbstractReferenceHandler
{
internal PackageReferenceHandler() :
base(ProjectSystemReferenceType.Package)
internal PackageReferenceHandler()
: base(ProjectSystemReferenceType.Package)
{ }
protected override Task RemoveReferenceAsync(ConfiguredProjectServices services,

Просмотреть файл

@ -6,8 +6,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.References
{
internal class ProjectReferenceHandler : AbstractReferenceHandler
{
internal ProjectReferenceHandler() :
base(ProjectSystemReferenceType.Project)
internal ProjectReferenceHandler()
: base(ProjectSystemReferenceType.Project)
{ }
protected override Task RemoveReferenceAsync(ConfiguredProjectServices services,

Просмотреть файл

@ -181,6 +181,12 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Rename
await settings.SetValueAsync(VsToolsOptions.OptionPromptNamespaceUpdate, !promptNamespaceUpdate, true);
// If the user checked the "Don't show again" checkbox, we need to set the namespace enable state based on their selection of Yes/No in the dialog.
if (promptNamespaceUpdate)
{
await settings.SetValueAsync(VsToolsOptions.OptionEnableNamespaceUpdate, confirmation, isMachineLocal: true);
}
return confirmation;
}

Просмотреть файл

@ -4,7 +4,6 @@ using Microsoft.VisualStudio.ProjectSystem.UpToDate;
using Microsoft.VisualStudio.ProjectSystem.VS.Build;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Threading;
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem.VS.UpToDate
{

Просмотреть файл

@ -25,41 +25,34 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.UpToDate
private Dictionary<(string ProjectPath, IImmutableDictionary<string, string> ConfigurationDimensions), (int ItemHash, DateTime? ItemsChangedAtUtc, DateTime? LastSuccessfulBuildStartedAtUtc)>? _dataByConfiguredProject;
private readonly IVsUIService<SVsSolution, IVsSolution> _solution;
private readonly ISolutionService _solutionService;
private bool _hasUnsavedChange;
private uint _cookie = VSConstants.VSCOOKIE_NIL;
private IAsyncDisposable? _solutionEventsSubscription;
private string? _cacheFilePath;
private JoinableTask? _cleanupTask;
[ImportingConstructor]
public UpToDateCheckStatePersistence(
IVsUIService<SVsSolution, IVsSolution> solution,
ISolutionService solutionService,
JoinableTaskContext joinableTaskContext)
: base(new JoinableTaskContextNode(joinableTaskContext))
{
_solution = solution;
_solutionService = solutionService;
}
protected override async Task InitializeCoreAsync(CancellationToken cancellationToken)
{
await JoinableFactory.SwitchToMainThreadAsync(cancellationToken);
Verify.HResult(_solution.Value.AdviseSolutionEvents(this, out _cookie));
_solutionEventsSubscription = await _solutionService.SubscribeAsync(this, cancellationToken);
}
protected override async Task DisposeCoreUnderLockAsync(bool initialized)
{
if (initialized)
{
if (_cookie != VSConstants.VSCOOKIE_NIL)
{
await JoinableFactory.SwitchToMainThreadAsync();
Assumes.NotNull(_solutionEventsSubscription);
Verify.HResult(_solution.Value.UnadviseSolutionEvents(_cookie));
_cookie = VSConstants.VSCOOKIE_NIL;
}
await _solutionEventsSubscription.DisposeAsync();
}
}
@ -177,7 +170,7 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.UpToDate
{
await JoinableFactory.SwitchToMainThreadAsync(cancellationToken);
var solutionWorkingFolder = _solution.Value as IVsSolutionWorkingFolders;
var solutionWorkingFolder = _solutionService.Solution as IVsSolutionWorkingFolders;
Assumes.Present(solutionWorkingFolder);
@ -229,30 +222,38 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.UpToDate
return data;
}
using var stream = new FileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.None);
using var reader = new BinaryReader(stream, Encoding.UTF8, leaveOpen: true);
int configuredProjectCount = reader.ReadInt32();
while (configuredProjectCount-- != 0)
try
{
string path = reader.ReadString();
using var stream = new FileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.None);
using var reader = new BinaryReader(stream, Encoding.UTF8, leaveOpen: true);
int dimensionCount = reader.ReadInt32();
var dimensions = ImmutableStringDictionary<string>.EmptyOrdinal.ToBuilder();
int configuredProjectCount = reader.ReadInt32();
while (dimensionCount-- != 0)
while (configuredProjectCount-- != 0)
{
string name = reader.ReadString();
string value = reader.ReadString();
dimensions[name] = value;
string path = reader.ReadString();
int dimensionCount = reader.ReadInt32();
var dimensions = ImmutableStringDictionary<string>.EmptyOrdinal.ToBuilder();
while (dimensionCount-- != 0)
{
string name = reader.ReadString();
string value = reader.ReadString();
dimensions[name] = value;
}
int hash = reader.ReadInt32();
var itemsChangedAtUtc = new DateTime(reader.ReadInt64(), DateTimeKind.Utc);
var lastSuccessfulBuildStartedAtUtc = new DateTime(reader.ReadInt64(), DateTimeKind.Utc);
data[(path, dimensions.ToImmutable())] = (hash, itemsChangedAtUtc, lastSuccessfulBuildStartedAtUtc);
}
int hash = reader.ReadInt32();
var itemsChangedAtUtc = new DateTime(reader.ReadInt64(), DateTimeKind.Utc);
var lastSuccessfulBuildStartedAtUtc = new DateTime(reader.ReadInt64(), DateTimeKind.Utc);
data[(path, dimensions.ToImmutable())] = (hash, itemsChangedAtUtc, lastSuccessfulBuildStartedAtUtc);
}
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or NotSupportedException or ArgumentException)
{
// Return empty data in case of failure. Assume the whole file is corrupted.
return new();
}
return data;

Просмотреть файл

@ -19,8 +19,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS
{
private readonly IVsUIService<IVsSolution> _solution;
private TaskCompletionSource _loadedInHost = new();
private uint _cookie = VSConstants.VSCOOKIE_NIL;
private TaskCompletionSource _loadedInHost = new(TaskCreationOptions.RunContinuationsAsynchronously);
private IAsyncDisposable? _solutionEventsSubscription;
[ImportingConstructor]
public VsSolutionEventListener(IVsUIService<SVsSolution, IVsSolution> solution, JoinableTaskContext joinableTaskContext)
@ -34,6 +34,52 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS
get { return _loadedInHost.Task; }
}
public IVsSolution Solution
{
get
{
JoinableFactory.Context.VerifyIsOnMainThread();
return _solution.Value;
}
}
public async Task<IAsyncDisposable> SubscribeAsync(IVsSolutionEvents solutionEvents, CancellationToken cancellationToken)
{
await JoinableFactory.SwitchToMainThreadAsync(cancellationToken);
IVsSolution solution = _solution.Value;
Verify.HResult(solution.AdviseSolutionEvents(solutionEvents, out uint cookie));
return new Subscription(solution, JoinableFactory, cookie);
}
private sealed class Subscription : IAsyncDisposable
{
private readonly IVsSolution _solution;
private readonly JoinableTaskFactory _joinableTaskFactory;
private int _cookie;
public Subscription(IVsSolution solution, JoinableTaskFactory joinableTaskFactory, uint cookie)
{
_solution = solution;
_joinableTaskFactory = joinableTaskFactory;
_cookie = unchecked((int)cookie);
}
public async ValueTask DisposeAsync()
{
uint cookie = unchecked((uint)Interlocked.Exchange(ref _cookie, (int)VSConstants.VSCOOKIE_NIL));
if (cookie != VSConstants.VSCOOKIE_NIL)
{
await _joinableTaskFactory.SwitchToMainThreadAsync();
Verify.HResult(_solution.UnadviseSolutionEvents(cookie));
}
}
}
public Task StartListeningAsync()
{
return InitializeAsync(CancellationToken.None);
@ -43,7 +89,7 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS
{
await JoinableFactory.SwitchToMainThreadAsync(cancellationToken);
Verify.HResult(_solution.Value.AdviseSolutionEvents(this, out _cookie));
_solutionEventsSubscription = await SubscribeAsync(this, cancellationToken);
// In the situation where the solution has already been loaded by the time we're
// initialized, we need to make sure we set LoadedInHost as we will have missed the
@ -62,15 +108,13 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS
{
if (initialized)
{
if (_cookie != VSConstants.VSCOOKIE_NIL)
{
await JoinableFactory.SwitchToMainThreadAsync();
Assumes.NotNull(_solutionEventsSubscription);
Verify.HResult(_solution.Value.UnadviseSolutionEvents(_cookie));
await JoinableFactory.SwitchToMainThreadAsync();
_loadedInHost.TrySetCanceled();
_cookie = VSConstants.VSCOOKIE_NIL;
}
await _solutionEventsSubscription.DisposeAsync();
_loadedInHost.TrySetCanceled();
}
}

Просмотреть файл

@ -19,12 +19,12 @@ namespace Microsoft.VisualStudio.Buffers.PooledObjects
_builder = ImmutableArray.CreateBuilder<T>(size);
}
public PooledArray() :
this(8)
public PooledArray()
: this(8)
{ }
private PooledArray(ObjectPool<PooledArray<T>> pool) :
this()
private PooledArray(ObjectPool<PooledArray<T>> pool)
: this()
{
_pool = pool;
}

Просмотреть файл

@ -1,10 +1,11 @@
// 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.md file in the project root for more information.
using Microsoft.VisualStudio.Shell.Interop;
namespace Microsoft.VisualStudio.ProjectSystem
{
/// <summary>
/// Provides a single property; <see cref="LoadedInHost"/>, which completes when the host
/// recognizes that the solution is loaded.
/// Operations and properties related to the solution.
/// </summary>
[ProjectSystemContract(ProjectSystemContractScope.Global, ProjectSystemContractProvider.Private)]
internal interface ISolutionService
@ -23,5 +24,21 @@ namespace Microsoft.VisualStudio.ProjectSystem
{
get;
}
/// <summary>
/// Gets the VS solution object.
/// </summary>
/// <remarks>
/// Must be called from the main thread.
/// </remarks>
IVsSolution Solution { get; }
/// <summary>
/// Creates a new subscription for solution events that will call back via <paramref name="eventListener" />.
/// </summary>
/// <param name="eventListener">The callback for events.</param>
/// <param name="cancellationToken">A token whose cancellation marks lost interest in the result of this task.</param>
/// <returns>An object that unsubscribes when disposed.</returns>
Task<IAsyncDisposable> SubscribeAsync(IVsSolutionEvents eventListener, CancellationToken cancellationToken = default);
}
}

Просмотреть файл

@ -10,9 +10,10 @@ namespace Microsoft.VisualStudio.ProjectSystem.PackageRestore
internal class PackageRestoreSharedJoinableTaskCollection : IJoinableTaskScope
{
[ImportingConstructor]
public PackageRestoreSharedJoinableTaskCollection(IProjectThreadingService threadingService)
public PackageRestoreSharedJoinableTaskCollection(IProjectThreadingService threadingService)
{
JoinableTaskCollection = threadingService.JoinableTaskContext.CreateCollection();
JoinableTaskCollection.DisplayName = nameof(PackageRestoreSharedJoinableTaskCollection);
JoinableTaskFactory = threadingService.JoinableTaskContext.CreateFactory(JoinableTaskCollection);
}

Просмотреть файл

@ -28,8 +28,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties.Package
[ImportingConstructor]
public PackageIconValueProvider(
[Import(ExportContractNames.ProjectItemProviders.SourceFiles)] IProjectItemProvider sourceItemsProvider,
UnconfiguredProject unconfiguredProject) :
base(PackageIconPropertyName, sourceItemsProvider, unconfiguredProject)
UnconfiguredProject unconfiguredProject)
: base(PackageIconPropertyName, sourceItemsProvider, unconfiguredProject)
{
}
}

Просмотреть файл

@ -28,8 +28,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties.Package
[ImportingConstructor]
public PackageLicenseFileValueProvider(
[Import(ExportContractNames.ProjectItemProviders.SourceFiles)] IProjectItemProvider sourceItemsProvider,
UnconfiguredProject unconfiguredProject) :
base(PackageLicenseFilePropertyName, sourceItemsProvider, unconfiguredProject)
UnconfiguredProject unconfiguredProject)
: base(PackageLicenseFilePropertyName, sourceItemsProvider, unconfiguredProject)
{
}
}

Просмотреть файл

@ -28,8 +28,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties.Package
[ImportingConstructor]
public PackageReadmeFileValueProvider(
[Import(ExportContractNames.ProjectItemProviders.SourceFiles)] IProjectItemProvider sourceItemsProvider,
UnconfiguredProject unconfiguredProject) :
base(PackageReadmeFilePropertyName, sourceItemsProvider, unconfiguredProject)
UnconfiguredProject unconfiguredProject)
: base(PackageReadmeFilePropertyName, sourceItemsProvider, unconfiguredProject)
{
}
}

Просмотреть файл

@ -5,7 +5,7 @@
xmlns="http://schemas.microsoft.com/build/2009/properties">
<Rule.DataSource>
<DataSource HasConfigurationCondition="False"
ItemType="CompilerCommandLineArgs "
ItemType="CompilerCommandLineArgs"
MSBuildTarget="CompileDesignTime"
Persistence="ProjectFile"
SourceOfDefaultValue="AfterContext"

Просмотреть файл

@ -1102,10 +1102,11 @@ namespace Microsoft.VisualStudio.ProjectSystem.UpToDate
}
finally
{
if (fileSystemOperations.IsAccelerationCandidate)
if (fileSystemOperations.IsAccelerationCandidate && fileSystemOperations.IsAccelerationEnabled is null)
{
// We didn't copy anything, but we did find a candidate for build acceleration.
// Log this fact, to help users discover the build acceleration feature.
// We didn't copy anything, but we did find a candidate for build acceleration,
// and the project does not specify AccelerateBuildsInVisualStudio. Log a message to
// let the user know that their project might benefit from Build Acceleration.
logger.Minimal(nameof(Resources.FUTD_AccelerationCandidate));
}

Просмотреть файл

@ -160,7 +160,6 @@ namespace Microsoft.VisualStudio.ProjectSystem.UpToDate
/// </remarks>
public ImmutableArray<string> SetNames { get; }
/// <summary>
/// An alphabetically ordered list of the kind names present in this project.
/// </summary>
@ -507,11 +506,7 @@ namespace Microsoft.VisualStudio.ProjectSystem.UpToDate
var itemsByKindBySet = new Dictionary<string, Dictionary<string, HashSet<string>>>(BuildUpToDateCheck.SetNameComparer);
var after = projectChangeDescription.After.Items as IDataWithOriginalSource<KeyValuePair<string, IImmutableDictionary<string, string>>>;
Assumes.NotNull(after);
foreach ((string item, IImmutableDictionary<string, string> metadata) in after.SourceData)
foreach ((string item, IImmutableDictionary<string, string> metadata) in TryGetOrderedData(projectChangeDescription.After.Items))
{
if (metadataPredicate is not null && !metadataPredicate(metadata))
{
@ -541,6 +536,17 @@ namespace Microsoft.VisualStudio.ProjectSystem.UpToDate
pair => pair.Value.ToImmutableArray()),
BuildUpToDateCheck.SetNameComparer);
static IEnumerable<KeyValuePair<string, IImmutableDictionary<string, string>>> TryGetOrderedData(IImmutableDictionary<string, IImmutableDictionary<string, string>> items)
{
if (items is IDataWithOriginalSource<KeyValuePair<string, IImmutableDictionary<string, string>>> dataWithOriginalSource)
return dataWithOriginalSource.SourceData;
// We couldn't obtain ordered items for some reason.
// This is not a big problem, so just return the items in whatever order
// the backing collection from CPS models them in.
return items;
}
void AddItem(string setName, string kindName, string item)
{
if (!itemsByKindBySet.TryGetValue(setName, out Dictionary<string, HashSet<string>>? itemsByKind))

Просмотреть файл

@ -1,7 +1,5 @@
// 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.md file in the project root for more information.
using IAsyncDisposable = System.IAsyncDisposable;
namespace Microsoft.VisualStudio.ProjectSystem
{
internal sealed class AsyncDisposable : IAsyncDisposable

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">Probíhá kontrola kopírování položek z projektu {0}.</target>
<target state="translated">Probíhá kontrola kopírování položek z projektu {0}:</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">Das Kopieren von Elementen aus dem Projekt "{0}" wird überprüft.</target>
<target state="translated">Das Kopieren von Elementen aus dem Projekt „{0}“ wird überprüft:</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">Comprobando elementos de copia del proyecto '{0}'.</target>
<target state="translated">Comprobando elementos de copia del proyecto "{0}":</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">Vérification des éléments de copie à partir du projet « {0} ».</target>
<target state="translated">Vérification des éléments de copie à partir du projet « {0} » :</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">È in corso il controllo della copia degli elementi dal progetto '{0}'.</target>
<target state="translated">È in corso il controllo della copia degli elementi dal progetto '{0}':</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">プロジェクト '{0}' からのコピー項目を確認しています。</target>
<target state="translated">プロジェクト '{0}' からのコピー項目を確認しています:</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">프로젝트 '{0}'에서 항목 복사를 확인하는 중입니다.</target>
<target state="translated">프로젝트 '{0}'에서 항목 복사를 확인하는 중입니다.</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">Sprawdzanie elementów kopii z projektu „{0}”.</target>
<target state="translated">Sprawdzanie elementów kopii z projektu „{0}”:</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">Verificando itens de cópia do projeto '{0}'.</target>
<target state="translated">Verificando itens de cópia do projeto '{0}':</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">Проверка копирования элементов из проекта "{0}".</target>
<target state="translated">Проверка копирования элементов из проекта "{0}":</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">'{0}' projesindeki kopya öğeleri kontrol ediliyor.</target>
<target state="translated">'{0}' projesindeki kopya öğeleri kontrol ediliyor:</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">正在检查项目“{0}”中的复制项。</target>
<target state="translated">正在检查项目“{0}”中的复制项:</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -29,7 +29,7 @@
</trans-unit>
<trans-unit id="FUTDC_CheckingCopyItemsForProject_1">
<source>Checking copy items from project '{0}':</source>
<target state="needs-review-translation">正在檢查從專案 '{0}' 複製項目。</target>
<target state="translated">正在檢查來自專案 '{0}' 的複製項目:</target>
<note>{0} is a file path.</note>
</trans-unit>
<trans-unit id="FUTD_AccelerationCandidate">

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Probíhá kontrola kopírování položek z projektu {0}.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Přeskakování duplicitní kopie položky {0} do {1}]]></Val>
<Val><![CDATA[Probíhá kontrola kopírování položek z projektu {0}:]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Das Kopieren von Elementen aus dem Projekt "{0}" wird überprüft.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Doppeltes Kopierelement "{0}" wird in "{1}" übersprungen.]]></Val>
<Val><![CDATA[Das Kopieren von Elementen aus dem Projekt „{0}“ wird überprüft:]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Comprobando elementos de copia del proyecto '{0}'.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Omitiendo el elemento de copia duplicado '{0}' a '{1}']]></Val>
<Val><![CDATA[Comprobando elementos de copia del proyecto "{0}":]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Vérification des éléments de copie à partir du projet « {0} ».]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Ignorer la copie en double de lélément « {0} » vers « {1} ».]]></Val>
<Val><![CDATA[Vérification des éléments de copie à partir du projet « {0} » :]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[È in corso il controllo della copia degli elementi dal progetto '{0}'.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[La copia duplicata dell'elemento '{0}' in '{1}' verrà ignorata]]></Val>
<Val><![CDATA[È in corso il controllo della copia degli elementi dal progetto '{0}':]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[プロジェクト '{0}' からのコピー項目を確認しています。]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[重複コピー項目 '{0}' を '{1}' にスキップしています]]></Val>
<Val><![CDATA[プロジェクト '{0}' からのコピー項目を確認しています:]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[프로젝트 '{0}'에서 항목 복사를 확인하는 중입니다.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA['{1}'에 중복된 복사 항목 '{0}'을(를) 건너뛰는 중]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Sprawdzanie elementów kopii z projektu „{0}”.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Pomijanie zduplikowanego elementu kopii „{0}” do „{1}”]]></Val>
<Val><![CDATA[Sprawdzanie elementów kopii z projektu „{0}”:]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Verificando itens de cópia do projeto '{0}'.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Ignorando item de cópia duplicado '{0}' para '{1}']]></Val>
<Val><![CDATA[Verificando itens de cópia do projeto '{0}':]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Проверка копирования элементов из проекта "{0}".]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Пропуск копирования элемента "{0}" в "{1}"]]></Val>
<Val><![CDATA[Проверка копирования элементов из проекта "{0}":]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA['{0}' projesindeki kopya öğeleri kontrol ediliyor.]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[Yinelenen kopya öğesi '{0}' yolundan '{1}' yoluna atlanıyor]]></Val>
<Val><![CDATA['{0}' projesindeki kopya öğeleri kontrol ediliyor:]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[正在检查项目“{0}”中的复制项。]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[正在跳过复制项 '{0}' 到 '{1}' 的重复项]]></Val>
<Val><![CDATA[正在检查项目“{0}”中的复制项:]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -93,19 +93,13 @@
</Item>
<Item ItemId=";FUTDC_CheckingCopyItemsForProject_1" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
<Val><![CDATA[Checking copy items from project '{0}':]]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[正在檢查從專案 '{0}' 複製項目。]]></Val>
</Tgt>
</Str>
<Disp Icon="Str" />
</Item>
<Item ItemId=";FUTDC_SkippingDuplicateCopyItem_2" ItemType="0" PsrId="308" InstFlg="true" Leaf="true">
<Str Cat="Text">
<Val><![CDATA[Skipping duplicate copy item '{0}' to '{1}']]></Val>
<Tgt Cat="Text" Stat="Loc" Orig="New">
<Val><![CDATA[正在略過複製項目 '{0}' 到 '{1}']]></Val>
<Val><![CDATA[正在檢查來自專案 '{0}' 的複製項目:]]></Val>
</Tgt>
<Prev Cat="Text">
<Val><![CDATA[Checking copy items from project '{0}'.]]></Val>
</Prev>
</Str>
<Disp Icon="Str" />
</Item>

Просмотреть файл

@ -36,3 +36,6 @@ dotnet_diagnostic.VSTHRD200.severity = none # Naming stylesNaming styles: B
# xunit.analyzers
dotnet_diagnostic.xUnit1026.severity = none # Theory methods must use all parameters
dotnet_diagnostic.xUnit1004.severity = none # Test methods should not be skipped
# White space rules (experimental)
dotnet_diagnostic.IDE2001.severity = none # Allow embedded statements on same line

Просмотреть файл

@ -1,4 +1,3 @@
// 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.md file in the project root for more information.
[assembly: AssemblyTrait("", "UnitTest")]

Просмотреть файл

@ -1,6 +1,5 @@
// 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.md file in the project root for more information.
#pragma warning disable CS0618 // Type or member is obsolete - IImplicitlyTriggeredBuildManager is marked obsolete as it may eventually be replaced with a different API.
namespace Microsoft.VisualStudio.ProjectSystem.Build

Просмотреть файл

@ -31,7 +31,6 @@ namespace Microsoft.VisualStudio.ProjectSystem
mock.Setup(p => p.Services)
.Returns(services);
mock.Setup(p => p.LoadedUnconfiguredProjects)
.Returns(loadedUnconfiguredProjects);

Просмотреть файл

@ -60,5 +60,4 @@ namespace Microsoft.VisualStudio.ProjectSystem
return mock.Object;
}
}
}

Просмотреть файл

@ -69,5 +69,4 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties
Assert.Equal(expectedStoredValue, finalStoredValue);
}
}
}

Просмотреть файл

@ -86,8 +86,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties.InterceptingProjectPro
private class TestValueProvider : PackageFilePropertyValueProviderBase
{
public TestValueProvider(string propertyName, IProjectItemProvider sourceItemsProvider, UnconfiguredProject unconfiguredProject) :
base(propertyName, sourceItemsProvider, unconfiguredProject)
public TestValueProvider(string propertyName, IProjectItemProvider sourceItemsProvider, UnconfiguredProject unconfiguredProject)
: base(propertyName, sourceItemsProvider, unconfiguredProject)
{
}
}

Просмотреть файл

@ -70,5 +70,4 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties
Assert.Equal(expectedStoredValue, finalStoredValue);
}
}
}

Просмотреть файл

@ -162,7 +162,5 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties
launchProfiles: new[] { profile1.ToLaunchProfile(), profile2.ToLaunchProfile() });
return launchSettingsProvider;
}
}
}

Просмотреть файл

@ -781,8 +781,10 @@ namespace Microsoft.VisualStudio.ProjectSystem.UpToDate
}
}
[Fact]
public async Task IsUpToDateAsync_False_CopyReference_InputNewerThanMarkerOutput()
[Theory]
[InlineData(null)]
[InlineData(false)]
public async Task IsUpToDateAsync_False_CopyReference_InputNewerThanMarkerOutput(bool? isBuildAccelerationEnabled)
{
var projectSnapshot = new Dictionary<string, IProjectRuleSnapshotModel>
{
@ -804,8 +806,8 @@ namespace Microsoft.VisualStudio.ProjectSystem.UpToDate
var lastBuildTime = DateTime.UtcNow.AddMinutes(-5);
// We only check copy markers when build acceleration is disabled.
_isBuildAccelerationEnabled = false;
// We only check copy markers when build acceleration is disabled (null or false).
_isBuildAccelerationEnabled = isBuildAccelerationEnabled;
await SetupAsync(projectSnapshot: projectSnapshot, lastSuccessfulBuildStartTimeUtc: lastBuildTime);
@ -819,19 +821,36 @@ namespace Microsoft.VisualStudio.ProjectSystem.UpToDate
_fileSystem.AddFile("Reference1MarkerPath", markerTime);
_fileSystem.AddFile("Reference1OriginalPath", originalTime);
await AssertNotUpToDateAsync(
$"""
Build acceleration is disabled for this project via the 'AccelerateBuildsInVisualStudio' MSBuild property.
Comparing timestamps of inputs and outputs:
No build outputs defined.
Comparing timestamps of copy marker inputs and outputs:
Write timestamp on output marker is {ToLocalTime(outputTime)} on 'C:\Dev\Solution\Project\OutputMarker'.
Adding input reference copy markers:
Reference1OriginalPath
Input marker 'Reference1OriginalPath' is newer ({ToLocalTime(originalTime)}) than output marker 'C:\Dev\Solution\Project\OutputMarker' ({ToLocalTime(outputTime)}), not up-to-date.
This project appears to be a candidate for build acceleration. To opt in, set the 'AccelerateBuildsInVisualStudio' MSBuild property to 'true'.
""",
"InputMarkerNewerThanOutputMarker");
if (isBuildAccelerationEnabled is false)
{
await AssertNotUpToDateAsync(
$"""
Build acceleration is disabled for this project via the 'AccelerateBuildsInVisualStudio' MSBuild property.
Comparing timestamps of inputs and outputs:
No build outputs defined.
Comparing timestamps of copy marker inputs and outputs:
Write timestamp on output marker is {ToLocalTime(outputTime)} on 'C:\Dev\Solution\Project\OutputMarker'.
Adding input reference copy markers:
Reference1OriginalPath
Input marker 'Reference1OriginalPath' is newer ({ToLocalTime(originalTime)}) than output marker 'C:\Dev\Solution\Project\OutputMarker' ({ToLocalTime(outputTime)}), not up-to-date.
""",
"InputMarkerNewerThanOutputMarker");
}
else if (isBuildAccelerationEnabled is null)
{
await AssertNotUpToDateAsync(
$"""
Comparing timestamps of inputs and outputs:
No build outputs defined.
Comparing timestamps of copy marker inputs and outputs:
Write timestamp on output marker is {ToLocalTime(outputTime)} on 'C:\Dev\Solution\Project\OutputMarker'.
Adding input reference copy markers:
Reference1OriginalPath
Input marker 'Reference1OriginalPath' is newer ({ToLocalTime(originalTime)}) than output marker 'C:\Dev\Solution\Project\OutputMarker' ({ToLocalTime(outputTime)}), not up-to-date.
This project appears to be a candidate for build acceleration. To opt in, set the 'AccelerateBuildsInVisualStudio' MSBuild property to 'true'.
""",
"InputMarkerNewerThanOutputMarker");
}
}
[Fact]

Просмотреть файл

@ -1,4 +1,3 @@
// 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.md file in the project root for more information.
[assembly: AssemblyTrait("", "UnitTest")]

Просмотреть файл

@ -19,5 +19,4 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS
return mock.Object;
}
}
}

Просмотреть файл

@ -117,6 +117,5 @@ namespace Microsoft.VisualStudio.ProjectSystem.Properties.InterceptingProjectPro
FormatException exception = Assert.Throws<FormatException>(() => (_encoding.Format(_encoding.Parse(input))));
Assert.Equal("Expected valid name value pair.", exception.Message);
}
}
}

Просмотреть файл

@ -60,9 +60,9 @@ namespace Microsoft.VisualStudio.ProjectSystem.VS.Rename
IProjectThreadingService threadingService,
IVsUIService<IVsExtensibility, IVsExtensibility3> extensibility,
IVsService<SVsOperationProgress, IVsOperationProgressStatusService> operationProgressService,
IVsService<SVsSettingsPersistenceManager, ISettingsManager> settingsManagerService) :
base(unconfiguredProject, projectVsServices, workspace, environmentOptions, userNotificationServices, roslynServices, waitService,
vsOnlineServices, projectAsynchronousTasksService, threadingService, extensibility, operationProgressService, settingsManagerService)
IVsService<SVsSettingsPersistenceManager, ISettingsManager> settingsManagerService)
: base(unconfiguredProject, projectVsServices, workspace, environmentOptions, userNotificationServices, roslynServices, waitService,
vsOnlineServices, projectAsynchronousTasksService, threadingService, extensibility, operationProgressService, settingsManagerService)
{
}

Просмотреть файл

@ -1,6 +1,5 @@
// 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.md file in the project root for more information.
// Nullable annotations don't add a lot of value to this class, and until https://github.com/dotnet/roslyn/issues/33199 is fixed
// MemberData doesn't work anyway
#nullable disable

Просмотреть файл

@ -1,4 +1,3 @@
// 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.md file in the project root for more information.
[assembly: AssemblyTrait("", "UnitTest")]

Просмотреть файл

@ -1,6 +1,6 @@
{
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json",
"version": "17.5",
"version": "17.6",
"cloudBuild": {
"setAllVariables": true
}