本文整理汇总了C#中Workspace.OpenGlobalUndoTransaction方法的典型用法代码示例。如果您正苦于以下问题:C# Workspace.OpenGlobalUndoTransaction方法的具体用法?C# Workspace.OpenGlobalUndoTransaction怎么用?C# Workspace.OpenGlobalUndoTransaction使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Workspace
的用法示例。
在下文中一共展示了Workspace.OpenGlobalUndoTransaction方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ProcessOperationsAsync
private static async Task<Solution> ProcessOperationsAsync(
Workspace workspace, Document fromDocument, string title, Solution oldSolution, Solution updatedSolution, List<CodeActionOperation> operationsList,
IProgressTracker progressTracker, CancellationToken cancellationToken)
{
foreach (var operation in operationsList)
{
var applyChanges = operation as ApplyChangesOperation;
if (applyChanges == null)
{
operation.Apply(workspace, cancellationToken);
continue;
}
// there must be only one ApplyChangesOperation, we will ignore all other ones.
if (updatedSolution == oldSolution)
{
updatedSolution = applyChanges.ChangedSolution;
var projectChanges = updatedSolution.GetChanges(oldSolution).GetProjectChanges();
var changedDocuments = projectChanges.SelectMany(pd => pd.GetChangedDocuments());
var changedAdditionalDocuments = projectChanges.SelectMany(pd => pd.GetChangedAdditionalDocuments());
var changedFiles = changedDocuments.Concat(changedAdditionalDocuments).ToList();
// 0 file changes
if (changedFiles.Count == 0)
{
operation.Apply(workspace, cancellationToken);
continue;
}
// 1 file change
SourceText text = null;
if (changedFiles.Count == 1)
{
if (changedDocuments.Any())
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
text = await oldSolution.GetDocument(changedDocuments.Single()).GetTextAsync(cancellationToken).ConfigureAwait(true);
}
else if (changedAdditionalDocuments.Any())
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
text = await oldSolution.GetAdditionalDocument(changedAdditionalDocuments.Single()).GetTextAsync(cancellationToken).ConfigureAwait(true);
}
}
if (text != null)
{
using (workspace.Services.GetService<ISourceTextUndoService>().RegisterUndoTransaction(text, title))
{
operation.Apply(workspace, cancellationToken);
continue;
}
}
// multiple file changes
using (var undoTransaction = workspace.OpenGlobalUndoTransaction(title))
{
operation.Apply(workspace, progressTracker, cancellationToken);
// link current file in the global undo transaction
if (fromDocument != null)
{
undoTransaction.AddDocument(fromDocument.Id);
}
undoTransaction.Commit();
}
continue;
}
}
return updatedSolution;
}
示例2: ApplyAsync
public async Task ApplyAsync(
Workspace workspace, Document fromDocument,
IEnumerable<CodeActionOperation> operations,
string title, IProgressTracker progressTracker,
CancellationToken cancellationToken)
{
this.AssertIsForeground();
if (_renameService.ActiveSession != null)
{
workspace.Services.GetService<INotificationService>()?.SendNotification(
EditorFeaturesResources.CannotApplyOperationWhileRenameSessionIsActive,
severity: NotificationSeverity.Error);
return;
}
#if DEBUG
var documentErrorLookup = new HashSet<DocumentId>();
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
if (!await document.HasAnyErrorsAsync(cancellationToken).ConfigureAwait(true))
{
documentErrorLookup.Add(document.Id);
}
}
}
#endif
var oldSolution = workspace.CurrentSolution;
Solution updatedSolution = oldSolution;
var operationsList = operations.ToList();
if (operationsList.Count > 1)
{
// Make a linked undo to wrap all these operations. This way we should
// be able to undo them all with one user action.
//
// Note: we only wrap things with an undo action if:
//
// 1. We have multiple operations (this code here).
// 2. We have a SolutionChangedAction and we're making changes to multiple
// documents. (Below in ProcessOperations).
//
// Or, in other words, if we know we're only editing a single file, then we
// don't wrap things with a global undo action.
//
// The reason for this is a global undo forces all files to save. And that's
// rather a heavyweight and unexpected experience for users (for the common
// case where a single file got edited).
//
// When we have multiple operations we assume that this is going to be
// more heavyweight. (After all, a full Roslyn solution change can be represented
// with a single operation). As such, we wrap with an undo so all the operations
// can be undone at once.
using (var transaction = workspace.OpenGlobalUndoTransaction(title))
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
updatedSolution = await ProcessOperationsAsync(
workspace, fromDocument, title, oldSolution,
updatedSolution, operationsList, progressTracker,
cancellationToken).ConfigureAwait(true);
// link current file in the global undo transaction
if (fromDocument != null)
{
transaction.AddDocument(fromDocument.Id);
}
transaction.Commit();
}
}
else
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
updatedSolution = await ProcessOperationsAsync(
workspace, fromDocument, title, oldSolution, updatedSolution, operationsList,
progressTracker, cancellationToken).ConfigureAwait(true);
}
#if DEBUG
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
if (documentErrorLookup.Contains(document.Id))
{
document.VerifyNoErrorsAsync("CodeAction introduced error in error-free code", cancellationToken).Wait(cancellationToken);
}
}
}
#endif
TryStartRenameSession(workspace, oldSolution, updatedSolution, cancellationToken);
}
示例3: ApplyAsync
public async Task ApplyAsync(
Workspace workspace, Document fromDocument,
ImmutableArray<CodeActionOperation> operations,
string title, IProgressTracker progressTracker,
CancellationToken cancellationToken)
{
this.AssertIsForeground();
if (operations.IsDefaultOrEmpty)
{
return;
}
if (_renameService.ActiveSession != null)
{
workspace.Services.GetService<INotificationService>()?.SendNotification(
EditorFeaturesResources.Cannot_apply_operation_while_a_rename_session_is_active,
severity: NotificationSeverity.Error);
return;
}
#if DEBUG
var documentErrorLookup = new HashSet<DocumentId>();
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
if (!await document.HasAnyErrorsAsync(cancellationToken).ConfigureAwait(true))
{
documentErrorLookup.Add(document.Id);
}
}
}
#endif
var oldSolution = workspace.CurrentSolution;
// Determine if we're making a simple text edit to a single file or not.
// If we're not, then we need to make a linked global undo to wrap the
// application of these operations. This way we should be able to undo
// them all with one user action.
//
// The reason we don't always create a gobal undo is that a global undo
// forces all files to save. And that's rather a heavyweight and
// unexpected experience for users (for the common case where a single
// file got edited).
var singleChangedDocument = TryGetSingleChangedText(oldSolution, operations);
if (singleChangedDocument != null)
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
var text = await singleChangedDocument.GetTextAsync(cancellationToken).ConfigureAwait(true);
using (workspace.Services.GetService<ISourceTextUndoService>().RegisterUndoTransaction(text, title))
{
operations.Single().Apply(workspace, cancellationToken);
}
}
else
{
// More than just a single document changed. Make a global undo to run
// all the changes under.
using (var transaction = workspace.OpenGlobalUndoTransaction(title))
{
// ConfigureAwait(true) so we come back to the same thread as
// we do all application on the UI thread.
ProcessOperations(
workspace, operations, progressTracker,
cancellationToken);
// link current file in the global undo transaction
if (fromDocument != null)
{
transaction.AddDocument(fromDocument.Id);
}
transaction.Commit();
}
}
#if DEBUG
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
if (documentErrorLookup.Contains(document.Id))
{
document.VerifyNoErrorsAsync("CodeAction introduced error in error-free code", cancellationToken).Wait(cancellationToken);
}
}
}
#endif
var updatedSolution = operations.OfType<ApplyChangesOperation>().FirstOrDefault()?.ChangedSolution ?? oldSolution;
TryStartRenameSession(workspace, oldSolution, updatedSolution, cancellationToken);
}
示例4: Apply
public void Apply(Workspace workspace, Document fromDocument, IEnumerable<CodeActionOperation> operations, string title, CancellationToken cancellationToken)
{
if (_renameService.ActiveSession != null)
{
workspace.Services.GetService<INotificationService>()?.SendNotification(
EditorFeaturesResources.CannotApplyOperationWhileRenameSessionIsActive,
severity: NotificationSeverity.Error);
return;
}
#if DEBUG
var documentErrorLookup = new HashSet<DocumentId>();
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
if (!document.HasAnyErrorsAsync(cancellationToken).WaitAndGetResult(cancellationToken))
{
documentErrorLookup.Add(document.Id);
}
}
}
#endif
var oldSolution = workspace.CurrentSolution;
Solution updatedSolution = oldSolution;
foreach (var operation in operations)
{
var applyChanges = operation as ApplyChangesOperation;
if (applyChanges == null)
{
operation.Apply(workspace, cancellationToken);
continue;
}
// there must be only one ApplyChangesOperation, we will ignore all other ones.
if (updatedSolution == oldSolution)
{
updatedSolution = applyChanges.ChangedSolution;
var projectChanges = updatedSolution.GetChanges(oldSolution).GetProjectChanges();
var changedDocuments = projectChanges.SelectMany(pd => pd.GetChangedDocuments());
var changedAdditionalDocuments = projectChanges.SelectMany(pd => pd.GetChangedAdditionalDocuments());
var changedFiles = changedDocuments.Concat(changedAdditionalDocuments);
// 0 file changes
if (!changedFiles.Any())
{
operation.Apply(workspace, cancellationToken);
continue;
}
// 1 file change
SourceText text = null;
if (!changedFiles.Skip(1).Any())
{
if (changedDocuments.Any())
{
text = oldSolution.GetDocument(changedDocuments.Single()).GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken);
}
else if (changedAdditionalDocuments.Any())
{
text = oldSolution.GetAdditionalDocument(changedAdditionalDocuments.Single()).GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken);
}
}
if (text != null)
{
using (workspace.Services.GetService<ISourceTextUndoService>().RegisterUndoTransaction(text, title))
{
operation.Apply(workspace, cancellationToken);
continue;
}
}
// multiple file changes
using (var undoTransaction = workspace.OpenGlobalUndoTransaction(title))
{
operation.Apply(workspace, cancellationToken);
// link current file in the global undo transaction
if (fromDocument != null)
{
undoTransaction.AddDocument(fromDocument.Id);
}
undoTransaction.Commit();
}
continue;
}
}
#if DEBUG
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
if (documentErrorLookup.Contains(document.Id))
{
//.........这里部分代码省略.........
示例5: UpdateWorkspaceForGlobalIdentifierRename
private void UpdateWorkspaceForGlobalIdentifierRename(
Workspace workspace,
Solution newSolution,
Solution oldSolution,
string undoName,
IEnumerable<DocumentId> changedDocuments,
ISymbol symbol,
string newName,
int trackingSessionId)
{
AssertIsForeground();
// Perform rename in a workspace undo action so that undo will revert all
// references. It should also be performed in an ITextUndoTransaction to handle
var undoHistory = _undoHistoryRegistry.RegisterHistory(_stateMachine.Buffer);
using (var workspaceUndoTransaction = workspace.OpenGlobalUndoTransaction(undoName))
using (var localUndoTransaction = undoHistory.CreateTransaction(undoName))
{
var undoPrimitiveBefore = new UndoPrimitive(_stateMachine.Buffer, trackingSessionId, shouldRestoreStateOnUndo: false);
localUndoTransaction.AddUndo(undoPrimitiveBefore);
if (!workspace.TryApplyChanges(newSolution))
{
Contract.Fail("Rename Tracking could not update solution.");
}
if (!_refactorNotifyServices.TryOnAfterGlobalSymbolRenamed(workspace, changedDocuments, symbol, newName, throwOnFailure: false))
{
var notificationService = workspace.Services.GetService<INotificationService>();
notificationService.SendNotification(
EditorFeaturesResources.RenameOperationWasNotProperlyCompleted,
EditorFeaturesResources.RenameSymbol,
NotificationSeverity.Information);
}
// Never resume tracking session on redo
var undoPrimitiveAfter = new UndoPrimitive(_stateMachine.Buffer, trackingSessionId, shouldRestoreStateOnUndo: false);
localUndoTransaction.AddUndo(undoPrimitiveAfter);
localUndoTransaction.Complete();
workspaceUndoTransaction.Commit();
}
}
开发者ID:SoumikMukherjeeDOTNET,项目名称:roslyn,代码行数:45,代码来源:RenameTrackingTaggerProvider.RenameTrackingCommitter.cs
示例6: Apply
public void Apply(Workspace workspace, Document fromDocument, IEnumerable<CodeActionOperation> operations, string title, CancellationToken cancellationToken)
{
#if DEBUG
var documentErrorLookup = new HashSet<DocumentId>();
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
if (!document.HasAnyErrors(cancellationToken).WaitAndGetResult(cancellationToken))
{
documentErrorLookup.Add(document.Id);
}
}
}
#endif
var oldSolution = workspace.CurrentSolution;
Solution updatedSolution = oldSolution;
foreach (var operation in operations)
{
var applyChanges = operation as ApplyChangesOperation;
if (applyChanges == null)
{
operation.Apply(workspace, cancellationToken);
continue;
}
// there must be only one ApplyChangesOperation, we will ignore all other ones.
if (updatedSolution == oldSolution)
{
updatedSolution = applyChanges.ChangedSolution;
// check whether it contains only 1 or 0 changed documents
if (!updatedSolution.GetChanges(oldSolution).GetProjectChanges().SelectMany(pd => pd.GetChangedDocuments()).Skip(1).Any())
{
operation.Apply(workspace, cancellationToken);
continue;
}
// multiple file changes
using (var undoTransaction = workspace.OpenGlobalUndoTransaction(title))
{
operation.Apply(workspace, cancellationToken);
// link current file in the global undo transaction
if (fromDocument != null)
{
undoTransaction.AddDocument(fromDocument.Id);
}
undoTransaction.Commit();
}
continue;
}
}
#if DEBUG
foreach (var project in workspace.CurrentSolution.Projects)
{
foreach (var document in project.Documents)
{
if (documentErrorLookup.Contains(document.Id))
{
document.VerifyNoErrorsAsync("CodeAction introduced error in error-free code", cancellationToken).Wait(cancellationToken);
}
}
}
#endif
TryStartRenameSession(workspace, oldSolution, updatedSolution, cancellationToken);
}
示例7: ProcessOperations
private static Solution ProcessOperations(Workspace workspace, Document fromDocument, string title, Solution oldSolution, Solution updatedSolution, List<CodeActionOperation> operationsList, CancellationToken cancellationToken)
{
foreach (var operation in operationsList)
{
var applyChanges = operation as ApplyChangesOperation;
if (applyChanges == null)
{
operation.Apply(workspace, cancellationToken);
continue;
}
// there must be only one ApplyChangesOperation, we will ignore all other ones.
if (updatedSolution == oldSolution)
{
updatedSolution = applyChanges.ChangedSolution;
var projectChanges = updatedSolution.GetChanges(oldSolution).GetProjectChanges();
var changedDocuments = projectChanges.SelectMany(pd => pd.GetChangedDocuments());
var changedAdditionalDocuments = projectChanges.SelectMany(pd => pd.GetChangedAdditionalDocuments());
var changedFiles = changedDocuments.Concat(changedAdditionalDocuments);
// 0 file changes
if (!changedFiles.Any())
{
operation.Apply(workspace, cancellationToken);
continue;
}
// 1 file change
SourceText text = null;
if (!changedFiles.Skip(1).Any())
{
if (changedDocuments.Any())
{
text = oldSolution.GetDocument(changedDocuments.Single()).GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken);
}
else if (changedAdditionalDocuments.Any())
{
text = oldSolution.GetAdditionalDocument(changedAdditionalDocuments.Single()).GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken);
}
}
if (text != null)
{
using (workspace.Services.GetService<ISourceTextUndoService>().RegisterUndoTransaction(text, title))
{
operation.Apply(workspace, cancellationToken);
continue;
}
}
// multiple file changes
using (var undoTransaction = workspace.OpenGlobalUndoTransaction(title))
{
operation.Apply(workspace, cancellationToken);
// link current file in the global undo transaction
if (fromDocument != null)
{
undoTransaction.AddDocument(fromDocument.Id);
}
undoTransaction.Commit();
}
continue;
}
}
return updatedSolution;
}