public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node)
        {
            bool skip =
                (node.Parent.Kind == SyntaxKind.PageField) &&
                (((PageFieldSyntax)node.Parent).Name == node);

            if (!skip)
            {
                IOperation operation = this.SemanticModel.GetOperation(node);
                if (operation != null)
                {
                    IOperation operationInstance = this.GetOperationInstance(operation);

                    if ((operationInstance != null) &&
                        (operationInstance.Syntax != null))
                    {
                        //part of with?
                        if ((operationInstance.Syntax.Parent != null) &&
                            (operationInstance.Syntax.Parent.Kind == SyntaxKind.WithStatement))
                        {
                            return(SyntaxFactory.MemberAccessExpression(
                                       (CodeExpressionSyntax)operationInstance.Syntax.WithoutTrivia(),
                                       node.WithoutTrivia()).WithTriviaFrom(node));
                        }

                        //global variable reference?
                        else if ((operationInstance.Kind == OperationKind.GlobalReferenceExpression) &&
                                 (node.Parent.Kind != SyntaxKind.MemberAccessExpression))
                        {
                            IGlobalReferenceExpression globalRef = (IGlobalReferenceExpression)operationInstance;
                            string name = globalRef.GlobalVariable.Name.ToString();

                            return(SyntaxFactory.MemberAccessExpression(
                                       SyntaxFactory.IdentifierName(name),
                                       node.WithoutTrivia()).WithTriviaFrom(node));
                        }
                    }
                }
            }

            return(base.VisitIdentifierName(node));
        }
Пример #2
0
        public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node)
        {
            bool skip =
                (node.Parent.Kind.ConvertToLocalType() == ConvertedSyntaxKind.PageField) &&
                (((PageFieldSyntax)node.Parent).Name == node);

            //check if it is field access parameter that should not have record variable name at the fromt
            //i.e. Rec.Setrange(FieldName, ...);
            if (node.Parent.Kind == SyntaxKind.ArgumentList)
            {
                //get parameter index
                ArgumentListSyntax argumentList = (ArgumentListSyntax)node.Parent;
                if (argumentList.Arguments.Contains(node))
                {
                    int        parameterIndex  = argumentList.Arguments.IndexOf(node);
                    IOperation methodOperation = this.SemanticModel.GetOperation(argumentList.Parent);
                    if ((methodOperation != null) && (methodOperation.Kind == OperationKind.InvocationExpression))
                    {
                        IInvocationExpression invocationExpression = methodOperation as IInvocationExpression;
                        if ((invocationExpression.TargetMethod != null) && (invocationExpression.TargetMethod.Parameters.Length > parameterIndex))
                        {
                            IParameterSymbol parameter = invocationExpression.TargetMethod.Parameters[parameterIndex];
                            if (parameter.MemberMustBeOnSame)
                            {
                                skip = true;
                            }
                        }
                    }
                }
            }

            if (!skip)
            {
                IOperation operation = this.SemanticModel.GetOperation(node);
                if (operation != null)
                {
                    IOperation operationInstance = this.GetOperationInstance(operation);

                    if ((operationInstance != null) &&
                        (operationInstance.Syntax != null))
                    {
                        //part of with?
                        if ((operationInstance.Syntax.Parent != null) &&
                            (operationInstance.Syntax.Parent.Kind.ConvertToLocalType() == ConvertedSyntaxKind.WithStatement))
                        {
                            return(SyntaxFactory.MemberAccessExpression(
                                       (CodeExpressionSyntax)operationInstance.Syntax.WithoutTrivia(),
                                       node.WithoutTrivia()).WithTriviaFrom(node));
                        }

                        //global variable reference?
                        else if ((operationInstance.Kind.ConvertToLocalType() == ConvertedOperationKind.GlobalReferenceExpression) &&
                                 (node.Parent.Kind.ConvertToLocalType() != ConvertedSyntaxKind.MemberAccessExpression))
                        {
                            IGlobalReferenceExpression globalRef = (IGlobalReferenceExpression)operationInstance;
                            string name = globalRef.GlobalVariable.Name.ToString();

                            return(SyntaxFactory.MemberAccessExpression(
                                       SyntaxFactory.IdentifierName(name),
                                       node.WithoutTrivia()).WithTriviaFrom(node));
                        }
                    }
                }
            }

            return(base.VisitIdentifierName(node));
        }