提交 09aac2c2 编写于 作者: M Matt Warren

Merge pull request #3229 from mattwar/Bug1089540

Remove tail recursion and enable cancellation
......@@ -49,7 +49,7 @@ private bool TryExecuteCommand(FormatDocumentCommandArgs args)
_waitIndicator.Wait(
title: EditorFeaturesResources.FormatDocument,
message: EditorFeaturesResources.FormattingDocument,
allowCancel: false,
allowCancel: true,
action: waitContext =>
{
Format(args.TextView, document, null, waitContext.CancellationToken);
......
......@@ -52,7 +52,7 @@ private bool TryExecuteCommand(FormatSelectionCommandArgs args)
_waitIndicator.Wait(
title: EditorFeaturesResources.FormatSelection,
message: EditorFeaturesResources.FormattingCurrentlySelected,
allowCancel: false,
allowCancel: true,
action: waitContext =>
{
var buffer = args.SubjectBuffer;
......
......@@ -29,7 +29,7 @@ public void ExecuteCommand(PasteCommandArgs args, Action nextHandler)
_waitIndicator.Wait(
title: EditorFeaturesResources.FormatPaste,
message: EditorFeaturesResources.FormattingPastedText,
allowCancel: false,
allowCancel: true,
action: c => ExecuteCommandWorker(args, nextHandler, c.CancellationToken));
}
......
......@@ -409,25 +409,28 @@ public IEnumerable<IndentBlockOperation> GetAllRelativeIndentBlockOperations()
return _relativeIndentationTree.GetIntersectingInOrderIntervals(this.TreeData.StartPosition, this.TreeData.EndPosition, this).Select(i => i.Operation);
}
public SyntaxToken GetEndTokenForRelativeIndentationSpan(SyntaxToken token)
public SyntaxToken GetEndTokenForRelativeIndentationSpan(SyntaxToken token, CancellationToken cancellationToken)
{
var span = token.Span;
var indentationData = _relativeIndentationTree.GetSmallestContainingInterval(span.Start, 0);
if (indentationData == null)
while (true)
{
// this means the given token is not inside of inseparable regions
return token;
}
var span = token.Span;
var indentationData = _relativeIndentationTree.GetSmallestContainingInterval(span.Start, 0);
if (indentationData == null)
{
// this means the given token is not inside of inseparable regions
return token;
}
// recursively find the end token outside of inseparable regions
var nextToken = indentationData.EndToken.GetNextToken(includeZeroWidth: true);
if (nextToken.RawKind == 0)
{
// reached end of tree
return default(SyntaxToken);
}
// recursively find the end token outside of inseparable regions
token = indentationData.EndToken.GetNextToken(includeZeroWidth: true);
if (token.RawKind == 0)
{
// reached end of tree
return default(SyntaxToken);
}
return GetEndTokenForRelativeIndentationSpan(nextToken);
cancellationToken.ThrowIfCancellationRequested();
}
}
private AnchorData GetAnchorData(SyntaxToken token)
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Threading;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
......@@ -28,7 +29,7 @@ public Partitioner(FormattingContext context, TokenStream tokenStream, TokenPair
_operationPairs = operationPairs;
}
public List<IEnumerable<TokenPairWithOperations>> GetPartitions(int partitionCount)
public List<IEnumerable<TokenPairWithOperations>> GetPartitions(int partitionCount, CancellationToken cancellationToken)
{
Contract.ThrowIfFalse(partitionCount > 0);
......@@ -58,7 +59,7 @@ public List<IEnumerable<TokenPairWithOperations>> GetPartitions(int partitionCou
break;
}
var nextToken = _context.GetEndTokenForRelativeIndentationSpan(_operationPairs[nextPartitionStartOperationIndex].Token1);
var nextToken = _context.GetEndTokenForRelativeIndentationSpan(_operationPairs[nextPartitionStartOperationIndex].Token1, cancellationToken);
if (nextToken.RawKind == 0)
{
// reached the last token in the tree
......@@ -79,6 +80,8 @@ public List<IEnumerable<TokenPairWithOperations>> GetPartitions(int partitionCou
list.Add(GetOperationPairsFromTo(currentOperationIndex, nextTokenWithIndex.IndexInStream));
currentOperationIndex = nextTokenWithIndex.IndexInStream;
cancellationToken.ThrowIfCancellationRequested();
}
return list;
......
......@@ -441,7 +441,9 @@ private SyntaxToken FindCorrectBaseTokenOfRelativeIndentBlockOperation(IndentBlo
var partitioner = new Partitioner(context, tokenStream, tokenOperations);
// always create task 1 more than current processor count
var partitions = partitioner.GetPartitions(this.TaskExecutor == TaskExecutor.Synchronous ? 1 : Environment.ProcessorCount + 1);
var partitions = partitioner.GetPartitions(this.TaskExecutor == TaskExecutor.Synchronous ? 1 : Environment.ProcessorCount + 1, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
var tasks = new Task[partitions.Count];
for (int i = 0; i < partitions.Count; i++)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册