예제 #1
0
 bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed)
 {
     wasUsed = false;
     foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType <ExpressionSyntax>())
     {
         var info = model.GetSymbolInfo(usage).Symbol;
         if (info == symbol)
         {
             wasUsed = true;
         }
         if (!usage.IsWrittenTo())
         {
             continue;
         }
         if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression)))
         {
             if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic)
             {
                 continue;
             }
         }
         if (info == symbol)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #2
0
        bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed)
        {
            wasUsed = false;
            foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType <ExpressionSyntax>())
            {
                var info = model.GetSymbolInfo(usage).Symbol;
                if (info == symbol)
                {
                    wasUsed = true;
                }
                if (!usage.IsWrittenTo())
                {
                    // Special case: If variable is of a value type, check if one of its members is altered.
                    var memberAccExpr = usage.Parent as MemberAccessExpressionSyntax;
                    if (symbol.GetReturnType().IsReferenceType ||
                        (memberAccExpr == null) ||
                        (info != symbol) ||
                        (memberAccExpr.Name == usage) ||
                        !memberAccExpr.IsWrittenTo())
                    {
                        continue;
                    }
                }

                if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression)))
                {
                    if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic)
                    {
                        continue;
                    }
                }
                if (info == symbol)
                {
                    return(true);
                }
            }
            return(false);
        }
        public static MemberDeclarationSyntax getPrevious(SyntaxNode current)
        {
            SyntaxNode parent = current.Parent;
            MemberDeclarationSyntax previous = null;

            foreach (MemberDeclarationSyntax node in parent.ChildNodes().OfType <MemberDeclarationSyntax>())
            {
                if (node.Equals(current))
                {
                    if (previous == null)
                    {
                        return(parent.Parent != null ? (MemberDeclarationSyntax)parent : null);
                    }
                    if (isContainer(previous))
                    {
                        return(previous.DescendantNodesAndSelf().OfType <MemberDeclarationSyntax>().LastOrDefault());
                    }
                    return(previous);
                }
                previous = node;
            }
            // this should never happen. By definition the node will be found within its own parent's children
            return(null);
        }
 bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed)
 {
     wasUsed = false;
     foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType<ExpressionSyntax>())
     {
         var info = model.GetSymbolInfo(usage).Symbol;
         if (info == symbol)
             wasUsed = true;
         if (!usage.IsWrittenTo())
             continue;
         if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression)))
         {
             if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic)
                 continue;
         }
         if (info == symbol)
             return true;
     }
     return false;
 }
        bool IsAltered(SemanticModel model, MemberDeclarationSyntax member, ISymbol symbol, CancellationToken token, out bool wasUsed)
        {
            wasUsed = false;
            foreach (var usage in member.DescendantNodesAndSelf().Where(n => n.IsKind(SyntaxKind.IdentifierName)).OfType<ExpressionSyntax>())
            {
                var info = model.GetSymbolInfo(usage).Symbol;
                if (info == symbol)
                    wasUsed = true;
                if (!usage.IsWrittenTo())
                {
                    // Special case: If variable is of a value type, check if one of its members is altered.
                    var memberAccExpr = usage.Parent as MemberAccessExpressionSyntax;
                    if (symbol.GetReturnType().IsReferenceType
                        || (memberAccExpr == null)
                        || (info != symbol)
                        || (memberAccExpr.Name == usage)
                        || !memberAccExpr.IsWrittenTo())
                        continue;
                }

                if (member.IsKind(SyntaxKind.ConstructorDeclaration) && !usage.Ancestors().Any(a => a.IsKind(SyntaxKind.AnonymousMethodExpression) || a.IsKind(SyntaxKind.SimpleLambdaExpression) || a.IsKind(SyntaxKind.ParenthesizedLambdaExpression)))
                {
                    if (member.GetModifiers().Any(m => m.IsKind(SyntaxKind.StaticKeyword)) == info.IsStatic)
                        continue;
                }
                if (info == symbol)
                    return true;
            }
            return false;
        }