示例#1
0
        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));
        }
示例#2
0
        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));
        }