Beispiel #1
0
        /// <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)));
        }
Beispiel #2
0
        public static bool IsOfType([NotNull] this ArgumentSyntax argument, [NotNull] SemanticModel semanticModel,
                                    [NotNull] ITypeSymbol argumentType)
        {
            Requires.NotNull(argument, nameof(argument));
            Requires.NotNull(semanticModel, nameof(semanticModel));
            Requires.NotNull(argumentType, nameof(argumentType));

            return(Equals(argument.GetParameterSymbol(semanticModel).Type, argumentType));
        }
Beispiel #3
0
        public static bool HasAttribute <T>([NotNull] this ArgumentSyntax argument, [NotNull] SemanticModel semanticModel)
            where T : Attribute
        {
            Requires.NotNull(argument, nameof(argument));
            Requires.NotNull(semanticModel, nameof(semanticModel));

            var parameterSymbol = argument.GetParameterSymbol(semanticModel);

            return(parameterSymbol.HasAttribute <T>(semanticModel));
        }
Beispiel #4
0
        public static bool IsOfType <T>([NotNull] this ArgumentSyntax argument, [NotNull] SemanticModel semanticModel)
        {
            Requires.NotNull(argument, nameof(argument));
            Requires.NotNull(semanticModel, nameof(semanticModel));

            var typeSymbol = semanticModel.GetTypeSymbol <T>();

            Requires.That(typeSymbol != null, "Unable to determine type symbol of type '{0}'.", typeof(T).FullName);

            return(Equals(argument.GetParameterSymbol(semanticModel).Type, typeSymbol));
        }