コード例 #1
0
        public static IParameterSymbol DetermineParameter(
            AttributeArgumentSyntax attributeArgument,
            SemanticModel semanticModel,
            bool allowParams    = false,
            bool allowCandidate = false,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (attributeArgument == null)
            {
                throw new ArgumentNullException(nameof(attributeArgument));
            }

            if (semanticModel == null)
            {
                throw new ArgumentNullException(nameof(semanticModel));
            }

            if (attributeArgument.NameEquals != null)
            {
                return(null);
            }

            if (!attributeArgument.IsParentKind(SyntaxKind.AttributeArgumentList))
            {
                return(null);
            }

            var argumentList = (AttributeArgumentListSyntax)attributeArgument.Parent;

            if (!argumentList.IsParentKind(SyntaxKind.Attribute))
            {
                return(null);
            }

            var attribute = (AttributeSyntax)attributeArgument.Parent.Parent;

            SymbolInfo symbolInfo = semanticModel.GetSymbolInfo(attribute, cancellationToken);

            ISymbol symbol = symbolInfo.Symbol;

            if (symbol == null &&
                allowCandidate &&
                symbolInfo.CandidateSymbols.Length > 0)
            {
                symbol = symbolInfo.CandidateSymbols[0];
            }

            if (symbol == null)
            {
                return(null);
            }

            ImmutableArray <IParameterSymbol> parameters = symbol.GetParameters();

            if (attributeArgument.NameColon != null && !attributeArgument.NameColon.IsMissing)
            {
                string name = attributeArgument.NameColon.Name.Identifier.ValueText;

                return(parameters.FirstOrDefault(p => p.Name == name));
            }

            int index = argumentList.Arguments.IndexOf(attributeArgument);

            if (index < 0)
            {
                return(null);
            }

            if (index < parameters.Length)
            {
                return(parameters[index]);
            }

            if (allowParams)
            {
                IParameterSymbol lastParameter = parameters.LastOrDefault();

                if (lastParameter == null)
                {
                    return(null);
                }

                if (lastParameter.IsParams)
                {
                    return(lastParameter);
                }
            }

            return(null);
        }