Exemple #1
0
        public AnalyzerResult Analyze()
        {
            var dataFlowAnalysis = _semanticModel.AnalyzeDataFlow(_selectionResult.FirstStatement(), _selectionResult.LastStatement());
            var symbolMap        = GetSymbolMap(_semanticModel);

            GenerateVariableInfoMap(_semanticModel, dataFlowAnalysis, symbolMap, out var variableInfoMap);

            var isInExpressionOrHasReturnStatement = IsInExpressionOrHasReturnStatement(_semanticModel);

            var(parameters, returnType, variableToUseAsReturnValue) =
                GetSignatureInformation(dataFlowAnalysis, variableInfoMap, isInExpressionOrHasReturnStatement);

            var typeParametersInDeclaration    = new List <ITypeParameterSymbol>();
            var typeParametersInConstraintList = new List <ITypeParameterSymbol>();
            var awaitTaskReturn         = false;
            var instanceMemberIsUsed    = false;
            var shouldBeReadOnly        = false;
            var endOfSelectionReachable = true;

            return(new AnalyzerResult(
                       _semanticDocument,
                       typeParametersInDeclaration,
                       typeParametersInConstraintList,
                       parameters,
                       variableToUseAsReturnValue,
                       returnType,
                       awaitTaskReturn,
                       instanceMemberIsUsed,
                       shouldBeReadOnly,
                       endOfSelectionReachable));
        }
        private BlockSyntax SplitOrMoveDeclarationIntoMethodDefinition(BlockSyntax body, CancellationToken cancellationToken)
        {
            var statements    = body.Statements;
            var postProcessor = new PostProcessor(_semanticDocument.SemanticModel, _selectionResult.FirstStatement().SpanStart);

            var variables             = _analyzerResult.GetVariablesToSplitOrMoveIntoMethodDefinition(cancellationToken);
            var declarationStatements = CreateDeclarationStatements(variables);

            declarationStatements = postProcessor.MergeDeclarationStatements(declarationStatements);

            return(SyntaxFactory.Block(declarationStatements.Concat(statements)));
        }
        public static void ReplaceRangeNodes(this SyntaxEditor editor, SelectionResult selectionResult, IEnumerable <SyntaxNode> nodes)
        {
            var firstStatement    = selectionResult.FirstStatement();
            var firstNodeToInsert = nodes.First();

            editor.ReplaceNode(firstStatement, firstNodeToInsert);
            foreach (var statementSyntax in selectionResult.OtherThanFirstStatements())
            {
                editor.RemoveNode(statementSyntax);
            }

            var otherNodes = nodes.Skip(1);

            if (!otherNodes.Any())
            {
                return;
            }

            editor.InsertAfter(firstStatement, otherNodes);
        }