/// <summary> /// Normalizes the <paramref name="argument" />. /// </summary> public override SyntaxNode VisitArgument(ArgumentSyntax argument) { // Special case for array accesses, as Roslyn doesn't return a symbol for the argument if (argument.Parent.Parent is ElementAccessExpressionSyntax) { var arrayExpression = ((ElementAccessExpressionSyntax)argument.Parent.Parent).Expression; if (SemanticModel.GetTypeInfo(arrayExpression).Type.TypeKind == TypeKind.Array) return base.VisitArgument(argument); } var parameterSymbol = argument.GetParameterSymbol(SemanticModel); if (parameterSymbol.RefKind != RefKind.None) return base.VisitArgument(argument); var parameterType = DetermineType(parameterSymbol.Type); if (parameterType == ExpressionType.Other) return base.VisitArgument(argument); return argument.WithExpression(ReplaceImplicitConversion(parameterType, argument.Expression)); }
/// <summary> /// Normalizes the <paramref name="argument" />. /// </summary> public override SyntaxNode VisitArgument(ArgumentSyntax argument) { // Special case for array accesses, as Roslyn doesn't return a symbol for the argument if (argument.Parent.Parent is ElementAccessExpressionSyntax) { var arrayExpression = ((ElementAccessExpressionSyntax)argument.Parent.Parent).Expression; var kind = SemanticModel.GetTypeInfo(arrayExpression).Type.TypeKind; if (kind == TypeKind.Array || kind == TypeKind.Pointer) return base.VisitArgument(argument); } var parameterSymbol = argument.GetParameterSymbol(SemanticModel); if (parameterSymbol.RefKind != RefKind.None) return base.VisitArgument(argument); var arraySymbol = parameterSymbol.Type as IArrayTypeSymbol; var isParamsFormula = arraySymbol != null && parameterSymbol.IsParams && IsFormulaType(arraySymbol.ElementType); if (!isParamsFormula && !IsFormulaType(parameterSymbol.Type)) return base.VisitArgument(argument); return argument.WithExpression(ReplaceImplicitConversion(argument.Expression)); }