コード例 #1
0
        private IEnumerable <Instruction> ProcessElementAccess(ElementAccessExpressionSyntax elementAccessSyntax)
        {
            if (elementAccessSyntax.GetFirstNonParenthesizedParent() is AssignmentExpressionSyntax assignmentSyntax &&
                assignmentSyntax.IsKind(SyntaxKind.SimpleAssignmentExpression) &&
                assignmentSyntax.Left.RemoveParentheses() == elementAccessSyntax)
            {
                return(NoInstructions);
            }

            var elementAccessType = this.semanticModel.GetTypeInfo(elementAccessSyntax.Expression).ConvertedType;

            if (elementAccessType == null)
            {
                return(NoInstructions);
            }

            if (elementAccessType.TypeKind == TypeKind.Array)
            {
                return(BuildArrayGetCall(elementAccessSyntax, elementAccessType));
            }

            if (!(GetNodeSymbol(elementAccessSyntax) is IPropertySymbol indexerPropertySymbol))
            {
                return(NoInstructions);
            }


            var instructions = new List <Instruction>();
            var expressions  = GetInvocationExpressions(indexerPropertySymbol.Parameters, elementAccessSyntax.ArgumentList,
                                                        instructions);

            instructions.AddRange(BuildFunctionCall(elementAccessSyntax, indexerPropertySymbol.GetMethod,
                                                    GetTargetExpression(elementAccessSyntax, indexerPropertySymbol), expressions));

            return(instructions);
        }
コード例 #2
0
 private static bool IsDictionarySetItem(ElementAccessExpressionSyntax elementAccess) =>
 (elementAccess.GetFirstNonParenthesizedParent() as AssignmentExpressionSyntax)
 ?.Left.RemoveParentheses() == elementAccess;