public async Task <ExtractMethodResult> ExtractMethodAsync(CancellationToken cancellationToken) { var operationStatus = OriginalSelectionResult.Status; var analyzeResult = await AnalyzeAsync(OriginalSelectionResult, LocalFunction, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); operationStatus = await CheckVariableTypesAsync(analyzeResult.Status.With(operationStatus), analyzeResult, cancellationToken).ConfigureAwait(false); if (operationStatus.FailedWithNoBestEffortSuggestion()) { return(new FailedExtractMethodResult(operationStatus)); } var insertionPoint = await GetInsertionPointAsync(analyzeResult.SemanticDocument, OriginalSelectionResult.OriginalSpan.Start, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); var triviaResult = await PreserveTriviaAsync(OriginalSelectionResult.With(insertionPoint.SemanticDocument), cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); var expandedDocument = await ExpandAsync(OriginalSelectionResult.With(triviaResult.SemanticDocument), cancellationToken).ConfigureAwait(false); var generatedCode = await GenerateCodeAsync( insertionPoint.With(expandedDocument), OriginalSelectionResult.With(expandedDocument), analyzeResult.With(expandedDocument), cancellationToken).ConfigureAwait(false); var applied = await triviaResult.ApplyAsync(generatedCode, cancellationToken).ConfigureAwait(false); var afterTriviaRestored = applied.With(operationStatus); cancellationToken.ThrowIfCancellationRequested(); if (afterTriviaRestored.Status.FailedWithNoBestEffortSuggestion()) { return(await CreateExtractMethodResultAsync( operationStatus, generatedCode.SemanticDocument, generatedCode.MethodNameAnnotation, generatedCode.MethodDefinitionAnnotation, cancellationToken).ConfigureAwait(false)); } var finalDocument = afterTriviaRestored.Data.Document; finalDocument = await Formatter.FormatAsync( finalDocument, Formatter.Annotation, options : null, rules : GetFormattingRules(finalDocument), cancellationToken : cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); return(await CreateExtractMethodResultAsync( operationStatus.With(generatedCode.Status), await SemanticDocument.CreateAsync(finalDocument, cancellationToken).ConfigureAwait(false), generatedCode.MethodNameAnnotation, generatedCode.MethodDefinitionAnnotation, cancellationToken).ConfigureAwait(false)); }
public async Task <ExtractMethodResult> ExtractMethodAsync(CancellationToken cancellationToken) { var operationStatus = OriginalSelectionResult.Status; var analyzeResult = await AnalyzeAsync(OriginalSelectionResult, LocalFunction, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); operationStatus = await CheckVariableTypesAsync(analyzeResult.Status.With(operationStatus), analyzeResult, cancellationToken).ConfigureAwait(false); if (operationStatus.FailedWithNoBestEffortSuggestion()) { return(new FailedExtractMethodResult(operationStatus)); } var insertionPoint = await GetInsertionPointAsync(analyzeResult.SemanticDocument, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); var triviaResult = await PreserveTriviaAsync(OriginalSelectionResult.With(insertionPoint.SemanticDocument), cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); var expandedDocument = await ExpandAsync(OriginalSelectionResult.With(triviaResult.SemanticDocument), cancellationToken).ConfigureAwait(false); var generatedCode = await GenerateCodeAsync( insertionPoint.With(expandedDocument), OriginalSelectionResult.With(expandedDocument), analyzeResult.With(expandedDocument), Options.CodeGenerationOptions, Options.NamingPreferences, cancellationToken).ConfigureAwait(false); var applied = await triviaResult.ApplyAsync(generatedCode, cancellationToken).ConfigureAwait(false); var afterTriviaRestored = applied.With(operationStatus); cancellationToken.ThrowIfCancellationRequested(); if (afterTriviaRestored.Status.FailedWithNoBestEffortSuggestion()) { return(await CreateExtractMethodResultAsync( operationStatus, generatedCode.SemanticDocument, ImmutableArray <AbstractFormattingRule> .Empty, generatedCode.MethodNameAnnotation, generatedCode.MethodDefinitionAnnotation, cancellationToken).ConfigureAwait(false)); } var documentWithoutFinalFormatting = afterTriviaRestored.Data.Document; cancellationToken.ThrowIfCancellationRequested(); return(await CreateExtractMethodResultAsync( operationStatus.With(generatedCode.Status), await SemanticDocument.CreateAsync(documentWithoutFinalFormatting, cancellationToken).ConfigureAwait(false), GetFormattingRules(documentWithoutFinalFormatting), generatedCode.MethodNameAnnotation, generatedCode.MethodDefinitionAnnotation, cancellationToken).ConfigureAwait(false)); }