diff --git a/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/DocumentBasedFixAllProvider.cs b/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/DocumentBasedFixAllProvider.cs index 484c88bde2c1e..823220fb6a546 100644 --- a/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/DocumentBasedFixAllProvider.cs +++ b/src/Workspaces/Core/Portable/CodeFixes/FixAllOccurrences/DocumentBasedFixAllProvider.cs @@ -5,11 +5,9 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CodeFixesAndRefactorings; -using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Utilities; using Microsoft.CodeAnalysis.Text; @@ -28,20 +26,15 @@ namespace Microsoft.CodeAnalysis.CodeFixes; /// project and then appropriately bucketed by document. These are then passed to for implementors to process. /// -public abstract class DocumentBasedFixAllProvider : FixAllProvider +public abstract class DocumentBasedFixAllProvider(ImmutableArray supportedFixAllScopes) : FixAllProvider { - private readonly ImmutableArray _supportedFixAllScopes; + private readonly ImmutableArray _supportedFixAllScopes = supportedFixAllScopes; protected DocumentBasedFixAllProvider() : this(DefaultSupportedFixAllScopes) { } - protected DocumentBasedFixAllProvider(ImmutableArray supportedFixAllScopes) - { - _supportedFixAllScopes = supportedFixAllScopes; - } - /// /// Produce a suitable title for the fix-all this type creates in . Override this if customizing that title is desired. @@ -73,55 +66,33 @@ public sealed override IEnumerable GetSupportedFixAllScopes() fixAllContext.GetDefaultFixAllTitle(), fixAllContext, FixAllContextsHelperAsync); private Task FixAllContextsHelperAsync(FixAllContext originalFixAllContext, ImmutableArray fixAllContexts) - => DocumentBasedFixAllProviderHelpers.FixAllContextsAsync(originalFixAllContext, fixAllContexts, - originalFixAllContext.Progress, - this.GetFixAllTitle(originalFixAllContext), - DetermineDiagnosticsAndGetFixedDocumentsAsync); - - private async Task> DetermineDiagnosticsAndGetFixedDocumentsAsync( - FixAllContext fixAllContext, - IProgress progressTracker) - { - // First, determine the diagnostics to fix. - var diagnostics = await DetermineDiagnosticsAsync(fixAllContext, progressTracker).ConfigureAwait(false); - - // Second, get the fixes for all the diagnostics, and apply them to determine the new root/text for each doc. - return await GetFixedDocumentsAsync(fixAllContext, progressTracker, diagnostics).ConfigureAwait(false); - } - - /// - /// Determines all the diagnostics we should be fixing for the given . - /// - private static async Task>> DetermineDiagnosticsAsync(FixAllContext fixAllContext, IProgress progressTracker) - { - using var _ = progressTracker.ItemCompletedScope(); - return await FixAllContextHelper.GetDocumentDiagnosticsToFixAsync(fixAllContext).ConfigureAwait(false); - } - - /// - /// Attempts to fix all the provided returning, for each updated document, either - /// the new syntax root for that document or its new text. Syntax roots are returned for documents that support - /// them, and are used to perform a final cleanup pass for formatting/simplication/etc. Text is returned for - /// documents that don't support syntax. - /// - private async Task> GetFixedDocumentsAsync( - FixAllContext fixAllContext, IProgress progressTracker, ImmutableDictionary> diagnostics) + => DocumentBasedFixAllProviderHelpers.FixAllContextsAsync( + originalFixAllContext, + fixAllContexts, + originalFixAllContext.Progress, + this.GetFixAllTitle(originalFixAllContext), + DetermineDiagnosticsAndGetFixedDocumentsAsync); + + private async Task DetermineDiagnosticsAndGetFixedDocumentsAsync( + FixAllContext fixAllContext, Action<(DocumentId documentId, (SyntaxNode? node, SourceText? text))> callback) { var cancellationToken = fixAllContext.CancellationToken; - using var _1 = progressTracker.ItemCompletedScope(); - - if (diagnostics.IsEmpty) - return []; - - // Then, process all documents in parallel to get the change for each doc. - return await ProducerConsumer<(DocumentId, (SyntaxNode? node, SourceText? text))>.RunParallelAsync( - source: diagnostics.Where(kvp => !kvp.Value.IsDefaultOrEmpty), - produceItems: static async (kvp, callback, args, cancellationToken) => + // First, determine the diagnostics to fix. + var documentToDiagnostics = await FixAllContextHelper.GetDocumentDiagnosticsToFixAsync(fixAllContext).ConfigureAwait(false); + + // Second, get the fixes for each document+diagnostics pair in parallel, and apply them to determine the new + // root/text for each doc. + await RoslynParallel.ForEachAsync( + source: documentToDiagnostics, + cancellationToken, + async (kvp, cancellationToken) => { var (document, documentDiagnostics) = kvp; + if (documentDiagnostics.IsDefaultOrEmpty) + return; - var newDocument = await args.@this.FixAllAsync(args.fixAllContext, document, documentDiagnostics).ConfigureAwait(false); + var newDocument = await this.FixAllAsync(fixAllContext, document, documentDiagnostics).ConfigureAwait(false); if (newDocument == null || newDocument == document) return; @@ -131,16 +102,6 @@ private static async Task - { - var docIdToNewRootOrText = new Dictionary(); - await foreach (var (docId, nodeOrText) in results) - docIdToNewRootOrText[docId] = nodeOrText; - - return docIdToNewRootOrText; - }, - args: (@this: this, fixAllContext), - cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); } } diff --git a/src/Workspaces/Core/Portable/CodeFixesAndRefactorings/DocumentBasedFixAllProviderHelpers.cs b/src/Workspaces/Core/Portable/CodeFixesAndRefactorings/DocumentBasedFixAllProviderHelpers.cs index 884b79949cce7..1035dcc812517 100644 --- a/src/Workspaces/Core/Portable/CodeFixesAndRefactorings/DocumentBasedFixAllProviderHelpers.cs +++ b/src/Workspaces/Core/Portable/CodeFixesAndRefactorings/DocumentBasedFixAllProviderHelpers.cs @@ -3,9 +3,7 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Collections.Immutable; -using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeActions; @@ -13,7 +11,6 @@ using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Remote; using Microsoft.CodeAnalysis.Shared.Extensions; -using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.CodeAnalysis.Shared.Utilities; using Microsoft.CodeAnalysis.Text; using Roslyn.Utilities; @@ -30,124 +27,111 @@ internal static class DocumentBasedFixAllProviderHelpers ImmutableArray fixAllContexts, IProgress progressTracker, string progressTrackerDescription, - Func, Task>> getFixedDocumentsAsync) + Func, Task> getFixedDocumentsAsync) where TFixAllContext : IFixAllContext { + var cancellationToken = originalFixAllContext.CancellationToken; + progressTracker.Report(CodeAnalysisProgress.Description(progressTrackerDescription)); var solution = originalFixAllContext.Solution; - // For code fixes, we have 3 pieces of work per project. Computing diagnostics, computing fixes, and applying fixes. - // For refactorings, we have 2 pieces of work per project. Computing refactorings, and applying refactorings. - var fixAllKind = originalFixAllContext.State.FixAllKind; - var workItemCount = fixAllKind == FixAllKind.CodeFix ? 3 : 2; - progressTracker.AddItems(fixAllContexts.Length * workItemCount); + // One work item for each context. + progressTracker.AddItems(fixAllContexts.Length); + + var (dirtySolution, changedRootDocumentIds) = await GetInitialUncleanedSolutionAsync().ConfigureAwait(false); + return await CleanSolutionAsync(dirtySolution, changedRootDocumentIds).ConfigureAwait(false); - using var _1 = PooledDictionary.GetInstance(out var allContextsDocIdToNewRootOrText); + async Task<(Solution dirtySolution, ImmutableArray changedRootDocumentIds)> GetInitialUncleanedSolutionAsync() { // First, iterate over all contexts, and collect all the changes for each of them. We'll be making a lot of // calls to the remote server to compute diagnostics and changes. So keep a single connection alive to it // so we never resync or recompute anything. - using var _2 = await RemoteKeepAliveSession.CreateAsync(solution, originalFixAllContext.CancellationToken).ConfigureAwait(false); - - foreach (var fixAllContext in fixAllContexts) - { - Contract.ThrowIfFalse( - fixAllContext.Scope is FixAllScope.Document or FixAllScope.Project or FixAllScope.ContainingMember or FixAllScope.ContainingType); - - // TODO: consider computing this in parallel. - var singleContextDocIdToNewRootOrText = await getFixedDocumentsAsync(fixAllContext, progressTracker).ConfigureAwait(false); - - // Note: it is safe to blindly add the dictionary for a particular context to the full dictionary. Each - // dictionary will only update documents within that context, and each context represents a distinct - // project, so these should all be distinct without collisions. However, to be very safe, we use an - // overwriting policy here to ensure nothing causes any problems here. - foreach (var kvp in singleContextDocIdToNewRootOrText) - allContextsDocIdToNewRootOrText[kvp.Key] = kvp.Value; - } - } + using var _ = await RemoteKeepAliveSession.CreateAsync(solution, cancellationToken).ConfigureAwait(false); - // Next, go and insert those all into the solution so all the docs in this particular project point at - // the new trees (or text). At this point though, the trees have not been cleaned up. We don't cleanup - // the documents as they are created, or one at a time as we add them, as that would cause us to run - // cleanup on N different solution forks (which would be very expensive). Instead, by adding all the - // changed documents to one solution, and then cleaning *those* we only perform cleanup semantics on one - // forked solution. - var currentSolution = solution; - foreach (var (docId, (newRoot, newText)) in allContextsDocIdToNewRootOrText) - { - currentSolution = newRoot != null - ? currentSolution.WithDocumentSyntaxRoot(docId, newRoot) - : currentSolution.WithDocumentText(docId, newText!); + return await ProducerConsumer<(DocumentId documentId, (SyntaxNode? node, SourceText? text))>.RunParallelAsync( + source: fixAllContexts, + produceItems: static async (fixAllContext, callback, args, cancellationToken) => + { + // Update our progress for each fixAllContext we process. + using var _ = args.progressTracker.ItemCompletedScope(); + + Contract.ThrowIfFalse( + fixAllContext.Scope is FixAllScope.Document or FixAllScope.Project or FixAllScope.ContainingMember or FixAllScope.ContainingType); + + await args.getFixedDocumentsAsync(fixAllContext, callback).ConfigureAwait(false); + }, + consumeItems: static async (stream, args, cancellationToken) => + { + var currentSolution = args.solution; + using var _ = ArrayBuilder.GetInstance(out var changedRootDocumentIds); + + // Next, go and insert those all into the solution so all the docs in this particular project + // point at the new trees (or text). At this point though, the trees have not been cleaned up. + // We don't cleanup the documents as they are created, or one at a time as we add them, as that + // would cause us to run cleanup on N different solution forks (which would be very expensive). + // Instead, by adding all the changed documents to one solution, and then cleaning *those* we + // only perform cleanup semantics on one forked solution. + await foreach (var (docId, (newRoot, newText)) in stream) + { + // If we produced a new root (as opposed to new text), keep track of that doc-id so that we + // can clean this doc later. + if (newRoot != null) + changedRootDocumentIds.Add(docId); + + currentSolution = newRoot != null + ? currentSolution.WithDocumentSyntaxRoot(docId, newRoot) + : currentSolution.WithDocumentText(docId, newText!); + } + + return (currentSolution, changedRootDocumentIds.ToImmutableAndClear()); + }, + args: (getFixedDocumentsAsync, progressTracker, solution), + cancellationToken).ConfigureAwait(false); } + async Task CleanSolutionAsync(Solution dirtySolution, ImmutableArray changedRootDocumentIds) { + if (changedRootDocumentIds.IsEmpty) + return dirtySolution; + + // Clear out the progress so far. We're starting a new progress pass for the final cleanup. + progressTracker.Report(CodeAnalysisProgress.Clear()); + progressTracker.Report(CodeAnalysisProgress.AddIncompleteItems(changedRootDocumentIds.Length, WorkspacesResources.Running_code_cleanup_on_fixed_documents)); + // We're about to making a ton of calls to this new solution, including expensive oop calls to get up to // date compilations, skeletons and SG docs. Create and pin this solution so that all remote calls operate // on the same fork and do not cause the forked solution to be created and dropped repeatedly. - using var _2 = await RemoteKeepAliveSession.CreateAsync(currentSolution, originalFixAllContext.CancellationToken).ConfigureAwait(false); - - var finalSolution = await CleanupAndApplyChangesAsync( - progressTracker, - currentSolution, - allContextsDocIdToNewRootOrText, - originalFixAllContext.CancellationToken).ConfigureAwait(false); - - return finalSolution; - } - } - - /// - /// Take all the fixed documents and format/simplify/clean them up (if the language supports that), and take the - /// resultant text and apply it to the solution. If the language doesn't support cleanup, then just take the - /// given text and apply that instead. - /// - private static async Task CleanupAndApplyChangesAsync( - IProgress progressTracker, - Solution currentSolution, - Dictionary docIdToNewRootOrText, - CancellationToken cancellationToken) - { - using var _1 = progressTracker.ItemCompletedScope(); - - if (docIdToNewRootOrText.Count == 0) - return currentSolution; - - // Next, go and cleanup any trees we inserted. Once we clean the document, we get the text of it and insert - // that back into the final solution. This way we can release both the original fixed tree, and the cleaned - // tree (both of which can be much more expensive than just text). - // - // Do this in parallel across all the documents that were fixed. - - return await ProducerConsumer<(DocumentId docId, SourceText sourceText)>.RunParallelAsync( - source: docIdToNewRootOrText, - produceItems: static async (tuple, callback, currentSolution, cancellationToken) => - { - var (docId, (newRoot, _)) = tuple; - if (newRoot != null) + using var _ = await RemoteKeepAliveSession.CreateAsync(dirtySolution, cancellationToken).ConfigureAwait(false); + + // Next, go and cleanup any trees we inserted. Once we clean the document, we get the text of it and insert that + // back into the final solution. This way we can release both the original fixed tree, and the cleaned tree + // (both of which can be much more expensive than just text). + // + // Do this in parallel across all the documents that were fixed and resulted in a new tree (as opposed to new + // text). + return await ProducerConsumer<(DocumentId docId, SourceText sourceText)>.RunParallelAsync( + source: changedRootDocumentIds, + produceItems: static async (documentId, callback, args, cancellationToken) => { - var cleaned = await GetCleanedDocumentAsync( - currentSolution.GetRequiredDocument(docId), cancellationToken).ConfigureAwait(false); - callback(cleaned); - } - }, - consumeItems: static async (results, currentSolution, _) => - { - // Finally, apply the cleaned documents to the solution. - var finalSolution = currentSolution; - await foreach (var (docId, cleanedText) in results) - finalSolution = finalSolution.WithDocumentText(docId, cleanedText); - - return finalSolution; - }, - args: currentSolution, - cancellationToken).ConfigureAwait(false); - - static async Task<(DocumentId docId, SourceText sourceText)> GetCleanedDocumentAsync(Document dirtyDocument, CancellationToken cancellationToken) - { - var cleanedDocument = await PostProcessCodeAction.Instance.PostProcessChangesAsync(dirtyDocument, cancellationToken).ConfigureAwait(false); - var cleanedText = await cleanedDocument.GetValueTextAsync(cancellationToken).ConfigureAwait(false); - return (dirtyDocument.Id, cleanedText); + using var _ = args.progressTracker.ItemCompletedScope(); + + var dirtyDocument = args.dirtySolution.GetRequiredDocument(documentId); + var cleanedDocument = await PostProcessCodeAction.Instance.PostProcessChangesAsync(dirtyDocument, cancellationToken).ConfigureAwait(false); + var cleanedText = await cleanedDocument.GetValueTextAsync(cancellationToken).ConfigureAwait(false); + callback((dirtyDocument.Id, cleanedText)); + }, + consumeItems: static async (results, args, cancellationToken) => + { + // Finally, apply the cleaned documents to the solution. + var finalSolution = args.dirtySolution; + await foreach (var (docId, cleanedText) in results) + finalSolution = finalSolution.WithDocumentText(docId, cleanedText); + + return finalSolution; + }, + args: (dirtySolution, progressTracker), + cancellationToken).ConfigureAwait(false); } } diff --git a/src/Workspaces/Core/Portable/CodeRefactorings/FixAllOccurences/DocumentBasedFixAllProvider.cs b/src/Workspaces/Core/Portable/CodeRefactorings/FixAllOccurences/DocumentBasedFixAllProvider.cs index 9247f59f7a20b..7bb3a4c6c2526 100644 --- a/src/Workspaces/Core/Portable/CodeRefactorings/FixAllOccurences/DocumentBasedFixAllProvider.cs +++ b/src/Workspaces/Core/Portable/CodeRefactorings/FixAllOccurences/DocumentBasedFixAllProvider.cs @@ -73,10 +73,12 @@ public sealed override IEnumerable GetSupportedFixAllScopes() fixAllContext.GetDefaultFixAllTitle(), fixAllContext, FixAllContextsHelperAsync); private Task FixAllContextsHelperAsync(FixAllContext originalFixAllContext, ImmutableArray fixAllContexts) - => DocumentBasedFixAllProviderHelpers.FixAllContextsAsync(originalFixAllContext, fixAllContexts, - originalFixAllContext.Progress, - this.GetFixAllTitle(originalFixAllContext), - GetFixedDocumentsAsync); + => DocumentBasedFixAllProviderHelpers.FixAllContextsAsync( + originalFixAllContext, + fixAllContexts, + originalFixAllContext.Progress, + this.GetFixAllTitle(originalFixAllContext), + GetFixedDocumentsAsync); /// /// Attempts to apply fix all operations returning, for each updated document, either @@ -84,25 +86,24 @@ public sealed override IEnumerable GetSupportedFixAllScopes() /// them, and are used to perform a final cleanup pass for formatting/simplication/etc. Text is returned for /// documents that don't support syntax. /// - private async Task> GetFixedDocumentsAsync( - FixAllContext fixAllContext, IProgress progressTracker) + private async Task GetFixedDocumentsAsync( + FixAllContext fixAllContext, Action<(DocumentId documentId, (SyntaxNode? node, SourceText? text))> callback) { Contract.ThrowIfFalse(fixAllContext.Scope is FixAllScope.Document or FixAllScope.Project or FixAllScope.ContainingMember or FixAllScope.ContainingType); var cancellationToken = fixAllContext.CancellationToken; - using var _1 = progressTracker.ItemCompletedScope(); - // Process all documents in parallel to get the change for each doc. var documentsAndSpansToFix = await fixAllContext.GetFixAllSpansAsync(cancellationToken).ConfigureAwait(false); - return await ProducerConsumer<(DocumentId, (SyntaxNode? node, SourceText? text))>.RunParallelAsync( + await RoslynParallel.ForEachAsync( source: documentsAndSpansToFix, - produceItems: static async (tuple, callback, args, cancellationToken) => + cancellationToken, + async (tuple, cancellationToken) => { var (document, spans) = tuple; - var newDocument = await args.@this.FixAllAsync(args.fixAllContext, document, spans).ConfigureAwait(false); + var newDocument = await this.FixAllAsync(fixAllContext, document, spans).ConfigureAwait(false); if (newDocument == null || newDocument == document) return; @@ -112,17 +113,6 @@ public sealed override IEnumerable GetSupportedFixAllScopes() var text = newDocument.SupportsSyntaxTree ? null : await newDocument.GetValueTextAsync(cancellationToken).ConfigureAwait(false); callback((document.Id, (node, text))); - }, - consumeItems: static async (results, args, cancellationToken) => - { - var docIdToNewRootOrText = new Dictionary(); - - await foreach (var (docId, nodeOrText) in results) - docIdToNewRootOrText[docId] = nodeOrText; - - return docIdToNewRootOrText; - }, - args: (@this: this, fixAllContext), - cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); } } diff --git a/src/Workspaces/Core/Portable/WorkspacesResources.resx b/src/Workspaces/Core/Portable/WorkspacesResources.resx index 39e13ef0bb761..7e20b01c147b4 100644 --- a/src/Workspaces/Core/Portable/WorkspacesResources.resx +++ b/src/Workspaces/Core/Portable/WorkspacesResources.resx @@ -492,4 +492,7 @@ Unexpected value '{0}' in DocumentKinds array. + + Running code cleanup on fixed documents + \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.cs.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.cs.xlf index 93569dd7abbc2..60a243b017cfe 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.cs.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.cs.xlf @@ -127,6 +127,11 @@ Přejmenovat {0} na {1} + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference Řešení neobsahuje zadaný odkaz. diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.de.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.de.xlf index 4dbc4bbf1268c..f5a183f74084a 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.de.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.de.xlf @@ -127,6 +127,11 @@ "{0}" in "{1}" umbenennen + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference Der angegebene Verweis ist nicht in der Projektmappe enthalten. diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.es.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.es.xlf index d79f326dae933..66c1cf566b81a 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.es.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.es.xlf @@ -127,6 +127,11 @@ Cambiar el nombre de '{0}' a '{1}' + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference La solución no contiene la referencia especificada diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.fr.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.fr.xlf index 4437971ba7614..910f067fea546 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.fr.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.fr.xlf @@ -127,6 +127,11 @@ Renommer '{0}' en '{1}' + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference La solution ne contient pas la référence spécifiée diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.it.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.it.xlf index 77eab2b223826..131b63119784b 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.it.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.it.xlf @@ -127,6 +127,11 @@ Rinomina '{0}' in '{1}' + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference La soluzione non contiene il riferimento specificato diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ja.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ja.xlf index 7f16149e410ce..f6cc2a2be97c6 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ja.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ja.xlf @@ -127,6 +127,11 @@ '{0}' を '{1}' に名前変更 + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference 指定された参照がソリューションに含まれていません diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ko.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ko.xlf index ab6a3d0da4853..574613a48d02b 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ko.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ko.xlf @@ -127,6 +127,11 @@ '{1}'(으)로 '{0}' 이름 바꾸기 + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference 지정된 참조가 솔루션에 포함되어 있지 않습니다. diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pl.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pl.xlf index 5d6df9750c27b..89229d1e54580 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pl.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pl.xlf @@ -127,6 +127,11 @@ Zmień nazwę elementu „{0}” na „{1}” + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference Rozwiązanie nie zawiera określonego odwołania diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pt-BR.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pt-BR.xlf index d61231dbb8017..7b0d07ee6716c 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pt-BR.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.pt-BR.xlf @@ -127,6 +127,11 @@ Renomear "{0}" para "{1}" + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference A solução não contém a referência especificada diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ru.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ru.xlf index a59fe061c71d0..643fa036d905b 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ru.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.ru.xlf @@ -127,6 +127,11 @@ Переименовать "{0}" в "{1}" + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference Решение не содержит указанную ссылку. diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.tr.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.tr.xlf index a27884ea21b81..31523544c5c26 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.tr.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.tr.xlf @@ -127,6 +127,11 @@ '{0}' öğesini '{1}' olarak yeniden adlandır + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference Çözüm belirtilen başvuruyu içermiyor diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hans.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hans.xlf index 282030d47ddc5..1a8ed118e7826 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hans.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hans.xlf @@ -127,6 +127,11 @@ 将“{0}” 重命名为“{1}” + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference 解决方案不包含指定的引用 diff --git a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hant.xlf b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hant.xlf index fa3e4431600d7..9fd5e7497d743 100644 --- a/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hant.xlf +++ b/src/Workspaces/Core/Portable/xlf/WorkspacesResources.zh-Hant.xlf @@ -127,6 +127,11 @@ 將 '{0}' 重新命名為 '{1}' + + Running code cleanup on fixed documents + Running code cleanup on fixed documents + + Solution does not contain specified reference 解決方案未包含指定的參考