示例#1
0
 public override AccessorOrMutator VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
 {
     switch (node.Kind())
     {
     case SyntaxKind.SimpleMemberAccessExpression:
         var left          = Visit(node.Expression);
         var rightAccessor = Visit(node.Name) as Accessor;
         if (rightAccessor != null)
         {
             var leftAccessor = left as Accessor;
             if (leftAccessor != null)
             {
                 // Chain accessors to keep them assignable
                 leftAccessor.Append(rightAccessor);
                 return(leftAccessor);
             }
             else
             {
                 return(left.GetMutator(this).Extract(rightAccessor));
             }
         }
         break;
     }
     throw new SyntaxErrorException("Unsupported syntax: " + node);
 }
示例#2
0
 public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
 {
     if (node.Kind() == SyntaxKind.PointerMemberAccessExpression)
     {
         ContainsUnsafe = true;
     }
     else
     {
         base.VisitMemberAccessExpression(node);
     }
 }
示例#3
0
        private static MemberAccessExpressionSyntax CreateMemberAccessExpressionSyntax(NameSyntax newNameSyntax, MemberAccessExpressionSyntax memberAccessExpressionSyntax, bool isObsoleteTypeKey)
        {
            if (newNameSyntax == null)
            {
                return(null);
            }

            MemberAccessExpressionSyntax newMemberAccess = null;

            if (newNameSyntax is QualifiedNameSyntax qualifiedNameSyntax)
            {
                ExpressionSyntax expressionSyntax = qualifiedNameSyntax.Left;
                if (memberAccessExpressionSyntax.Expression is ObjectCreationExpressionSyntax objectCreationExpression)
                {
                    var typeSyntax = SyntaxFactory.ParseTypeName(qualifiedNameSyntax.Left.ToFullString());
                    if (typeSyntax != null)
                    {
                        var newObjectCreationExpression = objectCreationExpression.WithType(typeSyntax);
                        expressionSyntax = newObjectCreationExpression;
                    }
                }

                newMemberAccess = SyntaxFactory.MemberAccessExpression(memberAccessExpressionSyntax.Kind(), expressionSyntax, qualifiedNameSyntax.DotToken, qualifiedNameSyntax.Right);
            }
            else if (newNameSyntax is SimpleNameSyntax simpleNameSyntax)
            {
                if (isObsoleteTypeKey)
                {
                    newMemberAccess = memberAccessExpressionSyntax.WithExpression(simpleNameSyntax);
                }
                else
                {
                    newMemberAccess = memberAccessExpressionSyntax.WithName(simpleNameSyntax);
                }
            }

            newMemberAccess = newMemberAccess?.WithTriviaFrom(memberAccessExpressionSyntax);

            return(newMemberAccess);
        }
        public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
        {
            SyntaxNode root = await context.Document.GetSyntaxRootAsync(context.CancellationToken);

            MemberAccessExpressionSyntax node = root
                                                .FindNode(context.Span, getInnermostNodeForTie: true)?
                                                .FirstAncestorOrSelf <MemberAccessExpressionSyntax>();

            if (node?.Kind() != SyntaxKind.SimpleMemberAccessExpression)
            {
                return;
            }

            ExpressionChainRefactoring.FormatExpressionChain(context, node);

            if (context.Document.SupportsSemanticModel)
            {
                SemanticModel semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken);

                ConvertStringEmptyToEmptyStringLiteral(context, node, semanticModel);
            }
        }
示例#5
0
        public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            node = (MemberAccessExpressionSyntax)base.VisitMemberAccessExpression(node);

            var memberSymbolInfo = treeContext.Model.GetSymbolInfo(node);

            if (null == memberSymbolInfo.Symbol)
            {
                throw new TranspilationException($"Unresolved symbol: {node}");
            }
            var fieldSymbol = memberSymbolInfo.Symbol as IFieldSymbol;

            if (null != fieldSymbol)
            {
                var elementAccess = node.Expression as ElementAccessExpressionSyntax;
                if (null != elementAccess)
                {
                    var objectSymbolInfo = treeContext.Model.GetSymbolInfo(elementAccess.Expression);
                    if (null == objectSymbolInfo.Symbol)
                    {
                        throw new TranspilationException($"Unresolved symbol: {elementAccess.Expression}");
                    }
                    RewriteInfo rewriteInfo;
                    if (treeContext.Context.RewriteTargets.TryGetValue(objectSymbolInfo.Symbol, out rewriteInfo))
                    {
                        if (node.Kind() == SyntaxKind.PointerMemberAccessExpression)
                        {
                            throw new TranspilationException($"Unsupported member access: {node}");
                        }

                        return(SF.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                                         SF.member)
                               rewriteInfo.ElementFieldColumns[fieldSymbol]);
                    }
                }
            }
        }
        public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            node = (MemberAccessExpressionSyntax)base.VisitMemberAccessExpression(node);

            if ((node.Kind() != SyntaxKind.SimpleMemberAccessExpression))
            {
                return(node);
            }
            //only one invocation is skipped.
            if (node.Parent.Kind() == SyntaxKind.SimpleAssignmentExpression)
            {
                bottomUp = 0;
                return(node);
            }
            if (node.Parent.Kind() == SyntaxKind.InvocationExpression)
            {
                bottomUp = 0;
                return(node);
            }
            if (node.Parent.Kind() == SyntaxKind.EqualsValueClause)
            {
                bottomUp = 0;
                return(node);
            }
            if (node.Parent.Kind() == SyntaxKind.Block)
            {
                bottomUp = 0;
                return(node);
            }
            if (node.Parent.Kind() == SyntaxKind.ExpressionStatement)
            {
                if (node.Parent.Parent.Kind() == SyntaxKind.Block)
                {
                    bottomUp = 0;
                    return(node);
                }
            }


            int markedNodesCount = markedNodes.Count();

            if (markedNodesCount > 0)
            {
                bottomUp++;
                return(node);
            }

            if (bottomUp + 2 < VirtualizationContext.MAX_OPERANDS)
            {
                bottomUp++;
//                return node;
            }

            string tempName = TemporaryVarIdentifier;

            var tempVar        = SyntaxFactoryExtensions.LocalVariableDeclaration(tempName, node);
            var tempIdentifier = SyntaxFactory.IdentifierName(tempName);
            var tuple          = new Tuple <ExpressionSyntax, IdentifierNameSyntax, SyntaxNode>(node, tempIdentifier, tempVar);
            var parent         = GetParentExpression(node);

            markedNodes.Add(parent);
            replacementNodes.Add(tuple);
            bottomUp++;
            return(node);
        }