예제 #1
0
 public static IEnumerable<ReplaceAction> GetSimplifications(LocalDeclarationStatementSyntax declaration, ISemanticModel model, Assumptions assume, CancellationToken cancellationToken = default(CancellationToken))
 {
     var scope = declaration.Ancestors().OfType<BlockSyntax>().First();
     var i = scope.Statements.IndexOf(declaration);
     foreach (var v in declaration.Declaration.Variables) {
         if (v.Initializer != null) {
             if (v.Initializer.Value.HasSideEffects(model, assume) != false) continue;
             var anyEffects = declaration.Declaration.Variables.Where(e => e.Initializer != null && e.Initializer.Value.HasSideEffects(model, assume) != false).Any();
             if (v.Initializer.Value.IsConst(model) != true && anyEffects) continue;
         }
         var r = WithDeclarationMoved(scope, declaration, v, model, assume, cancellationToken);
         if (r == null) continue;
         var reducedDeclaration = declaration.Declaration.Variables.Count == 1
                                 ? new LocalDeclarationStatementSyntax[0]
                                 : new[] { declaration.WithDeclaration(declaration.Declaration.WithVariables(declaration.Declaration.Variables.Without(v))) };
         var newScopeWithReducedDeclaration = r.WithStatements(r.Statements.TakeSkipPutTake(i, 1, reducedDeclaration).List());
         yield return new ReplaceAction("Reduce scope", scope, newScopeWithReducedDeclaration, v.Identifier.Span);
     }
 }